@clickview/ship-it 0.0.1
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.
- package/README.md +1 -0
- package/lib/src/api-clients/GitLabApiClient.js +342 -0
- package/lib/src/api-clients/index.js +17 -0
- package/lib/src/commands/BumpPackagesCommand.js +78 -0
- package/lib/src/commands/CreateBranchCommand.js +102 -0
- package/lib/src/commands/CreateMergeRequestCommand.js +109 -0
- package/lib/src/commands/CreateReleaseNotesCommand.js +86 -0
- package/lib/src/commands/ReleaseCommand.js +122 -0
- package/lib/src/commands/StatusCommand.js +78 -0
- package/lib/src/commands/VersionCommand.js +78 -0
- package/lib/src/commands/index.js +23 -0
- package/lib/src/index.js +101 -0
- package/lib/src/interfaces/Config.js +2 -0
- package/lib/src/interfaces/ShipItCommand.js +2 -0
- package/lib/src/interfaces/ShipItOptions.js +2 -0
- package/lib/src/interfaces/ShipItTask.js +2 -0
- package/lib/src/interfaces/index.js +22 -0
- package/lib/src/interfaces/models/Branch.js +2 -0
- package/lib/src/interfaces/models/Commit.js +2 -0
- package/lib/src/interfaces/models/CommitFile.js +2 -0
- package/lib/src/interfaces/models/File.js +2 -0
- package/lib/src/interfaces/models/MergeRequest.js +2 -0
- package/lib/src/interfaces/models/Project.js +2 -0
- package/lib/src/interfaces/models/Tag.js +2 -0
- package/lib/src/interfaces/models/index.js +23 -0
- package/lib/src/interfaces/view-models/MilestoneProject.js +2 -0
- package/lib/src/interfaces/view-models/index.js +17 -0
- package/lib/src/inversify.config.js +48 -0
- package/lib/src/services/GitLabService.js +252 -0
- package/lib/src/services/index.js +17 -0
- package/lib/src/tasks/BumpPackagesTask.js +353 -0
- package/lib/src/tasks/BumpVersionTxtTask.js +115 -0
- package/lib/src/tasks/CreateBranchTask.js +119 -0
- package/lib/src/tasks/CreateMergeRequestTask.js +130 -0
- package/lib/src/tasks/CreateReleaseNotesTask.js +124 -0
- package/lib/src/tasks/ValidateCommitsTask.js +115 -0
- package/lib/src/tasks/ValidateDescriptionsTask.js +118 -0
- package/lib/src/tasks/ValidateTask.js +167 -0
- package/lib/src/tasks/VersionTask.js +111 -0
- package/lib/src/tasks/index.js +25 -0
- package/lib/src/types.js +32 -0
- package/lib/src/utils/BranchNames.js +11 -0
- package/lib/src/utils/Commits.js +33 -0
- package/lib/src/utils/Descriptions.js +162 -0
- package/lib/src/utils/Logger.js +62 -0
- package/lib/src/utils/ProjectIds.js +34 -0
- package/lib/src/utils/Versions.js +20 -0
- package/lib/src/utils/index.js +22 -0
- package/package.json +45 -0
|
@@ -0,0 +1,111 @@
|
|
|
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.VersionTask = void 0;
|
|
52
|
+
require("reflect-metadata");
|
|
53
|
+
var inversify_1 = require("inversify");
|
|
54
|
+
var types_1 = require("../types");
|
|
55
|
+
var services_1 = require("../services");
|
|
56
|
+
var utils_1 = require("../utils");
|
|
57
|
+
var VersionTask = /** @class */ (function () {
|
|
58
|
+
function VersionTask(service) {
|
|
59
|
+
this._service = service;
|
|
60
|
+
}
|
|
61
|
+
VersionTask.prototype.run = function (options) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
63
|
+
var projects, cont, _i, projects_1, project, currentVersionTag, nextVersion;
|
|
64
|
+
return __generator(this, function (_a) {
|
|
65
|
+
switch (_a.label) {
|
|
66
|
+
case 0:
|
|
67
|
+
utils_1.Logger.logTask('Calculating versions');
|
|
68
|
+
return [4 /*yield*/, this._service.getProjects(options)];
|
|
69
|
+
case 1:
|
|
70
|
+
projects = _a.sent();
|
|
71
|
+
if (!projects.length) {
|
|
72
|
+
utils_1.Logger.logError("No projects could be found with the specified options");
|
|
73
|
+
return [2 /*return*/, false];
|
|
74
|
+
}
|
|
75
|
+
cont = true;
|
|
76
|
+
utils_1.Logger.logMessage('Versions:');
|
|
77
|
+
_i = 0, projects_1 = projects;
|
|
78
|
+
_a.label = 2;
|
|
79
|
+
case 2:
|
|
80
|
+
if (!(_i < projects_1.length)) return [3 /*break*/, 5];
|
|
81
|
+
project = projects_1[_i];
|
|
82
|
+
return [4 /*yield*/, this._service.getCurrentVersionTag(project.id)];
|
|
83
|
+
case 3:
|
|
84
|
+
currentVersionTag = _a.sent();
|
|
85
|
+
if (currentVersionTag === null) {
|
|
86
|
+
utils_1.Logger.logError("[NOT FOUND]: ".concat(project.title));
|
|
87
|
+
cont = false;
|
|
88
|
+
return [3 /*break*/, 4];
|
|
89
|
+
}
|
|
90
|
+
nextVersion = utils_1.Versions.getNextVersion(currentVersionTag.name, options.version);
|
|
91
|
+
utils_1.Logger.logMessage("[".concat(nextVersion, "]: ").concat(project.title));
|
|
92
|
+
_a.label = 4;
|
|
93
|
+
case 4:
|
|
94
|
+
_i++;
|
|
95
|
+
return [3 /*break*/, 2];
|
|
96
|
+
case 5:
|
|
97
|
+
if (!cont)
|
|
98
|
+
utils_1.Logger.logError('\nCould not calculate versions for all projects');
|
|
99
|
+
return [2 /*return*/, cont];
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
VersionTask = __decorate([
|
|
105
|
+
(0, inversify_1.injectable)(),
|
|
106
|
+
__param(0, (0, inversify_1.inject)(types_1.SERVICES.GitLabService)),
|
|
107
|
+
__metadata("design:paramtypes", [services_1.GitLabService])
|
|
108
|
+
], VersionTask);
|
|
109
|
+
return VersionTask;
|
|
110
|
+
}());
|
|
111
|
+
exports.VersionTask = VersionTask;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./BumpPackagesTask"), exports);
|
|
18
|
+
__exportStar(require("./BumpVersionTxtTask"), exports);
|
|
19
|
+
__exportStar(require("./CreateBranchTask"), exports);
|
|
20
|
+
__exportStar(require("./CreateMergeRequestTask"), exports);
|
|
21
|
+
__exportStar(require("./CreateReleaseNotesTask"), exports);
|
|
22
|
+
__exportStar(require("./ValidateCommitsTask"), exports);
|
|
23
|
+
__exportStar(require("./ValidateDescriptionsTask"), exports);
|
|
24
|
+
__exportStar(require("./ValidateTask"), exports);
|
|
25
|
+
__exportStar(require("./VersionTask"), exports);
|
package/lib/src/types.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COMMANDS = exports.TASKS = exports.SERVICES = exports.API_CLIENTS = exports.MISC = void 0;
|
|
4
|
+
exports.MISC = {
|
|
5
|
+
GitLabConfig: Symbol.for('GitLabConfig'),
|
|
6
|
+
};
|
|
7
|
+
exports.API_CLIENTS = {
|
|
8
|
+
GitLabApiClient: Symbol.for('GitLabApiClient'),
|
|
9
|
+
};
|
|
10
|
+
exports.SERVICES = {
|
|
11
|
+
GitLabService: Symbol.for('GitLabService'),
|
|
12
|
+
};
|
|
13
|
+
exports.TASKS = {
|
|
14
|
+
ValidateTask: Symbol.for('ValidateTask'),
|
|
15
|
+
VersionTask: Symbol.for('VersionTask'),
|
|
16
|
+
CreateBranchTask: Symbol.for('CreateBranchTask'),
|
|
17
|
+
ValidateCommitsTask: Symbol.for('ValidateCommitsTask'),
|
|
18
|
+
BumpVersionTxtTask: Symbol.for('BumpVersionTxtTask'),
|
|
19
|
+
CreateMergeRequestTask: Symbol.for('CreateMergeRequestTask'),
|
|
20
|
+
ValidateDescriptionsTask: Symbol.for('ValidateDescriptionsTask'),
|
|
21
|
+
CreateReleaseNotesTask: Symbol.for('CreateReleaseNotesTask'),
|
|
22
|
+
BumpPackagesTask: Symbol.for('BumpPackagesTask')
|
|
23
|
+
};
|
|
24
|
+
exports.COMMANDS = {
|
|
25
|
+
StatusCommand: Symbol.for('StatusCommand'),
|
|
26
|
+
VersionCommand: Symbol.for('VersionCommand'),
|
|
27
|
+
ReleaseCommand: Symbol.for('ReleaseCommand'),
|
|
28
|
+
CreateBranchCommand: Symbol.for('CreateBranchCommand'),
|
|
29
|
+
CreateMergeRequestCommand: Symbol.for('CreateMergeRequestCommand'),
|
|
30
|
+
CreateReleaseNotesCommand: Symbol.for('CreateReleaseNotesCommand'),
|
|
31
|
+
BumpPackagesCommand: Symbol.for('BumpPackagesCommand')
|
|
32
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BranchNames = void 0;
|
|
4
|
+
exports.BranchNames = {
|
|
5
|
+
getRelease: function (version) {
|
|
6
|
+
return "release/".concat(version);
|
|
7
|
+
},
|
|
8
|
+
getHotfix: function (version) {
|
|
9
|
+
return "hotfix/".concat(version);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.Commits = void 0;
|
|
15
|
+
exports.Commits = {
|
|
16
|
+
/**
|
|
17
|
+
* Returns true if dev contains commits that are not merge requests being merged in.
|
|
18
|
+
*/
|
|
19
|
+
shouldCherryPick: function (project, commits) {
|
|
20
|
+
var commitKeys = project.mergeRequests.reduce(function (prev, current) {
|
|
21
|
+
var _a;
|
|
22
|
+
if (!current.mergeCommit)
|
|
23
|
+
return prev;
|
|
24
|
+
return __assign(__assign({}, prev), (_a = {}, _a[current.mergeCommit] = true, _a));
|
|
25
|
+
}, {});
|
|
26
|
+
for (var _i = 0, commits_1 = commits; _i < commits_1.length; _i++) {
|
|
27
|
+
var commit = commits_1[_i];
|
|
28
|
+
if (!commitKeys[commit.id])
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Descriptions = void 0;
|
|
4
|
+
// const VALID_HEADINGS: any = {
|
|
5
|
+
// 'dependencies': true,
|
|
6
|
+
// 'before release': true,
|
|
7
|
+
// 'customer changes': true,
|
|
8
|
+
// 'code changes': true,
|
|
9
|
+
// 'testing': true,
|
|
10
|
+
// 'notes': true
|
|
11
|
+
// };
|
|
12
|
+
var VALID_MONOREPO_HEADINGS = {
|
|
13
|
+
'common': true,
|
|
14
|
+
'curator': true,
|
|
15
|
+
'library editor': true,
|
|
16
|
+
'lite': true,
|
|
17
|
+
'online': true,
|
|
18
|
+
'shared': true,
|
|
19
|
+
'styles': true,
|
|
20
|
+
'player': true,
|
|
21
|
+
'reports': true,
|
|
22
|
+
'analytis': true,
|
|
23
|
+
'tooling': true,
|
|
24
|
+
'testing': true,
|
|
25
|
+
'dependencies': true,
|
|
26
|
+
'notes': true
|
|
27
|
+
};
|
|
28
|
+
function toObject(lines, headingPrefix) {
|
|
29
|
+
var obj = [];
|
|
30
|
+
var currentHeading = 'Other';
|
|
31
|
+
for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
|
|
32
|
+
var line = lines_1[_i];
|
|
33
|
+
// Skip empty lines
|
|
34
|
+
if (!line.trim() || line === '/n' || line.toLowerCase().trim() === 'n/a')
|
|
35
|
+
continue;
|
|
36
|
+
if (line.startsWith(headingPrefix + ' ')) {
|
|
37
|
+
// TODO: Potentially add heading transforms to capture multiple variants
|
|
38
|
+
currentHeading = line.toLowerCase().replace(headingPrefix, '').trim();
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!obj[currentHeading])
|
|
42
|
+
obj[currentHeading] = '';
|
|
43
|
+
/**
|
|
44
|
+
* Our images need an extra line return so they don't get squished against our dot points
|
|
45
|
+
*/
|
|
46
|
+
if (line.startsWith('!'))
|
|
47
|
+
obj[currentHeading] += '\n';
|
|
48
|
+
obj[currentHeading] += line + '\n';
|
|
49
|
+
}
|
|
50
|
+
return obj;
|
|
51
|
+
}
|
|
52
|
+
exports.Descriptions = {
|
|
53
|
+
isDescriptionValid: function (description, headingPrefix) {
|
|
54
|
+
if (headingPrefix === void 0) { headingPrefix = '#'; }
|
|
55
|
+
if (!description.trim())
|
|
56
|
+
return false;
|
|
57
|
+
var obj = toObject(description.split('\n'), headingPrefix);
|
|
58
|
+
var keys = Object.keys(obj);
|
|
59
|
+
if (!(keys === null || keys === void 0 ? void 0 : keys.length))
|
|
60
|
+
return false;
|
|
61
|
+
// TODO: Uncomment below once the team is writing good MR descriptions
|
|
62
|
+
// if (keys.some(k => !VALID_HEADINGS[k]))
|
|
63
|
+
// return false;
|
|
64
|
+
// if (!obj['testing'])
|
|
65
|
+
// return false;
|
|
66
|
+
return true;
|
|
67
|
+
},
|
|
68
|
+
isMonorepoDescriptionValid: function (description) {
|
|
69
|
+
if (!description.trim())
|
|
70
|
+
return false;
|
|
71
|
+
var obj = toObject(description.split('\n'), '#');
|
|
72
|
+
var keys = Object.keys(obj);
|
|
73
|
+
if (!(keys === null || keys === void 0 ? void 0 : keys.length))
|
|
74
|
+
return false;
|
|
75
|
+
if (keys.some(function (k) { return !VALID_MONOREPO_HEADINGS[k]; }))
|
|
76
|
+
return false;
|
|
77
|
+
// TODO: Uncomment below once the team is writing good MR descriptions
|
|
78
|
+
// if (!obj['testing'])
|
|
79
|
+
// return false;
|
|
80
|
+
var isValid = Object.keys(obj).every(function (key) {
|
|
81
|
+
if (key !== 'dependencies' && key !== 'testing')
|
|
82
|
+
return true;
|
|
83
|
+
return exports.Descriptions.isDescriptionValid(obj[key], '##');
|
|
84
|
+
});
|
|
85
|
+
return isValid;
|
|
86
|
+
},
|
|
87
|
+
getCombinedDescription: function (mergeRequests, headingPrefix) {
|
|
88
|
+
if (headingPrefix === void 0) { headingPrefix = '#'; }
|
|
89
|
+
var descriptionObjs = mergeRequests
|
|
90
|
+
.filter(function (mr) { return mr.status === 'merged'; })
|
|
91
|
+
.map(function (mr) { return toObject(mr.description.split('\n'), headingPrefix); });
|
|
92
|
+
var obj = [];
|
|
93
|
+
var _loop_1 = function (descriptionObj) {
|
|
94
|
+
Object.keys(descriptionObj).forEach(function (key) {
|
|
95
|
+
if (!obj[key])
|
|
96
|
+
obj[key] = '';
|
|
97
|
+
obj[key] += descriptionObj[key] + '\n';
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
for (var _i = 0, descriptionObjs_1 = descriptionObjs; _i < descriptionObjs_1.length; _i++) {
|
|
101
|
+
var descriptionObj = descriptionObjs_1[_i];
|
|
102
|
+
_loop_1(descriptionObj);
|
|
103
|
+
}
|
|
104
|
+
var description = '';
|
|
105
|
+
Object.keys(obj).forEach(function (key) {
|
|
106
|
+
if (key === 'notes')
|
|
107
|
+
return;
|
|
108
|
+
description += '\n' + headingPrefix + ' ' + key.charAt(0).toUpperCase() + key.slice(1) + '\n';
|
|
109
|
+
description += obj[key];
|
|
110
|
+
});
|
|
111
|
+
return description;
|
|
112
|
+
},
|
|
113
|
+
// TODO: This isn't readable, it needs to be refactored
|
|
114
|
+
getMonorepoCombinedDescription: function (mergeRequests) {
|
|
115
|
+
// Get an object where H1s are properties
|
|
116
|
+
var descriptionObjs = mergeRequests
|
|
117
|
+
.filter(function (mr) { return mr.status === 'merged'; })
|
|
118
|
+
.map(function (mr) { return toObject(mr.description.split('\n'), '#'); });
|
|
119
|
+
var combinedObj = [];
|
|
120
|
+
var _loop_2 = function (descriptionObj) {
|
|
121
|
+
Object.keys(descriptionObj).forEach(function (key) {
|
|
122
|
+
if (!combinedObj[key])
|
|
123
|
+
combinedObj[key] = {};
|
|
124
|
+
var combinedSubObj = toObject(descriptionObj[key].split('\n'), '##');
|
|
125
|
+
Object.keys(combinedSubObj).forEach(function (subKey) {
|
|
126
|
+
if (!combinedObj[key][subKey])
|
|
127
|
+
combinedObj[key][subKey] = '';
|
|
128
|
+
combinedObj[key][subKey] += combinedSubObj[subKey];
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
// For each property in each MR object, calculate it's H2 heading objects
|
|
133
|
+
for (var _i = 0, descriptionObjs_2 = descriptionObjs; _i < descriptionObjs_2.length; _i++) {
|
|
134
|
+
var descriptionObj = descriptionObjs_2[_i];
|
|
135
|
+
_loop_2(descriptionObj);
|
|
136
|
+
}
|
|
137
|
+
// Build our description
|
|
138
|
+
var description = '';
|
|
139
|
+
Object.keys(combinedObj).forEach(function (key) {
|
|
140
|
+
if (key === 'notes')
|
|
141
|
+
return;
|
|
142
|
+
description += '\n# ' + key.charAt(0).toUpperCase() + key.slice(1) + '\n';
|
|
143
|
+
Object.keys(combinedObj[key]).forEach(function (subKey) {
|
|
144
|
+
if (key !== 'dependencies' && key !== 'testing')
|
|
145
|
+
description += '\n## ' + subKey.charAt(0).toUpperCase() + subKey.slice(1) + '\n';
|
|
146
|
+
description += combinedObj[key][subKey];
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
return description;
|
|
150
|
+
},
|
|
151
|
+
bumpHeadings: function (description) {
|
|
152
|
+
var lines = description.split('\n');
|
|
153
|
+
var bumpedDescription = '';
|
|
154
|
+
lines.forEach(function (line) {
|
|
155
|
+
if (line.startsWith('#'))
|
|
156
|
+
bumpedDescription += '#' + line + '\n';
|
|
157
|
+
else
|
|
158
|
+
bumpedDescription += line + '\n';
|
|
159
|
+
});
|
|
160
|
+
return bumpedDescription;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Logger = void 0;
|
|
16
|
+
require("reflect-metadata");
|
|
17
|
+
var chalk_1 = __importDefault(require("chalk"));
|
|
18
|
+
exports.Logger = {
|
|
19
|
+
logSuccess: function (message) {
|
|
20
|
+
var optionalParams = [];
|
|
21
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
22
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
23
|
+
}
|
|
24
|
+
console.log(chalk_1.default.green.apply(chalk_1.default, __spreadArray([message], optionalParams, false)));
|
|
25
|
+
},
|
|
26
|
+
logInfo: function (message) {
|
|
27
|
+
var optionalParams = [];
|
|
28
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
29
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
30
|
+
}
|
|
31
|
+
console.log(chalk_1.default.grey.apply(chalk_1.default, __spreadArray([message], optionalParams, false)));
|
|
32
|
+
},
|
|
33
|
+
logMessage: function (message) {
|
|
34
|
+
var optionalParams = [];
|
|
35
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
36
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
37
|
+
}
|
|
38
|
+
console.log(chalk_1.default.white.apply(chalk_1.default, __spreadArray([message], optionalParams, false)));
|
|
39
|
+
},
|
|
40
|
+
logWarning: function (message) {
|
|
41
|
+
var optionalParams = [];
|
|
42
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
43
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
44
|
+
}
|
|
45
|
+
console.log(chalk_1.default.yellow.apply(chalk_1.default, __spreadArray([message], optionalParams, false)));
|
|
46
|
+
},
|
|
47
|
+
logError: function (message) {
|
|
48
|
+
var optionalParams = [];
|
|
49
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
50
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
51
|
+
}
|
|
52
|
+
console.log(chalk_1.default.red.apply(chalk_1.default, __spreadArray([message], optionalParams, false)));
|
|
53
|
+
},
|
|
54
|
+
logJson: function (json) {
|
|
55
|
+
console.log(json);
|
|
56
|
+
},
|
|
57
|
+
logTask: function (title) {
|
|
58
|
+
exports.Logger.logInfo('\n-------------------------------------');
|
|
59
|
+
exports.Logger.logInfo(title);
|
|
60
|
+
exports.Logger.logInfo('-------------------------------------\n');
|
|
61
|
+
}
|
|
62
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// TODO: Eventually this should allow us to map project names to project ids
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ProjectIds = void 0;
|
|
8
|
+
var lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
var PROJECT_NAMES = {
|
|
10
|
+
monorepo: '789',
|
|
11
|
+
online: '109',
|
|
12
|
+
curator: '62',
|
|
13
|
+
cloud: '534',
|
|
14
|
+
reports: '970',
|
|
15
|
+
lite: '822'
|
|
16
|
+
};
|
|
17
|
+
exports.ProjectIds = {
|
|
18
|
+
MONOREPO_PROJECT_ID: '798',
|
|
19
|
+
getProjectIds: function (projects) {
|
|
20
|
+
var projectIds = [];
|
|
21
|
+
for (var _i = 0, projects_1 = projects; _i < projects_1.length; _i++) {
|
|
22
|
+
var project = projects_1[_i];
|
|
23
|
+
if (lodash_1.default.isNumber(project)) {
|
|
24
|
+
projectIds.push(project);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
var mappedId = PROJECT_NAMES[project.toLowerCase()];
|
|
28
|
+
if (!mappedId)
|
|
29
|
+
throw new Error("Could not find project id mapping for ".concat(project));
|
|
30
|
+
projectIds.push(mappedId);
|
|
31
|
+
}
|
|
32
|
+
return projectIds;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Versions = void 0;
|
|
7
|
+
var semver_1 = __importDefault(require("semver"));
|
|
8
|
+
exports.Versions = {
|
|
9
|
+
getNextVersion: function (currentVersion, type) {
|
|
10
|
+
var curr = new semver_1.default.SemVer(currentVersion);
|
|
11
|
+
switch (type) {
|
|
12
|
+
case 'major':
|
|
13
|
+
return "".concat(curr.major + 1, ".0.0");
|
|
14
|
+
case 'minor':
|
|
15
|
+
return "".concat(curr.major, ".").concat(curr.minor + 1, ".0");
|
|
16
|
+
case 'patch':
|
|
17
|
+
return "".concat(curr.major, ".").concat(curr.minor, ".").concat(curr.patch + 1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./BranchNames"), exports);
|
|
18
|
+
__exportStar(require("./Commits"), exports);
|
|
19
|
+
__exportStar(require("./Descriptions"), exports);
|
|
20
|
+
__exportStar(require("./Logger"), exports);
|
|
21
|
+
__exportStar(require("./ProjectIds"), exports);
|
|
22
|
+
__exportStar(require("./Versions"), exports);
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@clickview/ship-it",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Release Manager",
|
|
5
|
+
"main": "./lib/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ship-it": "./lib/src/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "npm run lint && ts-node src/index.ts",
|
|
11
|
+
"build": "npm run lint && tsc -p . && tsc-alias -p tsconfig.json",
|
|
12
|
+
"lint": "eslint . --ext .ts"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://gitlab.cvinternal.net/front-end/ship-it.git"
|
|
17
|
+
},
|
|
18
|
+
"author": "Joshua Taylor, Shale Kuzmanovski",
|
|
19
|
+
"license": "ISC",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@gitbeaker/node": "^35.6.0",
|
|
22
|
+
"chalk": "^4.1.2",
|
|
23
|
+
"commander": "^9.1.0",
|
|
24
|
+
"fs-extra": "^10.0.1",
|
|
25
|
+
"inversify": "^6.0.1",
|
|
26
|
+
"lodash": "^4.17.21",
|
|
27
|
+
"reflect-metadata": "^0.1.13",
|
|
28
|
+
"semver": "^7.3.5"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@clickview/eslint-config": "^1.0.3",
|
|
32
|
+
"@types/fs-extra": "^9.0.13",
|
|
33
|
+
"@types/lodash": "^4.14.181",
|
|
34
|
+
"@types/node": "^17.0.23",
|
|
35
|
+
"@types/semver": "^7.3.9",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^5.17.0",
|
|
37
|
+
"@typescript-eslint/parser": "^5.17.0",
|
|
38
|
+
"eslint": "^8.12.0",
|
|
39
|
+
"eslint-plugin-react-hooks": "^4.4.0",
|
|
40
|
+
"ts-node": "^10.7.0",
|
|
41
|
+
"tsc-alias": "^1.6.6",
|
|
42
|
+
"tsconfig-paths": "^3.14.1",
|
|
43
|
+
"typescript": "^4.6.3"
|
|
44
|
+
}
|
|
45
|
+
}
|