@clickview/ship-it 0.0.4-dev.5 → 0.0.4

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 (27) hide show
  1. package/lib/src/api-clients/git-lab/GitLabApiClient.js +65 -0
  2. package/lib/src/api-clients/git-lab/GitLabMapper.js +18 -1
  3. package/lib/src/commands/ReleaseCommand.js +11 -7
  4. package/lib/src/commands/{CommitPackageVersionsCommand.js → TagMasterCommand.js} +13 -15
  5. package/lib/src/commands/index.js +1 -0
  6. package/lib/src/constants/CommandTypeMapping.js +2 -1
  7. package/lib/src/interfaces/models/index.js +2 -0
  8. package/lib/src/inversify.config.js +2 -0
  9. package/lib/src/services/GitLabService.js +114 -8
  10. package/lib/src/startup/SetupCommands.js +23 -11
  11. package/lib/src/tasks/BumpPackagesTask.js +1 -2
  12. package/lib/src/tasks/CommitPackageVersionsTask.js +4 -0
  13. package/lib/src/tasks/CreateBranchTask.js +19 -37
  14. package/lib/src/tasks/{CommitLocalPackagesTask.js → TagMasterTask.js} +56 -71
  15. package/lib/src/tasks/ValidateDescriptionsTask.js +15 -11
  16. package/lib/src/tasks/ValidateMergeRequestTask.js +12 -6
  17. package/lib/src/tasks/ValidateTask.js +4 -4
  18. package/lib/src/tasks/index.js +1 -0
  19. package/lib/src/types.js +4 -2
  20. package/lib/src/utils/BranchNames.js +0 -2
  21. package/lib/src/utils/ProjectIds.js +1 -5
  22. package/lib/src/utils/Versions.js +0 -1
  23. package/package.json +1 -1
  24. package/lib/src/api-clients/GitLabApiClient.js +0 -342
  25. package/lib/src/interfaces/command-options/InstallPackagesCommandOptions.js +0 -2
  26. /package/lib/src/interfaces/{ShipItOptions.js → models/Label.js} +0 -0
  27. /package/lib/src/interfaces/{command-options/CommitPackageVersionsCommandOptions.js → models/Release.js} +0 -0
@@ -47,91 +47,76 @@ 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
- exports.CommitLocalPackagesTask = void 0;
51
+ exports.TagMasterTask = void 0;
55
52
  require("reflect-metadata");
56
- var fs_1 = __importDefault(require("fs"));
57
53
  var inversify_1 = require("inversify");
54
+ var Logger_1 = require("../utils/Logger");
58
55
  var types_1 = require("../types");
59
56
  var services_1 = require("../services");
60
- var MonorepoPackageJsonFiles_1 = require("../constants/MonorepoPackageJsonFiles");
61
- var utils_1 = require("../utils");
62
- var CommitLocalPackagesTask = /** @class */ (function () {
63
- function CommitLocalPackagesTask(service) {
57
+ var TagMasterTask = /** @class */ (function () {
58
+ function TagMasterTask(service) {
64
59
  this.service = service;
65
60
  }
66
- CommitLocalPackagesTask.prototype.run = function (options) {
61
+ TagMasterTask.prototype.run = function (options) {
67
62
  return __awaiter(this, void 0, void 0, function () {
68
- var mergeRequest, commitFiles;
69
- return __generator(this, function (_a) {
70
- switch (_a.label) {
63
+ var projects, cont, _i, projects_1, project, _a, branchName, nextVersion, mergeRequest, existingTag;
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
71
66
  case 0:
72
- utils_1.Logger.logTask('Committing clickview npm package versions');
73
- return [4 /*yield*/, this.service.getMergeRequest(utils_1.ProjectIds.MONOREPO_PROJECT_ID, options.branchName)];
67
+ Logger_1.Logger.logTask('Tagging master');
68
+ return [4 /*yield*/, this.service.getProjects(options)];
74
69
  case 1:
75
- mergeRequest = _a.sent();
76
- return [4 /*yield*/, this.getCommitFiles()];
70
+ projects = _b.sent();
71
+ cont = true;
72
+ _i = 0, projects_1 = projects;
73
+ _b.label = 2;
77
74
  case 2:
78
- commitFiles = _a.sent();
79
- console.log('commit files', commitFiles);
80
- // await this.service.commit(
81
- // ProjectIds.MONOREPO_PROJECT_ID,
82
- // options.branchName,
83
- // 'Bump package versions',
84
- // commitFiles
85
- // );
86
- return [2 /*return*/, true];
87
- }
88
- });
89
- });
90
- };
91
- CommitLocalPackagesTask.prototype.getCommitFiles = function () {
92
- return __awaiter(this, void 0, void 0, function () {
93
- var commitFiles, _i, MONOREPO_PACKAGE_JSON_FILES_1, filePath;
94
- return __generator(this, function (_a) {
95
- commitFiles = [];
96
- for (_i = 0, MONOREPO_PACKAGE_JSON_FILES_1 = MonorepoPackageJsonFiles_1.MONOREPO_PACKAGE_JSON_FILES; _i < MONOREPO_PACKAGE_JSON_FILES_1.length; _i++) {
97
- filePath = MONOREPO_PACKAGE_JSON_FILES_1[_i];
98
- console.log('reading file', filePath);
99
- commitFiles.push({
100
- filePath: filePath,
101
- content: fs_1.default.readFileSync(filePath, { encoding: 'utf8' })
102
- });
75
+ if (!(_i < projects_1.length)) return [3 /*break*/, 8];
76
+ project = projects_1[_i];
77
+ return [4 /*yield*/, this.service.getNextBranchInfo(project.id, options.version)];
78
+ case 3:
79
+ _a = _b.sent(), branchName = _a.branchName, nextVersion = _a.nextVersion;
80
+ return [4 /*yield*/, this.service.getMergeRequest(project.id, branchName)];
81
+ case 4:
82
+ mergeRequest = _b.sent();
83
+ if (!(mergeRequest === null || mergeRequest === void 0 ? void 0 : mergeRequest.mergeCommit)) {
84
+ Logger_1.Logger.logError("[".concat(project.title, "]: [").concat(branchName, "] has not been merged"));
85
+ cont = false;
86
+ return [3 /*break*/, 7];
87
+ }
88
+ return [4 /*yield*/, this.service.getTag(project.id, nextVersion)];
89
+ case 5:
90
+ existingTag = _b.sent();
91
+ if (existingTag) {
92
+ Logger_1.Logger.logWarning("[".concat(project.title, "]: [").concat(existingTag.name, "] tag already exists"));
93
+ cont = false;
94
+ return [3 /*break*/, 7];
95
+ }
96
+ return [4 /*yield*/, this.service.createRelease(project.id, {
97
+ name: "".concat(options.milestone, " Release"),
98
+ tag: nextVersion,
99
+ description: mergeRequest.description,
100
+ ref: mergeRequest.mergeCommit,
101
+ milestones: [options.milestone]
102
+ })];
103
+ case 6:
104
+ _b.sent();
105
+ Logger_1.Logger.logWarning("[".concat(project.title, "]: [").concat(nextVersion, "] was created"));
106
+ _b.label = 7;
107
+ case 7:
108
+ _i++;
109
+ return [3 /*break*/, 2];
110
+ case 8: return [2 /*return*/, cont];
103
111
  }
104
- return [2 /*return*/, commitFiles];
105
112
  });
106
113
  });
107
114
  };
108
- CommitLocalPackagesTask = __decorate([
109
- inversify_1.injectable(),
110
- __param(0, inversify_1.inject(types_1.SERVICES.GitLabService)),
115
+ TagMasterTask = __decorate([
116
+ (0, inversify_1.injectable)(),
117
+ __param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
111
118
  __metadata("design:paramtypes", [services_1.GitLabService])
112
- ], CommitLocalPackagesTask);
113
- return CommitLocalPackagesTask;
119
+ ], TagMasterTask);
120
+ return TagMasterTask;
114
121
  }());
115
- exports.CommitLocalPackagesTask = CommitLocalPackagesTask;
116
- // function getPackageJsonPaths(): string[] {
117
- // const packageJsonPaths: string[] = [];
118
- // // Walk through the file system and push the path of each package.json file to the array
119
- // function findPackageJsonPathsInDirectory(startPath: string) {
120
- // const files = fs.readdirSync(startPath);
121
- // files.forEach(file => {
122
- // const filename = path.join(startPath, file);
123
- // const stat = fs.lstatSync(filename);
124
- // if (stat.isDirectory())
125
- // return findPackageJsonPathsInDirectory(filename);
126
- // if (!filename.includes('package.json'))
127
- // return;
128
- // // Ignore any `package.json` files found under `node_modules`
129
- // if (filename.includes('node_modules'))
130
- // return;
131
- // packageJsonPaths.push(filename);
132
- // });
133
- // };
134
- // const packagesRoot = path.resolve(__dirname, '../../../packages');
135
- // findPackageJsonPathsInDirectory(packagesRoot); // Start from the `/packages` folder
136
- // return packageJsonPaths;
137
- // }
122
+ exports.TagMasterTask = TagMasterTask;
@@ -63,15 +63,16 @@ var ValidateDescriptionsTask = /** @class */ (function () {
63
63
  this.service = service;
64
64
  }
65
65
  ValidateDescriptionsTask.prototype.run = function (options) {
66
+ var _a;
66
67
  return __awaiter(this, void 0, void 0, function () {
67
- var projects, cont, _i, projects_1, project, invalidMrs, mergeRequestsTargetingDev, _a, mergeRequestsTargetingDev_1, mr, isDescriptionValid, groupedByUser, key, _b, _c, mr;
68
- return __generator(this, function (_d) {
69
- switch (_d.label) {
68
+ var projects, cont, _i, projects_1, project, invalidMrs, mergeRequestsTargetingDev, _b, mergeRequestsTargetingDev_1, mr, isMonorepo, isMrValid, groupedByUser, key, _c, _d, mr;
69
+ return __generator(this, function (_e) {
70
+ switch (_e.label) {
70
71
  case 0:
71
72
  utils_1.Logger.logTask('Validating descriptions');
72
73
  return [4 /*yield*/, this.service.getProjects(options)];
73
74
  case 1:
74
- projects = _d.sent();
75
+ projects = _e.sent();
75
76
  cont = true;
76
77
  for (_i = 0, projects_1 = projects; _i < projects_1.length; _i++) {
77
78
  project = projects_1[_i];
@@ -79,21 +80,24 @@ var ValidateDescriptionsTask = /** @class */ (function () {
79
80
  mergeRequestsTargetingDev = project.mergeRequests.filter(function (mergeRequest) {
80
81
  return mergeRequest.targetBranch === 'dev';
81
82
  });
82
- for (_a = 0, mergeRequestsTargetingDev_1 = mergeRequestsTargetingDev; _a < mergeRequestsTargetingDev_1.length; _a++) {
83
- mr = mergeRequestsTargetingDev_1[_a];
84
- isDescriptionValid = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID ?
83
+ for (_b = 0, mergeRequestsTargetingDev_1 = mergeRequestsTargetingDev; _b < mergeRequestsTargetingDev_1.length; _b++) {
84
+ mr = mergeRequestsTargetingDev_1[_b];
85
+ isMonorepo = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID;
86
+ isMrValid = isMonorepo ?
85
87
  utils_1.Descriptions.isMonorepoDescriptionValid(mr.description) :
86
88
  utils_1.Descriptions.isDescriptionValid(mr.description);
87
- if (!isDescriptionValid)
89
+ if (isMonorepo && !((_a = mr.labels) === null || _a === void 0 ? void 0 : _a.length))
90
+ isMrValid = false;
91
+ if (!isMrValid)
88
92
  invalidMrs.push(mr);
89
93
  }
90
94
  if (invalidMrs.length) {
91
- utils_1.Logger.logError("\n[".concat(project.title, "] has invalid MR descriptions"));
95
+ utils_1.Logger.logError("\n[".concat(project.title, "] has invalid MRs"));
92
96
  groupedByUser = lodash_1.default.groupBy(invalidMrs, function (mr) { return mr.author; });
93
97
  for (key in groupedByUser) {
94
98
  utils_1.Logger.logMessage(key);
95
- for (_b = 0, _c = groupedByUser[key]; _b < _c.length; _b++) {
96
- mr = _c[_b];
99
+ for (_c = 0, _d = groupedByUser[key]; _c < _d.length; _c++) {
100
+ mr = _d[_c];
97
101
  utils_1.Logger.logMessage("- ".concat(mr.url));
98
102
  }
99
103
  }
@@ -60,19 +60,20 @@ var ValidateMergeRequestTask = /** @class */ (function () {
60
60
  this.service = service;
61
61
  }
62
62
  ValidateMergeRequestTask.prototype.run = function (options) {
63
+ var _a;
63
64
  return __awaiter(this, void 0, void 0, function () {
64
- var project, mergeRequestId, mergeRequest, isDescriptionValid;
65
- return __generator(this, function (_a) {
66
- switch (_a.label) {
65
+ var project, mergeRequestId, mergeRequest, isMonorepo, isDescriptionValid;
66
+ return __generator(this, function (_b) {
67
+ switch (_b.label) {
67
68
  case 0:
68
69
  Logger_1.Logger.logTask('Validating Merge Request');
69
70
  return [4 /*yield*/, this.service.getProject(options.projectId)];
70
71
  case 1:
71
- project = _a.sent();
72
+ project = _b.sent();
72
73
  mergeRequestId = options.branchName.replace('merge-requests/', '');
73
74
  return [4 /*yield*/, this.service.getMergeRequestById(project.id, mergeRequestId)];
74
75
  case 2:
75
- mergeRequest = _a.sent();
76
+ mergeRequest = _b.sent();
76
77
  if (!mergeRequest) {
77
78
  Logger_1.Logger.logError("Could not find merge request [".concat(project.title, "]: [").concat(options.branchName, "]"));
78
79
  return [2 /*return*/, false];
@@ -85,7 +86,12 @@ var ValidateMergeRequestTask = /** @class */ (function () {
85
86
  Logger_1.Logger.logError("Merge request does not have a milestone");
86
87
  return [2 /*return*/, false];
87
88
  }
88
- isDescriptionValid = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID ?
89
+ isMonorepo = project.id.toString() === utils_1.ProjectIds.MONOREPO_PROJECT_ID;
90
+ if (isMonorepo && !((_a = mergeRequest.labels) === null || _a === void 0 ? void 0 : _a.length)) {
91
+ Logger_1.Logger.logError('Monorepo MRs must have labels');
92
+ return [2 /*return*/, false];
93
+ }
94
+ isDescriptionValid = isMonorepo ?
89
95
  utils_1.Descriptions.isMonorepoDescriptionValid(mergeRequest.description) :
90
96
  utils_1.Descriptions.isDescriptionValid(mergeRequest.description);
91
97
  if (!isDescriptionValid) {
@@ -86,7 +86,7 @@ var ValidateTask = /** @class */ (function () {
86
86
  utils_1.Logger.logMessage("Found ".concat(projects.length, " projects that need to be released"));
87
87
  cont = true;
88
88
  _loop_1 = function (project) {
89
- var groupedMRs = lodash_1.default.groupBy(project.mergeRequests.filter(function (mr) { return mr.targetBranch !== 'master'; }), function (mr) { return mr.status; });
89
+ var groupedMRs = lodash_1.default.groupBy(project.mergeRequests, function (mr) { return mr.status; });
90
90
  var count = Object.keys(groupedMRs).reduce(function (prev, current) {
91
91
  var _a;
92
92
  return __assign(__assign({}, prev), (_a = {}, _a[current] = groupedMRs[current].length, _a));
@@ -95,7 +95,7 @@ var ValidateTask = /** @class */ (function () {
95
95
  /**
96
96
  * Any MRs that are not targeting dev should not have a milestone
97
97
  */
98
- var nonDevMrs = project.mergeRequests.filter(function (mr) { return mr.targetBranch !== 'dev' && mr.targetBranch !== 'master'; });
98
+ var nonDevMrs = project.mergeRequests.filter(function (mr) { return mr.targetBranch !== 'dev'; });
99
99
  if (nonDevMrs.length)
100
100
  ready = false;
101
101
  if (!ready)
@@ -132,8 +132,8 @@ var ValidateTask = /** @class */ (function () {
132
132
  var allNonDevMrs = [];
133
133
  for (var _i = 0, projects_2 = projects; _i < projects_2.length; _i++) {
134
134
  var project = projects_2[_i];
135
- var notReadyMrs = project.mergeRequests.filter(function (mr) { return mr.status === 'opened' && mr.targetBranch !== 'master'; });
136
- var nonDevMrs = project.mergeRequests.filter(function (mr) { return mr.targetBranch !== 'dev' && mr.targetBranch !== 'master'; });
135
+ var notReadyMrs = project.mergeRequests.filter(function (mr) { return mr.status === 'opened'; });
136
+ var nonDevMrs = project.mergeRequests.filter(function (mr) { return mr.targetBranch !== 'dev'; });
137
137
  if (notReadyMrs.length)
138
138
  allNotReadyMrs.push.apply(allNotReadyMrs, notReadyMrs);
139
139
  if (nonDevMrs.length)
@@ -23,6 +23,7 @@ __exportStar(require("./CreateReleaseNotesTask"), exports);
23
23
  __exportStar(require("./InstallPackagesTask"), exports);
24
24
  __exportStar(require("./StartConsumingProjectBuildsTask"), exports);
25
25
  __exportStar(require("./StartMonorepoBuildTask"), exports);
26
+ __exportStar(require("./TagMasterTask"), exports);
26
27
  __exportStar(require("./ValidateCommitsTask"), exports);
27
28
  __exportStar(require("./ValidateDescriptionsTask"), exports);
28
29
  __exportStar(require("./ValidateMergeRequestTask"), exports);
package/lib/src/types.js CHANGED
@@ -25,9 +25,10 @@ exports.TASKS = {
25
25
  InstallPackagesTask: Symbol.for('InstallPackagesTask'),
26
26
  BumpPackagesTask: Symbol.for('BumpPackagesTask'),
27
27
  CommitPackageVersionsTask: Symbol.for('CommitPackageVersionsTask'),
28
+ ValidateMergeRequestTask: Symbol.for('ValidateMergeRequestTask'),
28
29
  StartMonorepoBuildTask: Symbol.for('StartMonorepoBuildTask'),
29
30
  StartConsumingProjectBuildsTask: Symbol.for('StartConsumingProjectBuildsTask'),
30
- ValidateMergeRequestTask: Symbol.for('ValidateMergeRequestTask')
31
+ TagMasterTask: Symbol.for('TagMasterTask')
31
32
  };
32
33
  exports.COMMANDS = {
33
34
  StatusCommand: Symbol.for('StatusCommand'),
@@ -38,6 +39,7 @@ exports.COMMANDS = {
38
39
  CreateReleaseNotesCommand: Symbol.for('CreateReleaseNotesCommand'),
39
40
  InstallPackagesCommand: Symbol.for('InstallPackagesCommand'),
40
41
  BumpPackagesCommand: Symbol.for('BumpPackagesCommand'),
42
+ ValidateMergeRequestCommand: Symbol.for('ValidateMergeRequestCommand'),
41
43
  StartConsumingProjectBuildsCommand: Symbol.for('StartConsumingProjectBuildsCommand'),
42
- ValidateMergeRequestCommand: Symbol.for('ValidateMergeRequestCommand')
44
+ TagMasterCommand: Symbol.for('TagMasterCommand')
43
45
  };
@@ -3,11 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BranchNames = void 0;
4
4
  exports.BranchNames = {
5
5
  getRelease: function (version) {
6
- return 'release/9.9.9';
7
6
  return "release/".concat(version);
8
7
  },
9
8
  getHotfix: function (version) {
10
- return 'hotfix/9.9.9';
11
9
  return "hotfix/".concat(version);
12
10
  }
13
11
  };
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.ProjectIds = exports.PROJECT_NAMES = void 0;
7
- var lodash_1 = __importDefault(require("lodash"));
8
4
  var errors_1 = require("../errors");
9
5
  exports.PROJECT_NAMES = {
10
6
  monorepo: '798',
@@ -24,7 +20,7 @@ exports.ProjectIds = {
24
20
  var projectIds = [];
25
21
  for (var _i = 0, projects_1 = projects; _i < projects_1.length; _i++) {
26
22
  var project = projects_1[_i];
27
- if (lodash_1.default.isNumber(project)) {
23
+ if (!isNaN(+project)) {
28
24
  projectIds.push(project);
29
25
  continue;
30
26
  }
@@ -7,7 +7,6 @@ exports.Versions = void 0;
7
7
  var semver_1 = __importDefault(require("semver"));
8
8
  exports.Versions = {
9
9
  getNextVersion: function (currentVersion, type) {
10
- return '9.9.9';
11
10
  var curr = new semver_1.default.SemVer(currentVersion);
12
11
  switch (type) {
13
12
  case 'major':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clickview/ship-it",
3
- "version": "0.0.4-dev.5",
3
+ "version": "0.0.4",
4
4
  "description": "Release Manager",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {