@clickview/ship-it 0.0.47-dev.0 → 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.
Files changed (63) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.gitlab-ci.yml +1 -1
  3. package/dist/P3/P3 Notes Audit.csv +49 -0
  4. package/dist/R1/R1 Notes Audit.csv +117 -0
  5. package/dist/S3/S3 Notes Audit.csv +13 -0
  6. package/dist/W2/W2 Notes Audit.csv +57 -0
  7. package/lib/src/api-clients/jira/JiraApiClient.js +105 -0
  8. package/lib/src/commands/CheckReleaseReadyCommand.js +76 -0
  9. package/lib/src/commands/JiraTicketsStatusCommand.js +73 -0
  10. package/lib/src/constants/ProjectNames.js +3 -1
  11. package/lib/src/constants/SlackUserEmailList.js +8 -0
  12. package/lib/src/constants/TeamCityBuildIDs.js +0 -36
  13. package/lib/src/index.js +0 -0
  14. package/lib/src/services/JiraService.js +34 -0
  15. package/lib/src/startup/SetupCommands.js +1 -0
  16. package/lib/src/tasks/BumpPackagesTask.js +7 -2
  17. package/lib/src/tasks/CheckReleaseReadyTask.js +179 -0
  18. package/lib/src/tasks/JiraTicketsStatusTask.js +180 -0
  19. package/package.json +6 -5
  20. package/dist/P3/Account.Api.md +0 -20
  21. package/dist/P3/Analytics Web.md +0 -13
  22. package/dist/P3/Batch.Api.md +0 -25
  23. package/dist/P3/Classroom.Api.md +0 -21
  24. package/dist/P3/ClickView Online.md +0 -18
  25. package/dist/P3/ClickView.Cron.JobProcessor.md +0 -28
  26. package/dist/P3/ClickView.Curator.md +0 -39
  27. package/dist/P3/Clients.md +0 -31
  28. package/dist/P3/Collection.Api.md +0 -28
  29. package/dist/P3/Discover.Api.md +0 -23
  30. package/dist/P3/Domain.Api.md +0 -36
  31. package/dist/P3/Exchange.Web.md +0 -6
  32. package/dist/P3/File.Api.IngestService.md +0 -38
  33. package/dist/P3/File.Api.md +0 -26
  34. package/dist/P3/FileGenerator.md +0 -14
  35. package/dist/P3/Hydration.App.md +0 -20
  36. package/dist/P3/Integrations.Api.md +0 -68
  37. package/dist/P3/Krakend.md +0 -29
  38. package/dist/P3/LeadQualifier.App.md +0 -19
  39. package/dist/P3/Library Editor.md +0 -14
  40. package/dist/P3/Library.Api.md +0 -29
  41. package/dist/P3/Lite.md +0 -6
  42. package/dist/P3/LocalCache.Api.md +0 -22
  43. package/dist/P3/LoginAnalytics.Api.md +0 -20
  44. package/dist/P3/Master.Api.md +0 -13
  45. package/dist/P3/Master.Auth.md +0 -28
  46. package/dist/P3/Objects.Api.md +0 -27
  47. package/dist/P3/Permissions.Api.md +0 -23
  48. package/dist/P3/Release Notes.md +0 -1196
  49. package/dist/P3/Search.Api.md +0 -14
  50. package/dist/P3/Share.Api.md +0 -16
  51. package/dist/P3/StreamableLearning.Web.md +0 -6
  52. package/dist/P3/Subjects.API.md +0 -13
  53. package/dist/P3/Tools.md +0 -13
  54. package/dist/P3/Tv.Web.md +0 -35
  55. package/dist/P3/TvConversion.App.md +0 -14
  56. package/dist/P3/TvRecording.App.md +0 -18
  57. package/dist/P3/TvSplice.App.md +0 -14
  58. package/dist/P3/Users.Api.md +0 -46
  59. package/dist/P3/VideoCollections.Api.md +0 -6
  60. package/dist/P3/VideoViews.Api.md +0 -29
  61. package/dist/P3/WorkspaceSplice.App.md +0 -14
  62. package/dist/P3/clickview.md +0 -130
  63. package/dist/P3/index.app.md +0 -58
@@ -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;
@@ -163,6 +163,7 @@ function setupCommands(program, container) {
163
163
  .description('Bump clickview npm package versions in monorepo to their next version')
164
164
  .requiredOption('-b, --branchName <branchName>')
165
165
  .option('-p, --preId <preId>')
166
+ .option('--gitlabci')
166
167
  .action(getAction('bump-packages'));
167
168
  program.command('create-hotfix')
168
169
  .description('Creates hotfix branches for given projects')
@@ -68,7 +68,7 @@ var BumpPackagesTask = /** @class */ (function () {
68
68
  }
69
69
  BumpPackagesTask.prototype.run = function (options) {
70
70
  return __awaiter(this, void 0, void 0, function () {
71
- var branch, isValid, commitFiles, _i, commitFiles_1, file, newJsonFile;
71
+ var branch, isValid, commitFiles, _i, commitFiles_1, file, newJsonFile, commitMessage;
72
72
  return __generator(this, function (_a) {
73
73
  switch (_a.label) {
74
74
  case 0:
@@ -95,7 +95,12 @@ var BumpPackagesTask = /** @class */ (function () {
95
95
  utils_1.Logger.logInfo("Updated version for ".concat(newJsonFile.name, " to ").concat(newJsonFile.version));
96
96
  }
97
97
  utils_1.Logger.logInfo('Committing new versions...');
98
- return [4 /*yield*/, this.service.commit(utils_1.ProjectIds.MONOREPO_PROJECT_ID, options.branchName, 'Bump package versions', commitFiles)];
98
+ commitMessage = 'Bump package versions';
99
+ if (options.gitlabci) {
100
+ utils_1.Logger.logMessage('Running in GitlabCI');
101
+ commitMessage = 'Bump package versions [GitLab CI]';
102
+ }
103
+ return [4 /*yield*/, this.service.commit(utils_1.ProjectIds.MONOREPO_PROJECT_ID, options.branchName, commitMessage, commitFiles)];
99
104
  case 2:
100
105
  _a.sent();
101
106
  utils_1.Logger.logSuccess('Successfully committed updated version numbers.');
@@ -0,0 +1,179 @@
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 (_) 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.CheckReleaseReadyTask = void 0;
52
+ require("reflect-metadata");
53
+ var inversify_1 = require("inversify");
54
+ var Logger_1 = require("../utils/Logger");
55
+ var types_1 = require("../types");
56
+ var services_1 = require("../services");
57
+ var utils_1 = require("../utils");
58
+ var CheckReleaseReadyTask = /** @class */ (function () {
59
+ function CheckReleaseReadyTask(service, slackService) {
60
+ this.service = service;
61
+ this.slackService = slackService;
62
+ }
63
+ CheckReleaseReadyTask.prototype.run = function (options) {
64
+ return __awaiter(this, void 0, void 0, function () {
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) {
68
+ case 0:
69
+ Logger_1.Logger.logTask('Checking status of the current release...');
70
+ return [4 /*yield*/, this.service.getReleaseProjects(options.milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
71
+ case 1:
72
+ projects = _a.sent();
73
+ deployDependenciesTasks = [];
74
+ beforeReleaseTasks = [];
75
+ afterReleaseTasks = [];
76
+ sqlSections = [];
77
+ _i = 0, projects_1 = projects;
78
+ _a.label = 2;
79
+ case 2:
80
+ if (!(_i < projects_1.length)) return [3 /*break*/, 6];
81
+ project = projects_1[_i];
82
+ return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
83
+ case 3:
84
+ branchName = (_a.sent()).branchName;
85
+ return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
86
+ case 4:
87
+ mergeRequest = _a.sent();
88
+ if (!mergeRequest)
89
+ throw new Error("No release MR found for project ".concat(project.title, " on branch ").concat(branchName));
90
+ deployDependencies = utils_1.Descriptions.getDescriptionSection('Dependencies', mergeRequest);
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:
107
+ _i++;
108
+ return [3 /*break*/, 2];
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];
115
+ milestoneLabel = "".concat(options.milestone, " Release");
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];
122
+ return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
123
+ emailList: [],
124
+ threadLabel: "".concat(milestoneLabel, " Tasks & Dependencies"),
125
+ statusMessage: taskSummary,
126
+ statusCleanMessage: 'No Before/After Release Tasks found!'
127
+ })];
128
+ case 7:
129
+ _a.sent();
130
+ _a.label = 8;
131
+ case 8:
132
+ sqlMessage = this.formatSection('SQL Changes', sqlSections, function (item) { return item.phase === 'BeforeRelease' ? 'Before Release' : 'After Release'; });
133
+ if (!sqlMessage) return [3 /*break*/, 10];
134
+ return [4 /*yield*/, this.slackService.sendSlackStatusMessage({
135
+ emailList: [],
136
+ threadLabel: "".concat(milestoneLabel, " SQL"),
137
+ statusMessage: sqlMessage,
138
+ statusCleanMessage: 'No SQL changes found in release!',
139
+ sendAsFile: true
140
+ })];
141
+ case 9:
142
+ _a.sent();
143
+ _a.label = 10;
144
+ case 10: return [2 /*return*/, true];
145
+ }
146
+ });
147
+ });
148
+ };
149
+ CheckReleaseReadyTask.prototype.logSection = function (header, items, getPhaseLabel) {
150
+ Logger_1.Logger.logInfo(header);
151
+ for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
152
+ var item = items_1[_i];
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);
156
+ }
157
+ };
158
+ CheckReleaseReadyTask.prototype.formatSection = function (title, items, getPhaseLabel) {
159
+ if (items.length === 0)
160
+ return '';
161
+ var output = "## ".concat(title, "\n\n");
162
+ for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
163
+ var item = items_2[_i];
164
+ var phase = getPhaseLabel ? " (".concat(getPhaseLabel(item), ")") : '';
165
+ output += "### ".concat(item.project, " \u2013 ").concat(item.mr).concat(phase, "\n");
166
+ output += "".concat(item.content.trim(), "\n");
167
+ }
168
+ return output;
169
+ };
170
+ CheckReleaseReadyTask = __decorate([
171
+ (0, inversify_1.injectable)(),
172
+ __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
173
+ __param(1, (0, inversify_1.inject)(types_1.SERVICES.SlackService)),
174
+ __metadata("design:paramtypes", [services_1.GitLabService,
175
+ services_1.SlackService])
176
+ ], CheckReleaseReadyTask);
177
+ return CheckReleaseReadyTask;
178
+ }());
179
+ exports.CheckReleaseReadyTask = CheckReleaseReadyTask;
@@ -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.47-dev.0",
3
+ "version": "0.0.49",
4
4
  "description": "Release Manager",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {
@@ -17,8 +17,7 @@
17
17
  },
18
18
  "author": "Joshua Taylor, Shale Kuzmanovski",
19
19
  "license": "ISC",
20
- "dependencies": {},
21
- "devDependencies": {
20
+ "dependencies": {
22
21
  "@gitbeaker/node": "35.6.0",
23
22
  "@slack/webhook": "7.0.2",
24
23
  "@slack/web-api":"6.11.2",
@@ -29,9 +28,11 @@
29
28
  "inversify": "6.0.1",
30
29
  "lodash": "4.17.21",
31
30
  "reflect-metadata": "0.1.13",
32
- "semver": "7.7.3",
31
+ "semver": "7.3.5",
33
32
  "teamcity-rest-api": "0.0.8",
34
- "trello": "0.11.0",
33
+ "trello": "0.11.0"
34
+ },
35
+ "devDependencies": {
35
36
  "@clickview/eslint-config": "1.0.3",
36
37
  "@types/fs-extra": "9.0.13",
37
38
  "@types/lodash": "4.14.181",
@@ -1,20 +0,0 @@
1
-
2
- # Before Release
3
-
4
- ## Tasks
5
- * [ ] Addd `ex_file_generator` to RabbitMQ under the `api_account` user.
6
-
7
-
8
- # Code Changes
9
- - Added new endpoint to generate the customer users report `/v1/customers/{id}/generate-user-report`.
10
-
11
-
12
- # Testing
13
- iou
14
-
15
-
16
- # Merge Request Checklist
17
- - [ ] QA validation is completed.
18
- - [ ] All dependencies have been addressed.
19
- - [ ] All before release tasks have been completed.
20
- - [ ] All after release tasks are ready to be completed.
@@ -1,13 +0,0 @@
1
-
2
- # Code Changes
3
- - Adding scopes for subjects api
4
-
5
-
6
- # Testing
7
-
8
-
9
- # Merge Request Checklist
10
- - [ ] QA validation is completed.
11
- - [ ] All dependencies have been addressed.
12
- - [ ] All before release tasks have been completed.
13
- - [ ] All after release tasks are ready to be completed.
@@ -1,25 +0,0 @@
1
-
2
- # Before Release
3
-
4
- ## Tasks
5
- * [ ] Add `RabbitMq-Shared` variable set in Octo
6
-
7
-
8
- # Code Changes
9
- * Support TLS connection for rabbitmq. Closes CORE-2033
10
- * Set `EnableSsl=true` and `IgnoreSslErrors=true` in `RabbitMqClientOptions` and `JobPriorityQueueEventHostedServiceOptions`
11
-
12
- - Ignore blank attribute values for marketing profile imports. Implements INBOX-9140
13
-
14
-
15
- # Testing
16
- * CORE-2033
17
-
18
- - INBOX-9140
19
-
20
-
21
- # Merge Request Checklist
22
- - [ ] QA validation is completed.
23
- - [ ] All dependencies have been addressed.
24
- - [ ] All before release tasks have been completed.
25
- - [ ] All after release tasks are ready to be completed.
@@ -1,21 +0,0 @@
1
-
2
- # Before Release
3
-
4
- ## Tasks
5
- * [ ] Add `RabbitMq-Shared` variable set in Octo
6
-
7
-
8
- # Code Changes
9
- * Support TLS connection for rabbitmq. Closes CORE-2034
10
- * Set `EnableSsl=true` and `IgnoreSslErrors=true` in `AddQueue` for `MasterQueueEventHostedServiceOptions`
11
-
12
-
13
- # Testing
14
- * CORE-2034
15
-
16
-
17
- # Merge Request Checklist
18
- - [ ] QA validation is completed.
19
- - [ ] All dependencies have been addressed.
20
- - [ ] All before release tasks have been completed.
21
- - [ ] All after release tasks are ready to be completed.
@@ -1,18 +0,0 @@
1
-
2
- # Code Changes
3
- * Update references to `collection-api-client.js` to `app.js`
4
-
5
- * Update entrypoint file for `@clickview/analytics`. Partially Implements INBOX-9260.
6
-
7
-
8
- # Testing
9
- * N/A
10
-
11
- * N/A
12
-
13
-
14
- # Merge Request Checklist
15
- - [ ] QA validation is completed.
16
- - [ ] All dependencies have been addressed.
17
- - [ ] All before release tasks have been completed.
18
- - [ ] All after release tasks are ready to be completed.
@@ -1,28 +0,0 @@
1
-
2
- # Before Release
3
-
4
- ## Tasks
5
- * [ ] Add `RabbitMq-Shared` variable set in Octo
6
- * [ ] Add new project variable: `queue:concurrentTaskCount` and set value to `10` in Octo
7
-
8
-
9
- # After Release
10
-
11
- ## Tasks
12
- * [ ] Remove project variable: `queue:host` and `queue:port` from Octo
13
-
14
-
15
- # Code Changes
16
- * Enforce queue connection using SSL by replacing `ClickView.Clients.Queue` with `ClickView.GoodStuff.Queue`s`.RabbitMQ`
17
- * Move options objects to the `Options` folder
18
- * Minor code refactorings
19
-
20
-
21
- # Testing
22
-
23
-
24
- # Merge Request Checklist
25
- - [ ] QA validation is completed.
26
- - [ ] All dependencies have been addressed.
27
- - [ ] All before release tasks have been completed.
28
- - [ ] All after release tasks are ready to be completed.
@@ -1,39 +0,0 @@
1
-
2
- # Before Release
3
-
4
- ## Tasks
5
- * [ ] Add `RabbitMq-Shared` variable set in Octo
6
- * [ ] Rename octo variables:
7
- * `eventQueue:username` to `queue:username`
8
- * `eventQueue:password` to `queue:password`
9
- * `eventQueue:discoverQueue` to `queue:discoverQueue`
10
- * `eventQueue:masterQueue` to `queue:masterQueue`
11
- * `eventQueue:subjectsQueue` to `queue:subjectsQueue`
12
- * [ ] Remove octo variables:
13
- * `eventQueue:host`
14
- * `eventQueue:port`
15
-
16
-
17
- # Code Changes
18
- * Replace `ClickView.Clients.Queue` with `ClickView.GoodStuff.Queues.RabbitMq` according to [the guide](https://clickview.quip.com/nlFMAsSqxeaU/2024-05-RabbitMQ-Upgrade)
19
- * Change the queues port from 5672 to 5671
20
- * In the RabbitMQ client options, set EnableSsl=true and IgnoreSslErrors=true. Implements INBOX-9149
21
-
22
- * Updated file client to latest
23
-
24
- * Moves the `GetDescription` extension method to use the common property to ensure the correct description is retrieved for videos in reports. Fixes INBOX-9253
25
- * Removes duplicate description definitions.
26
-
27
-
28
- # Testing
29
- INBOX-9149
30
-
31
-
32
- INBOX-9253
33
-
34
-
35
- # Merge Request Checklist
36
- - [ ] QA validation is completed.
37
- - [ ] All dependencies have been addressed.
38
- - [ ] All before release tasks have been completed.
39
- - [ ] All after release tasks are ready to be completed.