1 | const fs = require('fs');
|
2 | const { EOL } = require('os');
|
3 | const _ = require('lodash');
|
4 | const gitUrlParse = require('git-url-parse');
|
5 | const semver = require('semver');
|
6 | const { TimeoutError } = require('./errors');
|
7 |
|
8 | const format = (template = '', context = {}) => {
|
9 | template = template.startsWith('git log')
|
10 | ? template.replace('[REV_RANGE]', '${latestTag}...HEAD')
|
11 | : template.replace(/%s/g, '${version}');
|
12 | return _.template(template)(context);
|
13 | };
|
14 |
|
15 | const truncateLines = (input, maxLines = 10, surplusText = null) => {
|
16 | const lines = input.split(EOL);
|
17 | const surplus = lines.length - maxLines;
|
18 | const output = lines.slice(0, maxLines).join(EOL);
|
19 | return surplus > 0 ? (surplusText ? `${output}${surplusText}` : `${output}${EOL}...and ${surplus} more`) : output;
|
20 | };
|
21 |
|
22 | const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
|
23 |
|
24 | const rejectAfter = ms =>
|
25 | wait(ms).then(() => {
|
26 | throw new TimeoutError(`Timed out after ${ms}ms.`);
|
27 | });
|
28 |
|
29 | const parseGitUrl = remoteUrl => {
|
30 | const normalizedUrl = remoteUrl.replace(/\\/g, '/');
|
31 | const parsedUrl = gitUrlParse(normalizedUrl);
|
32 | const { resource: host, name: project, protocol, href: remote } = parsedUrl;
|
33 | const owner = protocol === 'file' ? _.last(parsedUrl.owner.split('/')) : parsedUrl.owner;
|
34 | const repository = `${owner}/${project}`;
|
35 | return { host, owner, project, protocol, remote, repository };
|
36 | };
|
37 |
|
38 | const reduceUntil = async (collection, fn) => {
|
39 | let result;
|
40 | for (const item of collection) {
|
41 | if (result) break;
|
42 | result = await fn(item);
|
43 | }
|
44 | return result;
|
45 | };
|
46 |
|
47 | const hasAccess = path => {
|
48 | try {
|
49 | fs.accessSync(path);
|
50 | return true;
|
51 | } catch (err) {
|
52 | return false;
|
53 | }
|
54 | };
|
55 |
|
56 | const parseVersion = raw => {
|
57 | if (!raw) return { version: null, isPreRelease: false, preReleaseId: null };
|
58 | const version = semver.valid(raw) ? raw : semver.coerce(raw);
|
59 | const parsed = new semver(version);
|
60 | const isPreRelease = parsed.prerelease.length > 0;
|
61 | const preReleaseId = isPreRelease && isNaN(parsed.prerelease[0]) ? parsed.prerelease[0] : null;
|
62 | return {
|
63 | version,
|
64 | isPreRelease,
|
65 | preReleaseId
|
66 | };
|
67 | };
|
68 |
|
69 | module.exports = {
|
70 | format,
|
71 | truncateLines,
|
72 | rejectAfter,
|
73 | reduceUntil,
|
74 | parseGitUrl,
|
75 | hasAccess,
|
76 | parseVersion
|
77 | };
|