@clickview/ship-it 0.0.52 → 0.0.54-dev.0

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 (56) hide show
  1. package/Dockerfile +1 -3
  2. package/dist/P3/Account.Api.md +20 -0
  3. package/dist/P3/Analytics Web.md +13 -0
  4. package/dist/P3/Batch.Api.md +25 -0
  5. package/dist/P3/Classroom.Api.md +21 -0
  6. package/dist/P3/ClickView Online.md +18 -0
  7. package/dist/P3/ClickView.Cron.JobProcessor.md +28 -0
  8. package/dist/P3/ClickView.Curator.md +39 -0
  9. package/dist/P3/Clients.md +31 -0
  10. package/dist/P3/Collection.Api.md +28 -0
  11. package/dist/P3/Discover.Api.md +23 -0
  12. package/dist/P3/Domain.Api.md +36 -0
  13. package/dist/P3/Exchange.Web.md +6 -0
  14. package/dist/P3/File.Api.IngestService.md +38 -0
  15. package/dist/P3/File.Api.md +26 -0
  16. package/dist/P3/FileGenerator.md +14 -0
  17. package/dist/P3/Hydration.App.md +20 -0
  18. package/dist/P3/Integrations.Api.md +68 -0
  19. package/dist/P3/Krakend.md +29 -0
  20. package/dist/P3/LeadQualifier.App.md +19 -0
  21. package/dist/P3/Library Editor.md +14 -0
  22. package/dist/P3/Library.Api.md +29 -0
  23. package/dist/P3/Lite.md +6 -0
  24. package/dist/P3/LocalCache.Api.md +22 -0
  25. package/dist/P3/LoginAnalytics.Api.md +20 -0
  26. package/dist/P3/Master.Api.md +13 -0
  27. package/dist/P3/Master.Auth.md +28 -0
  28. package/dist/P3/Objects.Api.md +27 -0
  29. package/dist/P3/Permissions.Api.md +23 -0
  30. package/dist/P3/Release Notes.md +1196 -0
  31. package/dist/P3/Search.Api.md +14 -0
  32. package/dist/P3/Share.Api.md +16 -0
  33. package/dist/P3/StreamableLearning.Web.md +6 -0
  34. package/dist/P3/Subjects.API.md +13 -0
  35. package/dist/P3/Tools.md +13 -0
  36. package/dist/P3/Tv.Web.md +35 -0
  37. package/dist/P3/TvConversion.App.md +14 -0
  38. package/dist/P3/TvRecording.App.md +18 -0
  39. package/dist/P3/TvSplice.App.md +14 -0
  40. package/dist/P3/Users.Api.md +46 -0
  41. package/dist/P3/VideoCollections.Api.md +6 -0
  42. package/dist/P3/VideoViews.Api.md +29 -0
  43. package/dist/P3/WorkspaceSplice.App.md +14 -0
  44. package/dist/P3/clickview.md +130 -0
  45. package/dist/P3/index.app.md +58 -0
  46. package/dist/V1/V1 Notes Audit.csv +53 -0
  47. package/dist/W2/W2 Notes Audit.csv +0 -14
  48. package/lib/src/api-clients/slack/SlackApiClient.js +16 -20
  49. package/lib/src/api-clients/team-city/TeamCityApiClient.js +35 -21
  50. package/lib/src/index.js +0 -0
  51. package/lib/src/tasks/InstallPackagesTask.js +183 -57
  52. package/package.json +4 -6
  53. package/.claude/settings.local.json +0 -10
  54. package/dist/P3/P3 Notes Audit.csv +0 -49
  55. package/dist/R1/R1 Notes Audit.csv +0 -117
  56. package/dist/S3/S3 Notes Audit.csv +0 -13
@@ -47,45 +47,59 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
47
47
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48
48
  }
49
49
  };
50
- var __importDefault = (this && this.__importDefault) || function (mod) {
51
- return (mod && mod.__esModule) ? mod : { "default": mod };
52
- };
53
50
  Object.defineProperty(exports, "__esModule", { value: true });
54
51
  exports.TeamCityApiClient = void 0;
55
52
  require("reflect-metadata");
56
- var teamcity_rest_api_1 = __importDefault(require("teamcity-rest-api"));
57
53
  var inversify_1 = require("inversify");
58
54
  var types_1 = require("../../types");
59
55
  var TeamCityApiClient = /** @class */ (function () {
60
56
  function TeamCityApiClient(config) {
61
- this.client = teamcity_rest_api_1.default.create(config);
57
+ // config.url may carry a trailing slash (e.g. "http://build.cvinternal.net/")
58
+ this.baseUrl = "".concat(config.url.replace(/\/+$/, ''), "/httpAuth/app/rest");
59
+ this.authHeader = "Basic ".concat(Buffer.from("".concat(config.username, ":").concat(config.password)).toString('base64'));
62
60
  }
63
61
  TeamCityApiClient.prototype.startBuild = function (buildId, branchName) {
64
62
  return __awaiter(this, void 0, void 0, function () {
65
- var buildXml, build;
63
+ var buildXml;
66
64
  return __generator(this, function (_a) {
67
- switch (_a.label) {
68
- case 0:
69
- buildXml = "\n <build branchName=\"".concat(branchName, "\">\n <buildType id=\"").concat(buildId, "\" />\n </build>\n ");
70
- return [4 /*yield*/, this.client.builds.startBuild(buildXml)];
71
- case 1:
72
- build = _a.sent();
73
- return [2 /*return*/, build];
74
- }
65
+ buildXml = "\n <build branchName=\"".concat(branchName, "\">\n <buildType id=\"").concat(buildId, "\" />\n </build>\n ");
66
+ return [2 /*return*/, this.queueBuild(buildXml)];
75
67
  });
76
68
  });
77
69
  };
78
70
  TeamCityApiClient.prototype.startCustomBuild = function (buildId, branchName, pList) {
79
71
  return __awaiter(this, void 0, void 0, function () {
80
- var buildXml, build;
72
+ var buildXml;
81
73
  return __generator(this, function (_a) {
82
- switch (_a.label) {
83
- case 0:
84
- buildXml = "\n <build branchName=\"".concat(branchName, "\">\n <buildType id=\"").concat(buildId, "\" />\n <properties>\n <property name=\"ProjectList\" value=\"").concat(pList, "\"/>\n <property name=\"ReleaseEnvironment\" value=\"rc\"/>\n <property name=\"TriggerProjectBuilds\" value=\"all\"/>\n </properties>\n </build>\n ");
85
- return [4 /*yield*/, this.client.builds.startBuild(buildXml)];
74
+ buildXml = "\n <build branchName=\"".concat(branchName, "\">\n <buildType id=\"").concat(buildId, "\" />\n <properties>\n <property name=\"ProjectList\" value=\"").concat(pList, "\"/>\n <property name=\"ReleaseEnvironment\" value=\"rc\"/>\n <property name=\"TriggerProjectBuilds\" value=\"all\"/>\n </properties>\n </build>\n ");
75
+ return [2 /*return*/, this.queueBuild(buildXml)];
76
+ });
77
+ });
78
+ };
79
+ TeamCityApiClient.prototype.queueBuild = function (buildXml) {
80
+ return __awaiter(this, void 0, void 0, function () {
81
+ var res, _a, _b, _c;
82
+ return __generator(this, function (_d) {
83
+ switch (_d.label) {
84
+ case 0: return [4 /*yield*/, fetch("".concat(this.baseUrl, "/buildQueue"), {
85
+ method: 'POST',
86
+ headers: {
87
+ 'Authorization': this.authHeader,
88
+ 'Content-Type': 'application/xml',
89
+ 'Accept': 'application/json',
90
+ },
91
+ body: buildXml,
92
+ signal: AbortSignal.timeout(20000)
93
+ })];
86
94
  case 1:
87
- build = _a.sent();
88
- return [2 /*return*/, build];
95
+ res = _d.sent();
96
+ if (!!res.ok) return [3 /*break*/, 3];
97
+ _a = Error.bind;
98
+ _c = (_b = "TeamCity buildQueue request failed: ".concat(res.status, " ").concat(res.statusText, " - ")).concat;
99
+ return [4 /*yield*/, res.text()];
100
+ case 2: throw new (_a.apply(Error, [void 0, _c.apply(_b, [_d.sent()])]))();
101
+ case 3: return [4 /*yield*/, res.json()];
102
+ case 4: return [2 /*return*/, (_d.sent())];
89
103
  }
90
104
  });
91
105
  });
package/lib/src/index.js CHANGED
File without changes
@@ -59,6 +59,7 @@ var semver_1 = __importDefault(require("semver"));
59
59
  var child_process_1 = __importDefault(require("child_process"));
60
60
  var types_1 = require("../types");
61
61
  var services_1 = require("../services");
62
+ var errors_1 = require("../errors");
62
63
  var utils_1 = require("../utils");
63
64
  var MonorepoPackageJsonFiles_1 = require("../constants/MonorepoPackageJsonFiles");
64
65
  var ROOT_DIRECTORIES = {
@@ -79,22 +80,29 @@ var ROOT_DIRECTORIES = {
79
80
  // Streamable learning
80
81
  1144: 'src/StreamableLearning.Web'
81
82
  };
83
+ /**
84
+ * npm accepts a publish before the version can be resolved from the registry. Large packages get
85
+ * queued for background processing ("Your package is being processed and may take a few minutes to
86
+ * become available"), so we poll for up to 5 minutes.
87
+ */
88
+ var PUBLISH_POLL_ATTEMPTS = 20;
89
+ var PUBLISH_POLL_INTERVAL_MS = 15000;
82
90
  var InstallPackagesTask = /** @class */ (function () {
83
91
  function InstallPackagesTask(service) {
84
92
  this.service = service;
85
93
  }
86
94
  InstallPackagesTask.prototype.run = function (options) {
87
95
  return __awaiter(this, void 0, void 0, function () {
88
- var targetBranch, projectId, project, versions_1, folderName, hasUpdates, error_1, milestone, projects, monorepo, consumingProjects, _a, monorepoBranch, monorepoBranchName, versions, _i, consumingProjects_1, project, _b, branch, branchName, hasUpdates, _c;
89
- return __generator(this, function (_d) {
90
- switch (_d.label) {
96
+ var targetBranch, projectId, project, versions_1, folderName, updatedPackages, error_1, milestone, projects, monorepo, consumingProjects, _a, monorepoBranch, monorepoBranchName, versions, failedProjects, _i, consumingProjects_1, project, _b, branch, branchName, updatedPackages, error_2;
97
+ return __generator(this, function (_c) {
98
+ switch (_c.label) {
91
99
  case 0:
92
100
  utils_1.Logger.logTask('Installing npm packages');
93
101
  if (!options.monorepoBranchName && !options.milestone) {
94
102
  utils_1.Logger.logError('Please provide either a milestone or branch name argument.');
95
103
  return [2 /*return*/, false];
96
104
  }
97
- if (!(options.targetBranchName && options.monorepoBranchName && options.projectIds)) return [3 /*break*/, 8];
105
+ if (!(options.targetBranchName && options.monorepoBranchName && options.projectIds)) return [3 /*break*/, 9];
98
106
  targetBranch = options.targetBranchName;
99
107
  if (targetBranch.startsWith('release') && !options.monorepoBranchName.startsWith('release')) {
100
108
  utils_1.Logger.logError('Attempting to target release with non release branch.');
@@ -111,28 +119,39 @@ var InstallPackagesTask = /** @class */ (function () {
111
119
  projectId = options.projectIds[0];
112
120
  return [4 /*yield*/, this.service.getProject(projectId)];
113
121
  case 1:
114
- project = _d.sent();
122
+ project = _c.sent();
115
123
  return [4 /*yield*/, this.getPackageVersions(options.monorepoBranchName)];
116
124
  case 2:
117
- versions_1 = _d.sent();
125
+ versions_1 = _c.sent();
118
126
  folderName = 'hotfix';
119
127
  utils_1.Logger.logMessage("Versions identified for ".concat(options.monorepoBranchName));
120
128
  Object.keys(versions_1).forEach(function (key) {
121
129
  utils_1.Logger.logMessage("- [".concat(key, "]: ").concat(versions_1[key]));
122
130
  });
123
- _d.label = 3;
131
+ _c.label = 3;
124
132
  case 3:
125
- _d.trys.push([3, 6, , 7]);
133
+ _c.trys.push([3, 7, , 8]);
126
134
  return [4 /*yield*/, this.updateAndSavePackageFiles(project, folderName, targetBranch, versions_1)];
127
135
  case 4:
128
- hasUpdates = _d.sent();
136
+ updatedPackages = _c.sent();
129
137
  /**
130
138
  * If there are no changes to the versions, we're done here
131
139
  */
132
- if (!hasUpdates) {
140
+ if (!updatedPackages.length) {
133
141
  utils_1.Logger.logWarning("[".concat(project.title, "]: [").concat(targetBranch, "] does not require any updates"));
134
142
  return [2 /*return*/, true];
135
143
  }
144
+ /**
145
+ * The versions come from git, so they can be ahead of the registry. Wait for them to become
146
+ * installable before npm tries to resolve them
147
+ */
148
+ return [4 /*yield*/, this.waitForPublishedVersions(project, updatedPackages)];
149
+ case 5:
150
+ /**
151
+ * The versions come from git, so they can be ahead of the registry. Wait for them to become
152
+ * installable before npm tries to resolve them
153
+ */
154
+ _c.sent();
136
155
  /**
137
156
  * Run npm i to update our package log file
138
157
  */
@@ -143,33 +162,34 @@ var InstallPackagesTask = /** @class */ (function () {
143
162
  * Commit our updated package.json and package-lock.json
144
163
  */
145
164
  return [4 /*yield*/, this.commitUpdatedFiles(project, folderName, targetBranch)];
146
- case 5:
165
+ case 6:
147
166
  /**
148
167
  * Commit our updated package.json and package-lock.json
149
168
  */
150
- _d.sent();
169
+ _c.sent();
151
170
  utils_1.Logger.logMessage("[".concat(project.title, "]: File changes committed"));
152
- return [3 /*break*/, 7];
153
- case 6:
154
- error_1 = _d.sent();
171
+ return [3 /*break*/, 8];
172
+ case 7:
173
+ error_1 = _c.sent();
155
174
  utils_1.Logger.logError("[".concat(project.title, "]: Something went wrong while attempting to install packages. Please manually check if this project should have any monorepo packages installed."));
156
- return [3 /*break*/, 7];
157
- case 7: return [2 /*return*/, true];
158
- case 8:
175
+ utils_1.Logger.logError(this.getErrorMessage(error_1));
176
+ return [2 /*return*/, false];
177
+ case 8: return [2 /*return*/, true];
178
+ case 9:
159
179
  milestone = options.milestone;
160
- if (!!milestone) return [3 /*break*/, 10];
180
+ if (!!milestone) return [3 /*break*/, 11];
161
181
  utils_1.Logger.logInfo("Searching for a merge request in project \"monorepo\" with branch name \"".concat(options.monorepoBranchName, "\"..."));
162
182
  return [4 /*yield*/, this.service.getMilestoneByBranchName(utils_1.ProjectIds.MONOREPO_PROJECT_ID, options.monorepoBranchName)];
163
- case 9:
164
- milestone = _d.sent();
165
- _d.label = 10;
166
183
  case 10:
184
+ milestone = _c.sent();
185
+ _c.label = 11;
186
+ case 11:
167
187
  if (!milestone)
168
188
  return [2 /*return*/, false];
169
189
  utils_1.Logger.logInfo("Found milestone \"".concat(milestone, "\". Proceeding to install packages in consuming projects..."));
170
190
  return [4 /*yield*/, this.service.getReleaseProjects(milestone, options.projectIds, options.omittedProjectIds, options.sourceBranch)];
171
- case 11:
172
- projects = _d.sent();
191
+ case 12:
192
+ projects = _c.sent();
173
193
  monorepo = projects.find(function (p) { return p.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID; });
174
194
  consumingProjects = projects.filter(function (p) { return p.id.toString() !== utils_1.ProjectIds.MONOREPO_PROJECT_ID; });
175
195
  if (!monorepo) {
@@ -181,45 +201,57 @@ var InstallPackagesTask = /** @class */ (function () {
181
201
  return [2 /*return*/, false];
182
202
  }
183
203
  return [4 /*yield*/, this.service.getNextBranchInfo(monorepo.id, options.version)];
184
- case 12:
185
- _a = _d.sent(), monorepoBranch = _a.branch, monorepoBranchName = _a.branchName;
204
+ case 13:
205
+ _a = _c.sent(), monorepoBranch = _a.branch, monorepoBranchName = _a.branchName;
186
206
  if (!monorepoBranch) {
187
207
  utils_1.Logger.logError("[".concat(monorepo.title, "]: [").concat(monorepoBranchName, "] branch does not exist"));
188
208
  return [2 /*return*/, false];
189
209
  }
190
210
  return [4 /*yield*/, this.getPackageVersions(monorepoBranchName)];
191
- case 13:
192
- versions = _d.sent();
211
+ case 14:
212
+ versions = _c.sent();
193
213
  utils_1.Logger.logMessage("Versions identified for ".concat(monorepoBranchName));
194
214
  Object.keys(versions).forEach(function (key) {
195
215
  utils_1.Logger.logMessage("- [".concat(key, "]: ").concat(versions[key]));
196
216
  });
197
217
  utils_1.Logger.logMessage('\nInstalling packages:\n');
218
+ failedProjects = [];
198
219
  _i = 0, consumingProjects_1 = consumingProjects;
199
- _d.label = 14;
200
- case 14:
201
- if (!(_i < consumingProjects_1.length)) return [3 /*break*/, 21];
202
- project = consumingProjects_1[_i];
203
- _d.label = 15;
220
+ _c.label = 15;
204
221
  case 15:
205
- _d.trys.push([15, 19, , 20]);
206
- return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
222
+ if (!(_i < consumingProjects_1.length)) return [3 /*break*/, 23];
223
+ project = consumingProjects_1[_i];
224
+ _c.label = 16;
207
225
  case 16:
208
- _b = _d.sent(), branch = _b.branch, branchName = _b.branchName;
226
+ _c.trys.push([16, 21, , 22]);
227
+ return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
228
+ case 17:
229
+ _b = _c.sent(), branch = _b.branch, branchName = _b.branchName;
209
230
  if (!branch) {
210
231
  utils_1.Logger.logError("[".concat(project.title, "]: [").concat(branchName, "] does not exist"));
211
- return [3 /*break*/, 20];
232
+ return [3 /*break*/, 22];
212
233
  }
213
234
  return [4 /*yield*/, this.updateAndSavePackageFiles(project, milestone, branchName, versions)];
214
- case 17:
215
- hasUpdates = _d.sent();
235
+ case 18:
236
+ updatedPackages = _c.sent();
216
237
  /**
217
238
  * If there are no changes to the versions, we're done here
218
239
  */
219
- if (!hasUpdates) {
240
+ if (!updatedPackages.length) {
220
241
  utils_1.Logger.logWarning("[".concat(project.title, "]: [").concat(branchName, "] does not require any updates"));
221
- return [3 /*break*/, 20];
242
+ return [3 /*break*/, 22];
222
243
  }
244
+ /**
245
+ * The versions come from git, so they can be ahead of the registry. Wait for them to become
246
+ * installable before npm tries to resolve them
247
+ */
248
+ return [4 /*yield*/, this.waitForPublishedVersions(project, updatedPackages)];
249
+ case 19:
250
+ /**
251
+ * The versions come from git, so they can be ahead of the registry. Wait for them to become
252
+ * installable before npm tries to resolve them
253
+ */
254
+ _c.sent();
223
255
  /**
224
256
  * Run npm i to update our package log file
225
257
  */
@@ -230,25 +262,40 @@ var InstallPackagesTask = /** @class */ (function () {
230
262
  * Commit our updated package.json and package-lock.json
231
263
  */
232
264
  return [4 /*yield*/, this.commitUpdatedFiles(project, milestone, branchName)];
233
- case 18:
265
+ case 20:
234
266
  /**
235
267
  * Commit our updated package.json and package-lock.json
236
268
  */
237
- _d.sent();
269
+ _c.sent();
238
270
  utils_1.Logger.logMessage("[".concat(project.title, "]: File changes committed"));
239
- return [3 /*break*/, 20];
240
- case 19:
241
- _c = _d.sent();
271
+ return [3 /*break*/, 22];
272
+ case 21:
273
+ error_2 = _c.sent();
242
274
  utils_1.Logger.logError("[".concat(project.title, "]: Something went wrong while attempting to install packages. Please manually check if this project should have any monorepo packages installed."));
243
- return [3 /*break*/, 20];
244
- case 20:
275
+ utils_1.Logger.logError(this.getErrorMessage(error_2));
276
+ failedProjects.push(project.title);
277
+ return [3 /*break*/, 22];
278
+ case 22:
245
279
  _i++;
246
- return [3 /*break*/, 14];
247
- case 21: return [2 /*return*/, true];
280
+ return [3 /*break*/, 15];
281
+ case 23:
282
+ /**
283
+ * One project failing shouldn't stop the others, but the command still needs to fail so the
284
+ * pipeline goes red rather than leaving a project silently behind
285
+ */
286
+ if (failedProjects.length) {
287
+ utils_1.Logger.logError("\nFailed to install packages in ".concat(failedProjects.length, " of ") +
288
+ "".concat(consumingProjects.length, " projects: ").concat(failedProjects.join(', ')));
289
+ return [2 /*return*/, false];
290
+ }
291
+ return [2 /*return*/, true];
248
292
  }
249
293
  });
250
294
  });
251
295
  };
296
+ InstallPackagesTask.prototype.getErrorMessage = function (error) {
297
+ return error instanceof Error ? error.message : String(error);
298
+ };
252
299
  InstallPackagesTask.prototype.commitUpdatedFiles = function (project, folderName, branchName) {
253
300
  return __awaiter(this, void 0, void 0, function () {
254
301
  var rootDir, outputPath, commitFiles, _a;
@@ -280,6 +327,81 @@ var InstallPackagesTask = /** @class */ (function () {
280
327
  });
281
328
  });
282
329
  };
330
+ /**
331
+ * We read versions out of the monorepo package.json files in git, so a version can be bumped and
332
+ * published while npm is still processing it in the background. Installing during that window
333
+ * fails with ETARGET, so wait for each version to become resolvable first.
334
+ */
335
+ InstallPackagesTask.prototype.waitForPublishedVersions = function (project, packages) {
336
+ return __awaiter(this, void 0, void 0, function () {
337
+ var _i, packages_1, pkg;
338
+ return __generator(this, function (_a) {
339
+ switch (_a.label) {
340
+ case 0:
341
+ _i = 0, packages_1 = packages;
342
+ _a.label = 1;
343
+ case 1:
344
+ if (!(_i < packages_1.length)) return [3 /*break*/, 4];
345
+ pkg = packages_1[_i];
346
+ return [4 /*yield*/, this.waitForPublishedVersion(project, pkg)];
347
+ case 2:
348
+ _a.sent();
349
+ _a.label = 3;
350
+ case 3:
351
+ _i++;
352
+ return [3 /*break*/, 1];
353
+ case 4: return [2 /*return*/];
354
+ }
355
+ });
356
+ });
357
+ };
358
+ InstallPackagesTask.prototype.waitForPublishedVersion = function (project, pkg) {
359
+ return __awaiter(this, void 0, void 0, function () {
360
+ var attempt;
361
+ return __generator(this, function (_a) {
362
+ switch (_a.label) {
363
+ case 0:
364
+ attempt = 1;
365
+ _a.label = 1;
366
+ case 1:
367
+ if (!(attempt <= PUBLISH_POLL_ATTEMPTS)) return [3 /*break*/, 4];
368
+ if (this.isVersionPublished(pkg)) {
369
+ utils_1.Logger.logInfo("[".concat(project.title, "]: ").concat(pkg, " is available on npm"));
370
+ return [2 /*return*/];
371
+ }
372
+ if (!(attempt < PUBLISH_POLL_ATTEMPTS)) return [3 /*break*/, 3];
373
+ utils_1.Logger.logWarning("[".concat(project.title, "]: ").concat(pkg, " is not available on npm yet, waiting ") +
374
+ "".concat(PUBLISH_POLL_INTERVAL_MS / 1000, "s (attempt ").concat(attempt, "/").concat(PUBLISH_POLL_ATTEMPTS, ")"));
375
+ return [4 /*yield*/, this.delay(PUBLISH_POLL_INTERVAL_MS)];
376
+ case 2:
377
+ _a.sent();
378
+ _a.label = 3;
379
+ case 3:
380
+ attempt++;
381
+ return [3 /*break*/, 1];
382
+ case 4: throw new errors_1.ShipItError("[".concat(project.title, "]: ").concat(pkg, " did not become available on npm after ") +
383
+ "".concat((PUBLISH_POLL_ATTEMPTS * PUBLISH_POLL_INTERVAL_MS) / 1000, "s. Check that it published successfully."));
384
+ }
385
+ });
386
+ });
387
+ };
388
+ InstallPackagesTask.prototype.isVersionPublished = function (pkg) {
389
+ try {
390
+ /**
391
+ * --prefer-online revalidates the cached metadata. The CI npm cache is restored between jobs,
392
+ * so without it npm can serve back a copy from before the version was published
393
+ */
394
+ var output = child_process_1.default.execSync("npm view ".concat(pkg, " version --prefer-online"), { stdio: 'pipe' });
395
+ return output.toString().trim() !== '';
396
+ }
397
+ catch (_a) {
398
+ // npm exits non-zero when the version does not exist yet
399
+ return false;
400
+ }
401
+ };
402
+ InstallPackagesTask.prototype.delay = function (ms) {
403
+ return new Promise(function (resolve) { return setTimeout(resolve, ms); });
404
+ };
283
405
  InstallPackagesTask.prototype.npmInstall = function (project, folderName) {
284
406
  var outputPath = this.getOutputPath(project, folderName);
285
407
  child_process_1.default.execSync('npm i --package-lock-only --verbose', {
@@ -288,15 +410,18 @@ var InstallPackagesTask = /** @class */ (function () {
288
410
  // stdio: 'pipe'
289
411
  });
290
412
  };
413
+ /**
414
+ * Returns the packages whose versions changed, as "name@version" strings
415
+ */
291
416
  InstallPackagesTask.prototype.updateAndSavePackageFiles = function (project, folderName, branchName, versions) {
292
417
  return __awaiter(this, void 0, void 0, function () {
293
- var rootDir, packageJson, packageLock, packageJsonObj, original, outputPath;
418
+ var rootDir, packageJson, packageLock, packageJsonObj, updatedPackages, outputPath;
294
419
  return __generator(this, function (_a) {
295
420
  switch (_a.label) {
296
421
  case 0:
297
422
  rootDir = ROOT_DIRECTORIES[project.id];
298
423
  if (!rootDir)
299
- return [2 /*return*/, false];
424
+ return [2 /*return*/, []];
300
425
  return [4 /*yield*/, this.getFileText(project.id, branchName, "".concat(rootDir, "/package.json"))];
301
426
  case 1:
302
427
  packageJson = _a.sent();
@@ -304,16 +429,16 @@ var InstallPackagesTask = /** @class */ (function () {
304
429
  case 2:
305
430
  packageLock = _a.sent();
306
431
  packageJsonObj = JSON.parse(packageJson);
307
- original = packageJson;
432
+ updatedPackages = [];
308
433
  utils_1.Logger.logMessage(project.title);
309
434
  /**
310
435
  * Annoyingly some projects have clickview packages sitting in dependencies
311
436
  * and others have it in devDependencies
312
437
  */
313
438
  if (packageJsonObj.dependencies)
314
- packageJson = this.replaceVersions(packageJson, versions, packageJsonObj.dependencies);
439
+ packageJson = this.replaceVersions(packageJson, versions, packageJsonObj.dependencies, updatedPackages);
315
440
  if (packageJsonObj.devDependencies)
316
- packageJson = this.replaceVersions(packageJson, versions, packageJsonObj.devDependencies);
441
+ packageJson = this.replaceVersions(packageJson, versions, packageJsonObj.devDependencies, updatedPackages);
317
442
  outputPath = this.getOutputPath(project, folderName);
318
443
  return [4 /*yield*/, fs_extra_1.default.outputFile("".concat(outputPath, "/package.json"), packageJson, { encoding: 'utf8' })];
319
444
  case 3:
@@ -321,12 +446,12 @@ var InstallPackagesTask = /** @class */ (function () {
321
446
  return [4 /*yield*/, fs_extra_1.default.outputFile("".concat(outputPath, "/package-lock.json"), packageLock, { encoding: 'utf8' })];
322
447
  case 4:
323
448
  _a.sent();
324
- return [2 /*return*/, original !== packageJson];
449
+ return [2 /*return*/, updatedPackages];
325
450
  }
326
451
  });
327
452
  });
328
453
  };
329
- InstallPackagesTask.prototype.replaceVersions = function (packageJson, versions, deps) {
454
+ InstallPackagesTask.prototype.replaceVersions = function (packageJson, versions, deps, updatedPackages) {
330
455
  Object.keys(deps).forEach(function (key) {
331
456
  if (!key.startsWith('@clickview'))
332
457
  return;
@@ -343,6 +468,7 @@ var InstallPackagesTask = /** @class */ (function () {
343
468
  return;
344
469
  }
345
470
  packageJson = packageJson.replace("\"".concat(key, "\": \"").concat(deps[key], "\""), "\"".concat(key, "\": \"").concat(versions[key], "\""));
471
+ updatedPackages.push("".concat(key, "@").concat(newVersion));
346
472
  utils_1.Logger.logMessage("- [".concat(key, "]: ").concat(deps[key], " -> ").concat(versions[key]));
347
473
  });
348
474
  return packageJson;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/ship-it",
3
- "version": "0.0.52",
3
+ "version": "0.0.54-dev.0",
4
4
  "description": "Release Manager",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {
@@ -19,25 +19,23 @@
19
19
  "license": "ISC",
20
20
  "dependencies": {
21
21
  "@gitbeaker/node": "35.6.0",
22
- "@slack/web-api": "6.11.2",
23
- "@slack/webhook": "7.0.2",
22
+ "@slack/web-api": "7.9.0",
24
23
  "chalk": "4.1.2",
25
24
  "commander": "9.1.0",
26
25
  "fast-csv": "4.3.6",
27
26
  "fs-extra": "10.0.1",
28
27
  "inversify": "6.0.1",
29
28
  "jira.js": "5.3.1",
30
- "lodash": "4.17.21",
29
+ "lodash": "4.18.1",
31
30
  "reflect-metadata": "0.1.13",
32
31
  "semver": "7.3.5",
33
- "teamcity-rest-api": "0.0.8",
34
32
  "trello": "0.11.0"
35
33
  },
36
34
  "devDependencies": {
37
35
  "@clickview/eslint-config": "1.0.3",
38
36
  "@types/fs-extra": "9.0.13",
39
37
  "@types/lodash": "4.14.181",
40
- "@types/node": "17.0.23",
38
+ "@types/node": "22.14.0",
41
39
  "@types/semver": "7.3.9",
42
40
  "@typescript-eslint/eslint-plugin": "6.21.0",
43
41
  "@typescript-eslint/parser": "6.21.0",
@@ -1,10 +0,0 @@
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
- }
@@ -1,49 +0,0 @@
1
- projectName,mrTitle,mrAuthor,mrAssignee,mrUrl,notes
2
- clickview,Lite: Incremental exports for Marc,Shale Kuzmanovski,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5708,"# Lite
3
- - Added a link to our KB article about exporting libraries to the export libraries settings page.
4
- - When selecting the `MARC 21 V2` or `MARC XML` library export formats. Admins can now additionally select from which date they would like the export to start from. Implements INBOX-9351.
5
-
6
- ![image](/uploads/c2a21befd2de8a2dd44e73a59a5a81e3/image.png)"
7
- clickview,Lite: SearchV2 - Enable public access,Nischal Shrestha,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5699,"# Lite
8
- * Enable new search for public access."
9
- clickview,Player: Fix captions bug with theatre mode,Shale Kuzmanovski,Nan Chen,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5690,"# Player
10
- - Fixed a bug where captions wouldn't reposition when toggling between theatre mode and default mode. Fixes INBOX-9276."
11
- clickview,User man - Super admin support,Nan Chen,Joshua Taylor,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5687,"# Lite
12
- - In the Curator user manager, a super admin account can be created and edited:
13
-
14
- ![Screenshot_2025-06-19_at_8.52.00_am](/uploads/17b00c4d068880871d9b51d37509f076/Screenshot_2025-06-19_at_8.52.00_am.png)
15
-
16
- ![image](/uploads/ac959cb3cf188747ba2a2c97c353ad1b/image.png)
17
- - For a Super Admin account, they can create/edit another Super Admin staff account:
18
- ![image](/uploads/9f8cc51ec6f3fe707c804be1b73ca19a/image.png)
19
- - For an ordinary Admin, they cannot create/edit a Super Admin staff:
20
- ![image](/uploads/0ca0a42ca33357e65bdecd55ccad1f4b/image.png)
21
- - In Lite, a non-super admin cannot update a super admin account (edit, deactivate, remove etc.)
22
- ![image](/uploads/3c5ff12844f1adc13ae6288b13bbf4ba/image.png)"
23
- clickview,User man - Support superAdmin badge,Nan Chen,Joshua Taylor,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5671,"# Lite
24
- * If a user is a Super Admin, it should display a badge to differentiate from an Admin. For AU/UK it's called `Org Admin`, for US it's `District Admin`.
25
- ![Screenshot 2025-06-17 at 1.21.43 pm.png](/uploads/fecf7e3c85fe2ef60b7f65125899728c/Screenshot_2025-06-17_at_1.21.43_pm.png)
26
- ![image.png](/uploads/88184f5bb5396dd4b87938780c9d1aba/image.png)
27
-
28
- # Curator
29
- * If a user is a Super Admin, it should display a badge to differentiate from an Admin. For AU/UK it's called `Org Admin`, for US it's `District Admin`.
30
- ![Screenshot 2025-06-17 at 1.21.43 pm.png](/uploads/fecf7e3c85fe2ef60b7f65125899728c/Screenshot_2025-06-17_at_1.21.43_pm.png)
31
- ![image.png](/uploads/88184f5bb5396dd4b87938780c9d1aba/image.png)"
32
- clickview,Player: Allow looping videos,Shale Kuzmanovski,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5666,"# Player
33
- - The player now provides the option for the video to be looped. Note: Turning on play next video will turn off loop video, and vice versa. Implements PLAY-243.
34
-
35
- ![image](/uploads/a3302899794ec21a1fd5d924c7b9a4d8/image.png)
36
- - Fix the casing of the player's menu items."
37
- clickview,Curator: POI form safeguard,Joshua Taylor,Shale Kuzmanovski,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5665,"# Curator
38
- - In the Points of Interest form in the content pipeline, if you manually add/edit a POI and accidentally click on the ""X"", you are shown a warning then asked to click X again before actually closing the form."
39
- clickview,Player: Captions indicator,Shale Kuzmanovski,Boris Berak,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5663,"# Player
40
- - The player will now indicate if captions and theatre mode are switched on. Implements INBOX-8757.
41
-
42
- ![image](/uploads/7a3b9cd1fa69ee27723e153d8ea5c3cc/image.png)"
43
- clickview,Shared - Fix img overflow issue,Nan Chen,Nischal Shrestha,https://gitlab.cvinternal.net/clickview/front-end/clickview/-/merge_requests/5661,"# Lite
44
- - Fix an issue where the images start to overflow the containers on the login page.
45
- ![image](/uploads/497a18019f0c54853c51c8d5ce7b1cf4/image.png)"
46
- File.Api,Support utf8 file name,Ryan Wang,Prad Nepal,https://gitlab.cvinternal.net/clickview/back-end/File.Api/-/merge_requests/65,* Fixed an issue where file uploaded with UTF-8 characters file name have these characters stripped when downloading them. Closes INBOX-9210
47
- Tv.Web,"Add 7twoHd Perth small channel logo, partially implements INBOX-9165",Wei Zong,Ryan Wang,https://gitlab.cvinternal.net/clickview/back-end/tv/Tv.Web/-/merge_requests/255,"* Customer shoud see the new 7twoHD channels in 5 AU resions. The old `7two` channel should be disabled
48
- * Rename `ABC Entertains` to `ABC Entertains HD`
49
- * Rename `ABC News 24` to `ABC News HD`"