@clickview/ship-it 0.0.48 → 0.0.49

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.
@@ -0,0 +1,10 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(grep -r release /Users/varun.singh/Desktop/cv-projects/ship-it --include=*.ts --include=*.js)",
5
+ "Bash(ls /Users/varun.singh/Desktop/cv-projects/ship-it/config*)",
6
+ "Bash(ls /Users/varun.singh/Desktop/cv-projects/ship-it/*.json)",
7
+ "Bash(grep -E \"^\\(axios|node-fetch|got|undici\\)$\")"
8
+ ]
9
+ }
10
+ }
@@ -0,0 +1,57 @@
1
+ projectName,mrTitle,mrAuthor,mrAssignee,mrUrl,notes
2
+ clickview,Lite: Fix classroom avatars in the insights heatmap,Shale Kuzmanovski,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6273,"# Lite
3
+ - Fix classroom avatars in the insights heatmap. Partially addresses INBOX-11438."
4
+ clickview,Player: Fix missing qualities,Shale Kuzmanovski,Cameron Hill,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6271,"# Player
5
+ - Fixed a bug that was preventing the last quality level from showing. Fixes TEST-357."
6
+ clickview,Lite - Temporary use hardcoded presentation cover,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6262,"# Lite
7
+ - Update cover for US High presentation to use photo-style cover when the customer has the preferred theme set to be `photo`.
8
+ - ![Screenshot_2026-04-29_at_3.31.50_PM](/uploads/4811491aea5423b3ae1528ee8d81a759/Screenshot_2026-04-29_at_3.31.50_PM.png)
9
+ - ![image](/uploads/8ef383f6aebef326f323a2fc4fa1c630/image.png)"
10
+ clickview,Curator: Displays presentation last updated information,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6258,"# Curator
11
+ * Displays the last updated time for presentations in the list view, providing users with a clear indicator of a presentation's freshness. Hovering over the time will show the exact date. Implements CC-1351."
12
+ clickview,Fix - Update video status OGQL when fetching playlist,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6256,"# Lite
13
+ * Fix an issue when the count on the playlist tile on `/playlists` does not match the number of videos on the playlist page. Fixes INBOX-11120"
14
+ clickview,Lite: Search - Fixes search-in tags flakey visibility,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6244,"# Lite
15
+ * Users will experience more reliable display of the ""Search in X"" tag when navigating to scoped search results, preventing instances where the tag might incorrectly disappear."
16
+ clickview,Curator - Support remove video banner for a content partner,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6240,"# Curator
17
+ - Now you can remove the video banner for a content partner. And the Replace video button icon is replaced with an upload icon.
18
+ - ![ScreenRecording2026-04-22at3.56.26PM-ezgif.com-video-to-gif-converter](/uploads/5ac25bebeed4639d5c34e593c90bad25/ScreenRecording2026-04-22at3.56.26PM-ezgif.com-video-to-gif-converter.gif)"
19
+ clickview,Curator: Channels - Videos view,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6238,"# Curator
20
+ * Add a tab in manage channels where users can view all videos for that channel. Implements CC-1358.
21
+ * Ability to add new videos to the channel
22
+ * Ability to delete video(s) in the channel"
23
+ clickview,Lite: Tutorial Videos,Vincent Sit,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6237,"# Lite
24
+ This change should only be visible to users who are new to ClickView (accounts created less than 14 days ago). They will see an additional bar in the dashboard page that features a series of tutorial videos from ClickView. Implements LTE-3240
25
+ Before: ![image](/uploads/d1def3f01d43d9296f45f423d2985db2/image.png)
26
+ After: ↵ ↵ ![image.png](/uploads/6e392e736c60d26a59aaa953e03b68ef/image.png)
27
+ The user can dismiss the tutorial video panel through the 'Hide' text button on the top right hand corner. Otherwise, once 14 days have lapsed since account creation, the panel will not be displayed."
28
+ clickview,Shared - Fix visible svg icon id collision issue,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6229,"# Curator
29
+ - Fixed the visible-on and visible-off icons are not being shown correctly. Fixes INBOX-11338"
30
+ clickview,Lite - Fix playlist member count not matching issue,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6228,"# Lite
31
+ - Fix an issue when the count on the playlist tile on `/playlists` does not match the number of videos on the playlist page. Fixes INBOX-11120"
32
+ clickview,Improve the names generated from the anonymise name function,Cameron Hill,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6227,"# Shared
33
+ - Improve the names used for ""anonymise names"". Closes INBOX-10122"
34
+ clickview,Player - Extend volume slider hit area to cover the full hover zone,Nan Chen,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6226,"# Player
35
+ - Increase the hit area for the player volume bar."
36
+ clickview,Lite: aligns classroom staff role pill design,Nischal Shrestha,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6224,"# Lite
37
+ * Updates the visual design of the ""Admin"" and ""Owner"" role pills displayed next to teacher names in the classroom management view. Fixes INBOX-9615.
38
+ | Before | After |
39
+ |--------|-------|
40
+ | ![image.png](/uploads/22e2f2dac34fc34d5b5d1188b5ee303a/image.png){width=1113 height=368} | ![image.png](/uploads/d4da6b2e47cbcf734168043b59001b19/image.png){width=1142 height=367} |"
41
+ clickview,Lite - Add theme setting,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6219,"# Lite
42
+ - Added new Appearance setting for admin and it's only for customer who has US high presentation.
43
+ - ![Screenshot 2026-04-15 at 3.49.28 PM.png](/uploads/e4b66779feb57ad252fcdc59de0710b8/Screenshot_2026-04-15_at_3.49.28_PM.png)
44
+ - Admin can toggle theme for topic assets in the Appearance setting page:
45
+ - ![Screenshot_2026-04-15_at_10.31.20_AM](/uploads/d677edda97011e72a2cb61b0b8f08900/Screenshot_2026-04-15_at_10.31.20_AM.png)"
46
+ clickview,Curator: Channels - Enables delete for read-only 'all videos' widget,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6218,"# Curator
47
+ * Users can now delete specific read-only widgets, such as 'all videos' widgets in channels, from their dashboards. Implements CC-1357."
48
+ clickview,Crm studio - IDP form update,Nan Chen,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6216,"# Curator
49
+ - Now in the IDP details section in the create IDP form, only the IDP name is required:
50
+ - ![image](/uploads/6f6b63caa5359e3be5d01cc3cd85352a/image.png)
51
+ - Removed the default value for the displayed name for Microsoft.
52
+ - ![image](/uploads/d17c0eee9dbcee01ae8c3cb47616fd6e/image.png)"
53
+ clickview,Lite - Fix player is rendered in hover mode on play page,Nan Chen,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6214,"# Lite
54
+ * Fixes an issue when hovering on a pop-up video to preview the video, then clicking on the title in the pop-up card to go to the video play page. The play page is showing a non-interactive player. (no control bar)."
55
+ clickview,Lite: Channels - Enables parent editing for channels,Nischal Shrestha,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/6211,"# Curator
56
+ * Users can now update the parent of an existing content partner, as the selection field is no longer disabled during the editing process. Implements CC-1356."
57
+ Master.Auth,Legacy saml check fixes,Cameron Hill,Kevin Wellalagodage,https://gitlab.cvinternal.net/clickview/back-end/Master.Auth/-/merge_requests/842,- Fix some SSO setups redirecting to the wrong SAML IDP on login. Fixes INBOX-11324
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __generator = (this && this.__generator) || function (thisArg, body) {
24
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
25
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
+ function verb(n) { return function (v) { return step([n, v]); }; }
27
+ function step(op) {
28
+ if (f) throw new TypeError("Generator is already executing.");
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
31
+ if (y = 0, t) op = [op[0] & 2, t.value];
32
+ switch (op[0]) {
33
+ case 0: case 1: t = op; break;
34
+ case 4: _.label++; return { value: op[1], done: false };
35
+ case 5: _.label++; y = op[1]; op = [0]; continue;
36
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
37
+ default:
38
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
39
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
40
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
42
+ if (t[2]) _.ops.pop();
43
+ _.trys.pop(); continue;
44
+ }
45
+ op = body.call(thisArg, _);
46
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
47
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
+ }
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.JiraApiClient = void 0;
52
+ require("reflect-metadata");
53
+ var inversify_1 = require("inversify");
54
+ var jira_js_1 = require("jira.js");
55
+ var types_1 = require("../../types");
56
+ var JiraApiClient = /** @class */ (function () {
57
+ function JiraApiClient(config) {
58
+ this.config = config;
59
+ this.client = new jira_js_1.Version3Client({
60
+ host: config.url,
61
+ authentication: {
62
+ basic: {
63
+ email: config.email,
64
+ apiToken: config.apiToken
65
+ }
66
+ }
67
+ });
68
+ }
69
+ JiraApiClient.prototype.searchIssues = function (jql) {
70
+ var _a;
71
+ return __awaiter(this, void 0, void 0, function () {
72
+ var result;
73
+ var _this = this;
74
+ return __generator(this, function (_b) {
75
+ switch (_b.label) {
76
+ case 0: return [4 /*yield*/, this.client.issueSearch.searchForIssuesUsingJqlEnhancedSearchPost({
77
+ jql: jql,
78
+ fields: ['summary', 'status', 'assignee'],
79
+ maxResults: 100
80
+ })];
81
+ case 1:
82
+ result = _b.sent();
83
+ return [2 /*return*/, ((_a = result.issues) !== null && _a !== void 0 ? _a : []).map(function (issue) {
84
+ var _a, _b, _c, _d, _e, _f;
85
+ return ({
86
+ key: issue.key,
87
+ summary: issue.fields.summary,
88
+ status: (_b = (_a = issue.fields.status) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'Unknown',
89
+ assigneeDisplayName: (_d = (_c = issue.fields.assignee) === null || _c === void 0 ? void 0 : _c.displayName) !== null && _d !== void 0 ? _d : null,
90
+ assigneeEmail: (_f = (_e = issue.fields.assignee) === null || _e === void 0 ? void 0 : _e.emailAddress) !== null && _f !== void 0 ? _f : null,
91
+ url: "".concat(_this.config.url, "/browse/").concat(issue.key)
92
+ });
93
+ })];
94
+ }
95
+ });
96
+ });
97
+ };
98
+ JiraApiClient = __decorate([
99
+ (0, inversify_1.injectable)(),
100
+ __param(0, (0, inversify_1.inject)(types_1.MISC.JiraConfig)),
101
+ __metadata("design:paramtypes", [Object])
102
+ ], JiraApiClient);
103
+ return JiraApiClient;
104
+ }());
105
+ exports.JiraApiClient = JiraApiClient;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __generator = (this && this.__generator) || function (thisArg, body) {
24
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
25
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
+ function verb(n) { return function (v) { return step([n, v]); }; }
27
+ function step(op) {
28
+ if (f) throw new TypeError("Generator is already executing.");
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
31
+ if (y = 0, t) op = [op[0] & 2, t.value];
32
+ switch (op[0]) {
33
+ case 0: case 1: t = op; break;
34
+ case 4: _.label++; return { value: op[1], done: false };
35
+ case 5: _.label++; y = op[1]; op = [0]; continue;
36
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
37
+ default:
38
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
39
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
40
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
42
+ if (t[2]) _.ops.pop();
43
+ _.trys.pop(); continue;
44
+ }
45
+ op = body.call(thisArg, _);
46
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
47
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
+ }
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.JiraTicketsStatusCommand = void 0;
52
+ require("reflect-metadata");
53
+ var inversify_1 = require("inversify");
54
+ var types_1 = require("../types");
55
+ var JiraTicketsStatusCommand = /** @class */ (function () {
56
+ function JiraTicketsStatusCommand(jiraTicketsStatusTask) {
57
+ this.jiraTicketsStatusTask = jiraTicketsStatusTask;
58
+ }
59
+ JiraTicketsStatusCommand.prototype.run = function (options) {
60
+ return __awaiter(this, void 0, void 0, function () {
61
+ return __generator(this, function (_a) {
62
+ return [2 /*return*/, this.jiraTicketsStatusTask.run(options)];
63
+ });
64
+ });
65
+ };
66
+ JiraTicketsStatusCommand = __decorate([
67
+ (0, inversify_1.injectable)(),
68
+ __param(0, (0, inversify_1.inject)(types_1.TASKS.JiraTicketsStatusTask)),
69
+ __metadata("design:paramtypes", [Object])
70
+ ], JiraTicketsStatusCommand);
71
+ return JiraTicketsStatusCommand;
72
+ }());
73
+ exports.JiraTicketsStatusCommand = JiraTicketsStatusCommand;
@@ -96,33 +96,35 @@ var ReleaseCommand = /** @class */ (function () {
96
96
  cont = _a.sent();
97
97
  if (!cont)
98
98
  return [2 /*return*/, false];
99
- return [4 /*yield*/, this.ensureApprovalRulesTask.run(options)];
99
+ return [4 /*yield*/, this.validateCommitsTask.run(options)];
100
100
  case 4:
101
- // cont = await this.validateCommitsTask.run(options);
102
- // if (!cont)
103
- // return false;
104
101
  cont = _a.sent();
105
102
  if (!cont)
106
103
  return [2 /*return*/, false];
107
- return [4 /*yield*/, this.createBranchTask.run(options)];
104
+ return [4 /*yield*/, this.ensureApprovalRulesTask.run(options)];
108
105
  case 5:
109
106
  cont = _a.sent();
110
107
  if (!cont)
111
108
  return [2 /*return*/, false];
112
- return [4 /*yield*/, this.bumpVersionTxtTask.run(options)];
109
+ return [4 /*yield*/, this.createBranchTask.run(options)];
113
110
  case 6:
114
111
  cont = _a.sent();
115
112
  if (!cont)
116
113
  return [2 /*return*/, false];
117
- return [4 /*yield*/, this.createMergeRequestTask.run(options)];
114
+ return [4 /*yield*/, this.bumpVersionTxtTask.run(options)];
118
115
  case 7:
116
+ cont = _a.sent();
117
+ if (!cont)
118
+ return [2 /*return*/, false];
119
+ return [4 /*yield*/, this.createMergeRequestTask.run(options)];
120
+ case 8:
119
121
  cont = _a.sent();
120
122
  if (!cont)
121
123
  return [2 /*return*/, false];
122
124
  if (!options.triggerMonorepoBuild)
123
125
  return [2 /*return*/, true];
124
126
  return [4 /*yield*/, this.startMonorepoBuildTask.run(options)];
125
- case 8: return [2 /*return*/, _a.sent()];
127
+ case 9: return [2 /*return*/, _a.sent()];
126
128
  }
127
129
  });
128
130
  });
@@ -9,5 +9,13 @@ exports.SLACK_USER_LIST = [
9
9
  {
10
10
  author: 'Kevin Wellalagodage',
11
11
  email: 'kevin.well@clickview.com.au'
12
+ },
13
+ {
14
+ author: 'Vincent Sit',
15
+ email: 'vincent.sit@clickvieweducation.com'
16
+ },
17
+ {
18
+ author: 'Alexander Deeb',
19
+ email: 'alexander.deeb@clickvieweducation.com'
12
20
  }
13
21
  ];
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.JiraService = void 0;
16
+ require("reflect-metadata");
17
+ var inversify_1 = require("inversify");
18
+ var types_1 = require("../types");
19
+ var api_clients_1 = require("../api-clients");
20
+ var JiraService = /** @class */ (function () {
21
+ function JiraService(apiClient) {
22
+ this.apiClient = apiClient;
23
+ }
24
+ JiraService.prototype.searchIssues = function (jql) {
25
+ return this.apiClient.searchIssues(jql);
26
+ };
27
+ JiraService = __decorate([
28
+ (0, inversify_1.injectable)(),
29
+ __param(0, (0, inversify_1.inject)(types_1.API_CLIENTS.JiraApiClient)),
30
+ __metadata("design:paramtypes", [api_clients_1.JiraApiClient])
31
+ ], JiraService);
32
+ return JiraService;
33
+ }());
34
+ exports.JiraService = JiraService;
@@ -56,138 +56,81 @@ var types_1 = require("../types");
56
56
  var services_1 = require("../services");
57
57
  var utils_1 = require("../utils");
58
58
  var CheckReleaseReadyTask = /** @class */ (function () {
59
- function CheckReleaseReadyTask(service, slackService, trelloService) {
59
+ function CheckReleaseReadyTask(service, slackService) {
60
60
  this.service = service;
61
61
  this.slackService = slackService;
62
- this.trelloService = trelloService;
63
62
  }
64
63
  CheckReleaseReadyTask.prototype.run = function (options) {
65
- var _a;
66
64
  return __awaiter(this, void 0, void 0, function () {
67
- var projects, deployDependenciesTasks, beforeReleaseTasks, afterReleaseTasks, sqlSections, _i, projects_1, project, branchName, mergeRequest, owner, deployDependencies, beforeTasks, afterTasks, beforeSQL, afterSQL, _b, deployDependenciesTasks_1, task, _c, beforeReleaseTasks_1, task, _d, afterReleaseTasks_1, task, _e, sqlSections_1, sql, milestoneLabel, deployDependenciesMessage, beforeTasksMessage, afterTasksMessage, sqlMessage, taskSummary;
68
- return __generator(this, function (_f) {
69
- switch (_f.label) {
65
+ var projects, deployDependenciesTasks, beforeReleaseTasks, afterReleaseTasks, sqlSections, _i, projects_1, project, branchName, mergeRequest, deployDependencies, beforeTasks, afterTasks, beforeSQL, afterSQL, milestoneLabel, taskSummary, sqlMessage;
66
+ return __generator(this, function (_a) {
67
+ switch (_a.label) {
70
68
  case 0:
71
69
  Logger_1.Logger.logTask('Checking status of the current release...');
72
70
  return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
73
71
  case 1:
74
- projects = _f.sent();
72
+ projects = _a.sent();
75
73
  deployDependenciesTasks = [];
76
74
  beforeReleaseTasks = [];
77
75
  afterReleaseTasks = [];
78
76
  sqlSections = [];
79
77
  _i = 0, projects_1 = projects;
80
- _f.label = 2;
78
+ _a.label = 2;
81
79
  case 2:
82
- if (!(_i < projects_1.length)) return [3 /*break*/, 7];
80
+ if (!(_i < projects_1.length)) return [3 /*break*/, 6];
83
81
  project = projects_1[_i];
84
82
  return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
85
83
  case 3:
86
- branchName = (_f.sent()).branchName;
84
+ branchName = (_a.sent()).branchName;
87
85
  return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
88
86
  case 4:
89
- mergeRequest = _f.sent();
87
+ mergeRequest = _a.sent();
90
88
  if (!mergeRequest)
91
- return [3 /*break*/, 6];
92
- return [4 /*yield*/, this.trelloService.getMember(mergeRequest.url)];
93
- case 5:
94
- owner = (_a = _f.sent()) !== null && _a !== void 0 ? _a : 'Unknown';
89
+ throw new Error("No release MR found for project ".concat(project.title, " on branch ").concat(branchName));
95
90
  deployDependencies = utils_1.Descriptions.getDescriptionSection('Dependencies', mergeRequest);
96
- beforeTasks = utils_1.Descriptions.getDescriptionSubSection('BeforeRelease', 'Tasks', mergeRequest);
97
- afterTasks = utils_1.Descriptions.getDescriptionSubSection('AfterRelease', 'Tasks', mergeRequest);
98
- beforeSQL = utils_1.Descriptions.getDescriptionSubSection('BeforeRelease', 'SQL', mergeRequest);
99
- afterSQL = utils_1.Descriptions.getDescriptionSubSection('AfterRelease', 'SQL', mergeRequest);
100
- if (deployDependencies) {
101
- deployDependenciesTasks.push({
102
- project: project.title,
103
- mr: mergeRequest.title,
104
- content: deployDependencies,
105
- owner: owner
106
- });
107
- }
108
- if (beforeTasks) {
109
- beforeReleaseTasks.push({
110
- project: project.title,
111
- mr: mergeRequest.title,
112
- content: beforeTasks,
113
- owner: owner
114
- });
115
- }
116
- if (afterTasks) {
117
- afterReleaseTasks.push({
118
- project: project.title,
119
- mr: mergeRequest.title,
120
- content: afterTasks,
121
- owner: owner
122
- });
123
- }
124
- if (beforeSQL) {
125
- sqlSections.push({
126
- project: project.title,
127
- mr: mergeRequest.title,
128
- content: beforeSQL,
129
- phase: 'BeforeRelease',
130
- owner: owner
131
- });
132
- }
133
- if (afterSQL) {
134
- sqlSections.push({
135
- project: project.title,
136
- mr: mergeRequest.title,
137
- content: afterSQL,
138
- phase: 'AfterRelease',
139
- owner: owner
140
- });
141
- }
142
- _f.label = 6;
143
- case 6:
91
+ beforeTasks = utils_1.Descriptions.getDescriptionSection('BeforeRelease', mergeRequest, 'Tasks');
92
+ afterTasks = utils_1.Descriptions.getDescriptionSection('AfterRelease', mergeRequest, 'Tasks');
93
+ beforeSQL = utils_1.Descriptions.getDescriptionSection('BeforeRelease', mergeRequest, 'SQL');
94
+ afterSQL = utils_1.Descriptions.getDescriptionSection('AfterRelease', mergeRequest, 'SQL');
95
+ if (deployDependencies)
96
+ deployDependenciesTasks.push({ project: project.title, mr: mergeRequest.title, content: deployDependencies });
97
+ if (beforeTasks)
98
+ beforeReleaseTasks.push({ project: project.title, mr: mergeRequest.title, content: beforeTasks });
99
+ if (afterTasks)
100
+ afterReleaseTasks.push({ project: project.title, mr: mergeRequest.title, content: afterTasks });
101
+ if (beforeSQL)
102
+ sqlSections.push({ project: project.title, mr: mergeRequest.title, content: beforeSQL, phase: 'BeforeRelease' });
103
+ if (afterSQL)
104
+ sqlSections.push({ project: project.title, mr: mergeRequest.title, content: afterSQL, phase: 'AfterRelease' });
105
+ _a.label = 5;
106
+ case 5:
144
107
  _i++;
145
108
  return [3 /*break*/, 2];
146
- case 7:
147
- // PRINTING TIME
148
- Logger_1.Logger.logInfo('====== ALL DEPLOY DEPENDENCIES ======');
149
- for (_b = 0, deployDependenciesTasks_1 = deployDependenciesTasks; _b < deployDependenciesTasks_1.length; _b++) {
150
- task = deployDependenciesTasks_1[_b];
151
- Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
152
- Logger_1.Logger.logMessage(task.content);
153
- }
154
- Logger_1.Logger.logInfo('====== ALL BEFORE RELEASE TASKS ======');
155
- for (_c = 0, beforeReleaseTasks_1 = beforeReleaseTasks; _c < beforeReleaseTasks_1.length; _c++) {
156
- task = beforeReleaseTasks_1[_c];
157
- Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
158
- Logger_1.Logger.logMessage(task.content);
159
- }
160
- Logger_1.Logger.logInfo('====== ALL AFTER RELEASE TASKS ======');
161
- for (_d = 0, afterReleaseTasks_1 = afterReleaseTasks; _d < afterReleaseTasks_1.length; _d++) {
162
- task = afterReleaseTasks_1[_d];
163
- Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(task.project, " | ").concat(task.mr, " | \uD83D\uDC64 ").concat(task.owner));
164
- Logger_1.Logger.logMessage(task.content);
165
- }
166
- Logger_1.Logger.logInfo('====== ALL SQL CHANGES (with context) ======');
167
- for (_e = 0, sqlSections_1 = sqlSections; _e < sqlSections_1.length; _e++) {
168
- sql = sqlSections_1[_e];
169
- Logger_1.Logger.logMessage("\uD83E\uDDFE ".concat(sql.project, " | ").concat(sql.mr, " (").concat(sql.phase === 'BeforeRelease' ? 'Before Release' : 'After Release', ") | \uD83D\uDC64 ").concat(sql.owner));
170
- Logger_1.Logger.logMessage(sql.content);
171
- }
172
- if (!options.slackNotifier) return [3 /*break*/, 11];
109
+ case 6:
110
+ this.logSection('====== ALL DEPLOY DEPENDENCIES ======', deployDependenciesTasks);
111
+ this.logSection('====== ALL BEFORE RELEASE TASKS ======', beforeReleaseTasks);
112
+ this.logSection('====== ALL AFTER RELEASE TASKS ======', afterReleaseTasks);
113
+ this.logSection('====== ALL SQL CHANGES (with context) ======', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
114
+ if (!options.slackNotifier) return [3 /*break*/, 10];
173
115
  milestoneLabel = "".concat(options.milestone, " Release");
174
- deployDependenciesMessage = this.formatTaskSection('Deploy Dependencies', deployDependenciesTasks);
175
- beforeTasksMessage = this.formatTaskSection('Before Release Tasks', beforeReleaseTasks);
176
- afterTasksMessage = this.formatTaskSection('After Release Tasks', afterReleaseTasks);
177
- sqlMessage = this.formatSQLSection(sqlSections);
178
- taskSummary = [deployDependenciesMessage, beforeTasksMessage, afterTasksMessage].filter(Boolean).join('\n');
179
- if (!taskSummary) return [3 /*break*/, 9];
116
+ taskSummary = [
117
+ this.formatSection('Deploy Dependencies', deployDependenciesTasks),
118
+ this.formatSection('Before Release Tasks', beforeReleaseTasks),
119
+ this.formatSection('After Release Tasks', afterReleaseTasks)
120
+ ].filter(Boolean).join('\n');
121
+ if (!taskSummary) return [3 /*break*/, 8];
180
122
  return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
181
123
  emailList: [],
182
124
  threadLabel: "".concat(milestoneLabel, " Tasks & Dependencies"),
183
125
  statusMessage: taskSummary,
184
126
  statusCleanMessage: 'No Before/After Release Tasks found!'
185
127
  })];
128
+ case 7:
129
+ _a.sent();
130
+ _a.label = 8;
186
131
  case 8:
187
- _f.sent();
188
- _f.label = 9;
189
- case 9:
190
- if (!sqlMessage) return [3 /*break*/, 11];
132
+ sqlMessage = this.formatSection('SQL Changes', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
133
+ if (!sqlMessage) return [3 /*break*/, 10];
191
134
  return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
192
135
  emailList: [],
193
136
  threadLabel: "".concat(milestoneLabel, " SQL"),
@@ -195,35 +138,31 @@ var CheckReleaseReadyTask = /** @class */ (function () {
195
138
  statusCleanMessage: 'No SQL changes found in release!',
196
139
  sendAsFile: true
197
140
  })];
198
- case 10:
199
- _f.sent();
200
- _f.label = 11;
201
- case 11: return [2 /*return*/, true];
141
+ case 9:
142
+ _a.sent();
143
+ _a.label = 10;
144
+ case 10: return [2 /*return*/, true];
202
145
  }
203
146
  });
204
147
  });
205
148
  };
206
- CheckReleaseReadyTask.prototype.formatTaskSection = function (title, items) {
207
- if (items.length === 0)
208
- return 'No tasks found!';
209
- var output = "## ".concat(title, "\n\n");
149
+ CheckReleaseReadyTask.prototype.logSection = function (header, items, getPhaseLabel) {
150
+ Logger_1.Logger.logInfo(header);
210
151
  for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
211
152
  var item = items_1[_i];
212
- output += "### ".concat(item.project, " \u2013 ").concat(item.mr, "\n");
213
- output += "**Owner:** ".concat(item.owner, "\n\n");
214
- output += "".concat(item.content.trim(), "\n");
153
+ var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
154
+ Logger_1.Logger.logMessage("\uD83D\uDD39 ".concat(item.project, " | ").concat(item.mr).concat(phase));
155
+ Logger_1.Logger.logMessage(item.content);
215
156
  }
216
- return output;
217
157
  };
218
- CheckReleaseReadyTask.prototype.formatSQLSection = function (items) {
158
+ CheckReleaseReadyTask.prototype.formatSection = function (title, items, getPhaseLabel) {
219
159
  if (items.length === 0)
220
- return 'No SQL found!';
221
- var output = "## SQL Changes\n\n";
160
+ return '';
161
+ var output = "## ".concat(title, "\n\n");
222
162
  for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
223
163
  var item = items_2[_i];
224
- var phaseLabel = item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release';
225
- output += "### ".concat(item.project, " \u2013 ").concat(item.mr, " (").concat(phaseLabel, ")\n");
226
- output += "**Owner:** ".concat(item.owner, "\n\n");
164
+ var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
165
+ output += "### ".concat(item.project, " \u2013 ").concat(item.mr).concat(phase, "\n");
227
166
  output += "".concat(item.content.trim(), "\n");
228
167
  }
229
168
  return output;
@@ -232,10 +171,8 @@ var CheckReleaseReadyTask = /** @class */ (function () {
232
171
  (0, inversify_1.injectable)(),
233
172
  __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
234
173
  __param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
235
- __param(2, (0, inversify_1.inject)(types_1.SERVICES.TrelloService)),
236
174
  __metadata("design:paramtypes", [services_1.GitLabService,
237
- services_1.SlackService,
238
- services_1.TrelloService])
175
+ services_1.SlackService])
239
176
  ], CheckReleaseReadyTask);
240
177
  return CheckReleaseReadyTask;
241
178
  }());
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __generator = (this && this.__generator) || function (thisArg, body) {
24
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
25
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
+ function verb(n) { return function (v) { return step([n, v]); }; }
27
+ function step(op) {
28
+ if (f) throw new TypeError("Generator is already executing.");
29
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
30
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
31
+ if (y = 0, t) op = [op[0] & 2, t.value];
32
+ switch (op[0]) {
33
+ case 0: case 1: t = op; break;
34
+ case 4: _.label++; return { value: op[1], done: false };
35
+ case 5: _.label++; y = op[1]; op = [0]; continue;
36
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
37
+ default:
38
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
39
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
40
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
41
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
42
+ if (t[2]) _.ops.pop();
43
+ _.trys.pop(); continue;
44
+ }
45
+ op = body.call(thisArg, _);
46
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
47
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
+ }
49
+ };
50
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
51
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
52
+ if (ar || !(i in from)) {
53
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
54
+ ar[i] = from[i];
55
+ }
56
+ }
57
+ return to.concat(ar || Array.prototype.slice.call(from));
58
+ };
59
+ var __importDefault = (this && this.__importDefault) || function (mod) {
60
+ return (mod && mod.__esModule) ? mod : { "default": mod };
61
+ };
62
+ Object.defineProperty(exports, "__esModule", { value: true });
63
+ exports.JiraTicketsStatusTask = void 0;
64
+ require("reflect-metadata");
65
+ var inversify_1 = require("inversify");
66
+ var lodash_1 = __importDefault(require("lodash"));
67
+ var services_1 = require("../services");
68
+ var utils_1 = require("../utils");
69
+ var types_1 = require("../types");
70
+ var IN_PROGRESS_STATUSES = [
71
+ 'To Do', 'Re-Triage', 'Reopened', 'Decision Needed', 'Open',
72
+ 'Backlog', 'On Hold', 'In Progress', 'Merge Requested', 'Linked'
73
+ ];
74
+ var DEV_TESTING_STATUSES = __spreadArray(__spreadArray([], IN_PROGRESS_STATUSES, true), [
75
+ 'Awaiting Testing'
76
+ ], false);
77
+ var JiraTicketsStatusTask = /** @class */ (function () {
78
+ function JiraTicketsStatusTask(jiraService, slackService) {
79
+ this.jiraService = jiraService;
80
+ this.slackService = slackService;
81
+ }
82
+ JiraTicketsStatusTask.prototype.run = function (options) {
83
+ return __awaiter(this, void 0, void 0, function () {
84
+ var milestone, slackNotifier, statusList, devTestingStatusList;
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ utils_1.Logger.logTask('Fetching Jira ticket status');
89
+ milestone = options.milestone, slackNotifier = options.slackNotifier;
90
+ statusList = IN_PROGRESS_STATUSES.map(function (s) { return "\"".concat(s, "\""); }).join(', ');
91
+ devTestingStatusList = DEV_TESTING_STATUSES.map(function (s) { return "\"".concat(s, "\""); }).join(', ');
92
+ return [4 /*yield*/, this.processTicketGroup({
93
+ label: "".concat(milestone, " To Do and In Progress Tickets"),
94
+ cleanMessage: 'No outstanding tickets!',
95
+ jql: "\"Release\" = \"".concat(milestone, "\" AND status IN (").concat(statusList, ") ORDER BY assignee ASC"),
96
+ slackNotifier: slackNotifier
97
+ })];
98
+ case 1:
99
+ _a.sent();
100
+ return [4 /*yield*/, this.processTicketGroup({
101
+ label: "".concat(milestone, " No Requires Testing Tickets"),
102
+ cleanMessage: 'All tickets have testing status set!',
103
+ jql: "\"Release\" = \"".concat(milestone, "\" AND \"Requires Testing[Radio Buttons]\" = EMPTY ORDER BY assignee ASC"),
104
+ slackNotifier: slackNotifier
105
+ })];
106
+ case 2:
107
+ _a.sent();
108
+ return [4 /*yield*/, this.processTicketGroup({
109
+ label: "".concat(milestone, " Requires Dev Testing Tickets"),
110
+ cleanMessage: 'No dev testing tickets outstanding!',
111
+ jql: "\"Release\" = \"".concat(milestone, "\" AND \"Requires Testing[Radio Buttons]\" = \"Yes - Dev\" AND status IN (").concat(devTestingStatusList, ") ORDER BY assignee ASC"),
112
+ slackNotifier: slackNotifier
113
+ })];
114
+ case 3:
115
+ _a.sent();
116
+ return [2 /*return*/, true];
117
+ }
118
+ });
119
+ });
120
+ };
121
+ JiraTicketsStatusTask.prototype.processTicketGroup = function (options) {
122
+ return __awaiter(this, void 0, void 0, function () {
123
+ var label, cleanMessage, jql, slackNotifier, issues, _a, message, emailList;
124
+ return __generator(this, function (_b) {
125
+ switch (_b.label) {
126
+ case 0:
127
+ label = options.label, cleanMessage = options.cleanMessage, jql = options.jql, slackNotifier = options.slackNotifier;
128
+ utils_1.Logger.logMessage("\n".concat(label));
129
+ return [4 /*yield*/, this.jiraService.searchIssues(jql)];
130
+ case 1:
131
+ issues = _b.sent();
132
+ _a = this.buildMessage(issues), message = _a.message, emailList = _a.emailList;
133
+ if (!issues.length) {
134
+ utils_1.Logger.logSuccess(cleanMessage);
135
+ }
136
+ if (!slackNotifier)
137
+ return [2 /*return*/];
138
+ return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
139
+ emailList: emailList,
140
+ threadLabel: label,
141
+ statusMessage: message,
142
+ statusCleanMessage: cleanMessage
143
+ })];
144
+ case 2:
145
+ _b.sent();
146
+ return [2 /*return*/];
147
+ }
148
+ });
149
+ });
150
+ };
151
+ JiraTicketsStatusTask.prototype.buildMessage = function (issues) {
152
+ var grouped = lodash_1.default.groupBy(issues, function (issue) { var _a; return (_a = issue.assigneeDisplayName) !== null && _a !== void 0 ? _a : 'Unassigned'; });
153
+ var emailList = [];
154
+ var message = '';
155
+ for (var assignee in grouped) {
156
+ if (assignee !== 'Unassigned') {
157
+ var email = this.slackService.convertToEmailFormat(assignee);
158
+ if (email)
159
+ emailList.push(email);
160
+ }
161
+ utils_1.Logger.logMessage(assignee);
162
+ message += "".concat(assignee, ":\n");
163
+ for (var _i = 0, _a = grouped[assignee]; _i < _a.length; _i++) {
164
+ var issue = _a[_i];
165
+ utils_1.Logger.logMessage("- ".concat(issue.key, ": ").concat(issue.summary, " (").concat(issue.url, ")"));
166
+ message += "- ".concat(issue.key, ": ").concat(issue.summary, " (").concat(issue.url, ")\n");
167
+ }
168
+ }
169
+ return { message: message, emailList: emailList };
170
+ };
171
+ JiraTicketsStatusTask = __decorate([
172
+ (0, inversify_1.injectable)(),
173
+ __param(0, (0, inversify_1.inject)(types_1.SERVICES.JiraService)),
174
+ __param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
175
+ __metadata("design:paramtypes", [services_1.JiraService,
176
+ services_1.SlackService])
177
+ ], JiraTicketsStatusTask);
178
+ return JiraTicketsStatusTask;
179
+ }());
180
+ exports.JiraTicketsStatusTask = JiraTicketsStatusTask;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/ship-it",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "description": "Release Manager",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {