style: prettier

This commit is contained in:
Gregor Martynus
2023-01-13 15:55:40 -08:00
parent 12a981c020
commit b06c9bbe4c
35 changed files with 1383 additions and 1344 deletions
+154 -154
View File
@@ -1,277 +1,277 @@
import test from 'ava';
import {union} from 'lodash-es';
import semver from 'semver';
import * as td from 'testdouble';
import test from "ava";
import { union } from "lodash-es";
import semver from "semver";
import * as td from "testdouble";
const getBranch = (branches, branch) => branches.find(({name}) => name === branch);
const release = (branches, name, version) => getBranch(branches, name).tags.push({version});
const getBranch = (branches, branch) => branches.find(({ name }) => name === branch);
const release = (branches, name, version) => getBranch(branches, name).tags.push({ version });
const merge = (branches, source, target, tag) => {
getBranch(branches, target).tags = union(
getBranch(branches, source).tags.filter(({version}) => !tag || semver.cmp(version, '<=', tag)),
getBranch(branches, source).tags.filter(({ version }) => !tag || semver.cmp(version, "<=", tag)),
getBranch(branches, target).tags
);
};
const remoteBranches = [];
const repositoryUrl = 'repositoryUrl';
const repositoryUrl = "repositoryUrl";
let expand, getTags, getBranches;
test.beforeEach(async (t) => {
getTags = (await td.replaceEsm('../../lib/branches/get-tags.js')).default;
expand = (await td.replaceEsm('../../lib/branches/expand.js')).default;
getBranches = (await import('../../lib/branches/index.js')).default;
})
getTags = (await td.replaceEsm("../../lib/branches/get-tags.js")).default;
expand = (await td.replaceEsm("../../lib/branches/expand.js")).default;
getBranches = (await import("../../lib/branches/index.js")).default;
});
test.afterEach.always((t) => {
td.reset();
});
test.serial('Enforce ranges with branching release workflow', async (t) => {
test.serial("Enforce ranges with branching release workflow", async (t) => {
const branches = [
{name: '1.x', tags: []},
{name: '1.0.x', tags: []},
{name: 'master', tags: []},
{name: 'next', tags: []},
{name: 'next-major', tags: []},
{name: 'beta', prerelease: true, tags: []},
{name: 'alpha', prerelease: true, tags: []},
{ name: "1.x", tags: [] },
{ name: "1.0.x", tags: [] },
{ name: "master", tags: [] },
{ name: "next", tags: [] },
{ name: "next-major", tags: [] },
{ name: "beta", prerelease: true, tags: [] },
{ name: "alpha", prerelease: true, tags: [] },
];
const context = {options: {branches}};
const context = { options: { branches } };
td.when(expand(repositoryUrl, context, branches)).thenResolve(remoteBranches);
td.when(getTags(context, remoteBranches)).thenResolve(branches);
let result = (await getBranches(repositoryUrl, 'master', context)).map(({name, range}) => ({name, range,}));
t.is(getBranch(result, '1.0.x').range, '>=1.0.0 <1.0.0', 'Cannot release on 1.0.x before a releasing on master');
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.0', 'Cannot release on 1.x before a releasing on master');
t.is(getBranch(result, 'master').range, '>=1.0.0');
t.is(getBranch(result, 'next').range, '>=1.0.0');
t.is(getBranch(result, 'next-major').range, '>=1.0.0');
let result = (await getBranches(repositoryUrl, "master", context)).map(({ name, range }) => ({ name, range }));
t.is(getBranch(result, "1.0.x").range, ">=1.0.0 <1.0.0", "Cannot release on 1.0.x before a releasing on master");
t.is(getBranch(result, "1.x").range, ">=1.1.0 <1.0.0", "Cannot release on 1.x before a releasing on master");
t.is(getBranch(result, "master").range, ">=1.0.0");
t.is(getBranch(result, "next").range, ">=1.0.0");
t.is(getBranch(result, "next-major").range, ">=1.0.0");
release(branches, 'master', '1.0.0');
result = (await getBranches('repositoryUrl', 'master', context)).map(({name, range}) => ({name, range}));
t.is(getBranch(result, '1.0.x').range, '>=1.0.0 <1.0.0', 'Cannot release on 1.0.x before a releasing on master');
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.0', 'Cannot release on 1.x before a releasing on master');
t.is(getBranch(result, 'master').range, '>=1.0.0');
t.is(getBranch(result, 'next').range, '>=1.0.0');
t.is(getBranch(result, 'next-major').range, '>=1.0.0');
release(branches, "master", "1.0.0");
result = (await getBranches("repositoryUrl", "master", context)).map(({ name, range }) => ({ name, range }));
t.is(getBranch(result, "1.0.x").range, ">=1.0.0 <1.0.0", "Cannot release on 1.0.x before a releasing on master");
t.is(getBranch(result, "1.x").range, ">=1.1.0 <1.0.0", "Cannot release on 1.x before a releasing on master");
t.is(getBranch(result, "master").range, ">=1.0.0");
t.is(getBranch(result, "next").range, ">=1.0.0");
t.is(getBranch(result, "next-major").range, ">=1.0.0");
release(branches, 'master', '1.0.1');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
release(branches, "master", "1.0.1");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.0.1', 'Can release only > than 1.0.1 on master');
t.is(getBranch(result, 'next').range, '>=1.0.1', 'Can release only > than 1.0.1 on next');
t.is(getBranch(result, 'next-major').range, '>=1.0.1', 'Can release only > than 1.0.1 on next-major');
t.is(getBranch(result, "master").range, ">=1.0.1", "Can release only > than 1.0.1 on master");
t.is(getBranch(result, "next").range, ">=1.0.1", "Can release only > than 1.0.1 on next");
t.is(getBranch(result, "next-major").range, ">=1.0.1", "Can release only > than 1.0.1 on next-major");
merge(branches, 'master', 'next');
merge(branches, 'master', 'next-major');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "master", "next");
merge(branches, "master", "next-major");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.0.1', 'Can release only > than 1.0.1 on master');
t.is(getBranch(result, 'next').range, '>=1.0.1', 'Can release only > than 1.0.1 on next');
t.is(getBranch(result, 'next-major').range, '>=1.0.1', 'Can release only > than 1.0.1 on next-major');
t.is(getBranch(result, "master").range, ">=1.0.1", "Can release only > than 1.0.1 on master");
t.is(getBranch(result, "next").range, ">=1.0.1", "Can release only > than 1.0.1 on next");
t.is(getBranch(result, "next-major").range, ">=1.0.1", "Can release only > than 1.0.1 on next-major");
release(branches, 'next', '1.1.0');
release(branches, 'next', '1.1.1');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
release(branches, "next", "1.1.0");
release(branches, "next", "1.1.1");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
t.is(getBranch(result, 'next').range, '>=1.1.1', 'Can release only > than 1.1.1 on next');
t.is(getBranch(result, 'next-major').range, '>=1.1.1', 'Can release > than 1.1.1 on next-major');
t.is(getBranch(result, "master").range, ">=1.0.1 <1.1.0", "Can release only patch, > than 1.0.1 on master");
t.is(getBranch(result, "next").range, ">=1.1.1", "Can release only > than 1.1.1 on next");
t.is(getBranch(result, "next-major").range, ">=1.1.1", "Can release > than 1.1.1 on next-major");
release(branches, 'next-major', '2.0.0');
release(branches, 'next-major', '2.0.1');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
release(branches, "next-major", "2.0.0");
release(branches, "next-major", "2.0.1");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
t.is(getBranch(result, 'next').range, '>=1.1.1 <2.0.0', 'Can release only patch or minor, > than 1.1.0 on next');
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
t.is(getBranch(result, "master").range, ">=1.0.1 <1.1.0", "Can release only patch, > than 1.0.1 on master");
t.is(getBranch(result, "next").range, ">=1.1.1 <2.0.0", "Can release only patch or minor, > than 1.1.0 on next");
t.is(getBranch(result, "next-major").range, ">=2.0.1", "Can release any version, > than 2.0.1 on next-major");
merge(branches, 'next-major', 'beta');
release(branches, 'beta', '3.0.0-beta.1');
merge(branches, 'beta', 'alpha');
release(branches, 'alpha', '4.0.0-alpha.1');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "next-major", "beta");
release(branches, "beta", "3.0.0-beta.1");
merge(branches, "beta", "alpha");
release(branches, "alpha", "4.0.0-alpha.1");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
t.is(getBranch(result, "next-major").range, ">=2.0.1", "Can release any version, > than 2.0.1 on next-major");
merge(branches, 'master', '1.0.x');
merge(branches, 'master', '1.x');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "master", "1.0.x");
merge(branches, "master", "1.x");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.0.1 <1.1.0', 'Can release only patch, > than 1.0.1 on master');
t.is(getBranch(result, "master").range, ">=1.0.1 <1.1.0", "Can release only patch, > than 1.0.1 on master");
t.is(
getBranch(result, '1.0.x').range,
'>=1.0.1 <1.0.1',
'Cannot release on 1.0.x before >= 1.1.0 is released on master'
getBranch(result, "1.0.x").range,
">=1.0.1 <1.0.1",
"Cannot release on 1.0.x before >= 1.1.0 is released on master"
);
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.1', 'Cannot release on 1.x before >= 1.2.0 is released on master');
t.is(getBranch(result, "1.x").range, ">=1.1.0 <1.0.1", "Cannot release on 1.x before >= 1.2.0 is released on master");
release(branches, 'master', '1.0.2');
release(branches, 'master', '1.0.3');
release(branches, 'master', '1.0.4');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
release(branches, "master", "1.0.2");
release(branches, "master", "1.0.3");
release(branches, "master", "1.0.4");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.0.4 <1.1.0', 'Can release only patch, > than 1.0.4 on master');
t.is(getBranch(result, "master").range, ">=1.0.4 <1.1.0", "Can release only patch, > than 1.0.4 on master");
t.is(
getBranch(result, '1.0.x').range,
'>=1.0.1 <1.0.2',
'Cannot release on 1.0.x before >= 1.1.0 is released on master'
getBranch(result, "1.0.x").range,
">=1.0.1 <1.0.2",
"Cannot release on 1.0.x before >= 1.1.0 is released on master"
);
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.2', 'Cannot release on 1.x before >= 1.2.0 is released on master');
t.is(getBranch(result, "1.x").range, ">=1.1.0 <1.0.2", "Cannot release on 1.x before >= 1.2.0 is released on master");
merge(branches, 'next', 'master');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "next", "master");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.1.1', 'Can release only > than 1.1.1 on master');
t.is(getBranch(result, 'next').range, '>=1.1.1 <2.0.0', 'Can release only patch or minor, > than 1.1.1 on next');
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release any version, > than 2.0.1 on next-major');
t.is(getBranch(result, "master").range, ">=1.1.1", "Can release only > than 1.1.1 on master");
t.is(getBranch(result, "next").range, ">=1.1.1 <2.0.0", "Can release only patch or minor, > than 1.1.1 on next");
t.is(getBranch(result, "next-major").range, ">=2.0.1", "Can release any version, > than 2.0.1 on next-major");
t.is(
getBranch(result, '1.0.x').range,
'>=1.0.1 <1.0.2',
'Cannot release on 1.0.x before 1.0.x version from master are merged'
getBranch(result, "1.0.x").range,
">=1.0.1 <1.0.2",
"Cannot release on 1.0.x before 1.0.x version from master are merged"
);
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.0.2', 'Cannot release on 1.x before >= 2.0.0 is released on master');
t.is(getBranch(result, "1.x").range, ">=1.1.0 <1.0.2", "Cannot release on 1.x before >= 2.0.0 is released on master");
merge(branches, 'master', '1.0.x', '1.0.4');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "master", "1.0.x", "1.0.4");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.1.1', 'Can release only > than 1.1.1 on master');
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
t.is(getBranch(result, '1.x').range, '>=1.1.0 <1.1.0', 'Cannot release on 1.x before >= 2.0.0 is released on master');
t.is(getBranch(result, "master").range, ">=1.1.1", "Can release only > than 1.1.1 on master");
t.is(getBranch(result, "1.0.x").range, ">=1.0.4 <1.1.0", "Can release on 1.0.x only within range");
t.is(getBranch(result, "1.x").range, ">=1.1.0 <1.1.0", "Cannot release on 1.x before >= 2.0.0 is released on master");
merge(branches, 'master', '1.x');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "master", "1.x");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=1.1.1', 'Can release only > than 1.1.1 on master');
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
t.is(getBranch(result, '1.x').range, '>=1.1.1 <1.1.1', 'Cannot release on 1.x before >= 2.0.0 is released on master');
t.is(getBranch(result, "master").range, ">=1.1.1", "Can release only > than 1.1.1 on master");
t.is(getBranch(result, "1.0.x").range, ">=1.0.4 <1.1.0", "Can release on 1.0.x only within range");
t.is(getBranch(result, "1.x").range, ">=1.1.1 <1.1.1", "Cannot release on 1.x before >= 2.0.0 is released on master");
merge(branches, 'next-major', 'next');
merge(branches, 'next', 'master');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "next-major", "next");
merge(branches, "next", "master");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=2.0.1', 'Can release only > than 2.0.1 on master');
t.is(getBranch(result, 'next').range, '>=2.0.1', 'Can release only > than 2.0.1 on next');
t.is(getBranch(result, 'next-major').range, '>=2.0.1', 'Can release only > than 2.0.1 on next-major');
t.is(getBranch(result, '1.x').range, '>=1.1.1 <2.0.0', 'Can release on 1.x only within range');
t.is(getBranch(result, "master").range, ">=2.0.1", "Can release only > than 2.0.1 on master");
t.is(getBranch(result, "next").range, ">=2.0.1", "Can release only > than 2.0.1 on next");
t.is(getBranch(result, "next-major").range, ">=2.0.1", "Can release only > than 2.0.1 on next-major");
t.is(getBranch(result, "1.x").range, ">=1.1.1 <2.0.0", "Can release on 1.x only within range");
merge(branches, 'beta', 'master');
release(branches, 'master', '3.0.0');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
merge(branches, "beta", "master");
release(branches, "master", "3.0.0");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, 'master').range, '>=3.0.0', 'Can release only > than 3.0.0 on master');
t.is(getBranch(result, 'next').range, '>=3.0.0', 'Can release only > than 3.0.0 on next');
t.is(getBranch(result, 'next-major').range, '>=3.0.0', 'Can release only > than 3.0.0 on next-major');
t.is(getBranch(result, "master").range, ">=3.0.0", "Can release only > than 3.0.0 on master");
t.is(getBranch(result, "next").range, ">=3.0.0", "Can release only > than 3.0.0 on next");
t.is(getBranch(result, "next-major").range, ">=3.0.0", "Can release only > than 3.0.0 on next-major");
branches.push({name: '1.1.x', tags: []});
merge(branches, '1.x', '1.1.x');
result = (await getBranches('repositoryUrl', 'master', {options: {branches}})).map(({name, range}) => ({
branches.push({ name: "1.1.x", tags: [] });
merge(branches, "1.x", "1.1.x");
result = (await getBranches("repositoryUrl", "master", { options: { branches } })).map(({ name, range }) => ({
name,
range,
}));
t.is(getBranch(result, '1.0.x').range, '>=1.0.4 <1.1.0', 'Can release on 1.0.x only within range');
t.is(getBranch(result, '1.1.x').range, '>=1.1.1 <1.2.0', 'Can release on 1.1.x only within range');
t.is(getBranch(result, '1.x').range, '>=1.2.0 <2.0.0', 'Can release on 1.x only within range');
t.is(getBranch(result, "1.0.x").range, ">=1.0.4 <1.1.0", "Can release on 1.0.x only within range");
t.is(getBranch(result, "1.1.x").range, ">=1.1.1 <1.2.0", "Can release on 1.1.x only within range");
t.is(getBranch(result, "1.x").range, ">=1.2.0 <2.0.0", "Can release on 1.x only within range");
});
test.serial('Throw SemanticReleaseError for invalid configurations', async (t) => {
test.serial("Throw SemanticReleaseError for invalid configurations", async (t) => {
const branches = [
{name: '123', range: '123', tags: []},
{name: '1.x', tags: []},
{name: 'maintenance-1', range: '1.x', tags: []},
{name: '1.x.x', tags: []},
{name: 'beta', prerelease: '', tags: []},
{name: 'alpha', prerelease: 'alpha', tags: []},
{name: 'preview', prerelease: 'alpha', tags: []},
{ name: "123", range: "123", tags: [] },
{ name: "1.x", tags: [] },
{ name: "maintenance-1", range: "1.x", tags: [] },
{ name: "1.x.x", tags: [] },
{ name: "beta", prerelease: "", tags: [] },
{ name: "alpha", prerelease: "alpha", tags: [] },
{ name: "preview", prerelease: "alpha", tags: [] },
];
const context = {options: {branches}};
const context = { options: { branches } };
td.when(expand(repositoryUrl, context, branches)).thenResolve(remoteBranches);
td.when(getTags(context, remoteBranches)).thenResolve(branches);
const error = await t.throwsAsync(getBranches(repositoryUrl, 'master', context));
const error = await t.throwsAsync(getBranches(repositoryUrl, "master", context));
const errors = [...error.errors];
t.is(errors[0].name, 'SemanticReleaseError');
t.is(errors[0].code, 'EMAINTENANCEBRANCH');
t.is(errors[0].name, "SemanticReleaseError");
t.is(errors[0].code, "EMAINTENANCEBRANCH");
t.truthy(errors[0].message);
t.truthy(errors[0].details);
t.is(errors[1].name, 'SemanticReleaseError');
t.is(errors[1].code, 'EMAINTENANCEBRANCHES');
t.is(errors[1].name, "SemanticReleaseError");
t.is(errors[1].code, "EMAINTENANCEBRANCHES");
t.truthy(errors[1].message);
t.truthy(errors[1].details);
t.is(errors[2].name, 'SemanticReleaseError');
t.is(errors[2].code, 'EPRERELEASEBRANCH');
t.is(errors[2].name, "SemanticReleaseError");
t.is(errors[2].code, "EPRERELEASEBRANCH");
t.truthy(errors[2].message);
t.truthy(errors[2].details);
t.is(errors[3].name, 'SemanticReleaseError');
t.is(errors[3].code, 'EPRERELEASEBRANCHES');
t.is(errors[3].name, "SemanticReleaseError");
t.is(errors[3].code, "EPRERELEASEBRANCHES");
t.truthy(errors[3].message);
t.truthy(errors[3].details);
t.is(errors[4].name, 'SemanticReleaseError');
t.is(errors[4].code, 'ERELEASEBRANCHES');
t.is(errors[4].name, "SemanticReleaseError");
t.is(errors[4].code, "ERELEASEBRANCHES");
t.truthy(errors[4].message);
t.truthy(errors[4].details);
});
test.serial('Throw a SemanticReleaseError if there is duplicate branches', async (t) => {
test.serial("Throw a SemanticReleaseError if there is duplicate branches", async (t) => {
const branches = [
{name: 'master', tags: []},
{name: 'master', tags: []},
{ name: "master", tags: [] },
{ name: "master", tags: [] },
];
const context = {options: {branches}};
const context = { options: { branches } };
td.when(expand(repositoryUrl, context, branches)).thenResolve(remoteBranches);
td.when(getTags(context, remoteBranches)).thenResolve(branches);
const errors = [...(await t.throwsAsync(getBranches(repositoryUrl, 'master', context))).errors];
const errors = [...(await t.throwsAsync(getBranches(repositoryUrl, "master", context))).errors];
t.is(errors[0].name, 'SemanticReleaseError');
t.is(errors[0].code, 'EDUPLICATEBRANCHES');
t.is(errors[0].name, "SemanticReleaseError");
t.is(errors[0].code, "EDUPLICATEBRANCHES");
t.truthy(errors[0].message);
t.truthy(errors[0].details);
});
test.serial('Throw a SemanticReleaseError for each invalid branch name', async (t) => {
test.serial("Throw a SemanticReleaseError for each invalid branch name", async (t) => {
const branches = [
{name: '~master', tags: []},
{name: '^master', tags: []},
{ name: "~master", tags: [] },
{ name: "^master", tags: [] },
];
const context = {options: {branches}};
const context = { options: { branches } };
const remoteBranches = [];
td.when(expand(repositoryUrl, context, branches)).thenResolve(remoteBranches);
td.when(getTags(context, remoteBranches)).thenResolve(branches);
const errors = [...(await t.throwsAsync(getBranches(repositoryUrl, 'master', context))).errors];
const errors = [...(await t.throwsAsync(getBranches(repositoryUrl, "master", context))).errors];
t.is(errors[0].name, 'SemanticReleaseError');
t.is(errors[0].code, 'EINVALIDBRANCHNAME');
t.is(errors[0].name, "SemanticReleaseError");
t.is(errors[0].code, "EINVALIDBRANCHNAME");
t.truthy(errors[0].message);
t.truthy(errors[0].details);
t.is(errors[1].name, 'SemanticReleaseError');
t.is(errors[1].code, 'EINVALIDBRANCHNAME');
t.is(errors[1].name, "SemanticReleaseError");
t.is(errors[1].code, "EINVALIDBRANCHNAME");
t.truthy(errors[1].message);
t.truthy(errors[1].details);
});
+44 -44
View File
@@ -1,54 +1,54 @@
import test from 'ava';
import expand from '../../lib/branches/expand.js';
import {gitCheckout, gitCommits, gitPush, gitRepo} from '../helpers/git-utils.js';
import test from "ava";
import expand from "../../lib/branches/expand.js";
import { gitCheckout, gitCommits, gitPush, gitRepo } from "../helpers/git-utils.js";
test('Expand branches defined with globs', async (t) => {
const {cwd, repositoryUrl} = await gitRepo(true);
await gitCommits(['First'], {cwd});
await gitPush(repositoryUrl, 'master', {cwd});
await gitCheckout('1.0.x', true, {cwd});
await gitCommits(['Second'], {cwd});
await gitPush(repositoryUrl, '1.0.x', {cwd});
await gitCheckout('1.x.x', true, {cwd});
await gitCommits(['Third'], {cwd});
await gitPush(repositoryUrl, '1.x.x', {cwd});
await gitCheckout('2.x', true, {cwd});
await gitCommits(['Fourth'], {cwd});
await gitPush(repositoryUrl, '2.x', {cwd});
await gitCheckout('next', true, {cwd});
await gitCommits(['Fifth'], {cwd});
await gitPush(repositoryUrl, 'next', {cwd});
await gitCheckout('pre/foo', true, {cwd});
await gitCommits(['Sixth'], {cwd});
await gitPush(repositoryUrl, 'pre/foo', {cwd});
await gitCheckout('pre/bar', true, {cwd});
await gitCommits(['Seventh'], {cwd});
await gitPush(repositoryUrl, 'pre/bar', {cwd});
await gitCheckout('beta', true, {cwd});
await gitCommits(['Eighth'], {cwd});
await gitPush(repositoryUrl, 'beta', {cwd});
test("Expand branches defined with globs", async (t) => {
const { cwd, repositoryUrl } = await gitRepo(true);
await gitCommits(["First"], { cwd });
await gitPush(repositoryUrl, "master", { cwd });
await gitCheckout("1.0.x", true, { cwd });
await gitCommits(["Second"], { cwd });
await gitPush(repositoryUrl, "1.0.x", { cwd });
await gitCheckout("1.x.x", true, { cwd });
await gitCommits(["Third"], { cwd });
await gitPush(repositoryUrl, "1.x.x", { cwd });
await gitCheckout("2.x", true, { cwd });
await gitCommits(["Fourth"], { cwd });
await gitPush(repositoryUrl, "2.x", { cwd });
await gitCheckout("next", true, { cwd });
await gitCommits(["Fifth"], { cwd });
await gitPush(repositoryUrl, "next", { cwd });
await gitCheckout("pre/foo", true, { cwd });
await gitCommits(["Sixth"], { cwd });
await gitPush(repositoryUrl, "pre/foo", { cwd });
await gitCheckout("pre/bar", true, { cwd });
await gitCommits(["Seventh"], { cwd });
await gitPush(repositoryUrl, "pre/bar", { cwd });
await gitCheckout("beta", true, { cwd });
await gitCommits(["Eighth"], { cwd });
await gitPush(repositoryUrl, "beta", { cwd });
const branches = [
// Should match all maintenance type branches
{name: '+([0-9])?(.{+([0-9]),x}).x'},
{name: 'master', channel: 'latest'},
{name: 'next'},
{name: 'pre/{foo,bar}', channel: `\${name.replace(/^pre\\//g, '')}`, prerelease: true},
{ name: "+([0-9])?(.{+([0-9]),x}).x" },
{ name: "master", channel: "latest" },
{ name: "next" },
{ name: "pre/{foo,bar}", channel: `\${name.replace(/^pre\\//g, '')}`, prerelease: true },
// Should be ignored as there is no matching branches in the repo
{name: 'missing'},
{ name: "missing" },
// Should be ignored as the matching branch in the repo is already matched by `/^pre\\/(\\w+)$/gi`
{name: '*/foo', channel: 'foo', prerelease: 'foo'},
{name: 'beta', channel: `channel-\${name}`, prerelease: true},
{ name: "*/foo", channel: "foo", prerelease: "foo" },
{ name: "beta", channel: `channel-\${name}`, prerelease: true },
];
t.deepEqual(await expand(repositoryUrl, {cwd}, branches), [
{name: '1.0.x'},
{name: '1.x.x'},
{name: '2.x'},
{name: 'master', channel: 'latest'},
{name: 'next'},
{name: 'pre/bar', channel: 'bar', prerelease: true},
{name: 'pre/foo', channel: 'foo', prerelease: true},
{name: 'beta', channel: 'channel-beta', prerelease: true},
t.deepEqual(await expand(repositoryUrl, { cwd }, branches), [
{ name: "1.0.x" },
{ name: "1.x.x" },
{ name: "2.x" },
{ name: "master", channel: "latest" },
{ name: "next" },
{ name: "pre/bar", channel: "bar", prerelease: true },
{ name: "pre/foo", channel: "foo", prerelease: true },
{ name: "beta", channel: "channel-beta", prerelease: true },
]);
});
+100 -97
View File
@@ -1,153 +1,156 @@
import test from 'ava';
import getTags from '../../lib/branches/get-tags.js';
import {gitAddNote, gitCheckout, gitCommits, gitRepo, gitTagVersion} from '../helpers/git-utils.js';
import test from "ava";
import getTags from "../../lib/branches/get-tags.js";
import { gitAddNote, gitCheckout, gitCommits, gitRepo, gitTagVersion } from "../helpers/git-utils.js";
test('Get the valid tags', async (t) => {
const {cwd} = await gitRepo();
const commits = await gitCommits(['First'], {cwd});
await gitTagVersion('foo', undefined, {cwd});
await gitTagVersion('v2.0.0', undefined, {cwd});
commits.push(...(await gitCommits(['Second'], {cwd})));
await gitTagVersion('v1.0.0', undefined, {cwd});
commits.push(...(await gitCommits(['Third'], {cwd})));
await gitTagVersion('v3.0', undefined, {cwd});
commits.push(...(await gitCommits(['Fourth'], {cwd})));
await gitTagVersion('v3.0.0-beta.1', undefined, {cwd});
test("Get the valid tags", async (t) => {
const { cwd } = await gitRepo();
const commits = await gitCommits(["First"], { cwd });
await gitTagVersion("foo", undefined, { cwd });
await gitTagVersion("v2.0.0", undefined, { cwd });
commits.push(...(await gitCommits(["Second"], { cwd })));
await gitTagVersion("v1.0.0", undefined, { cwd });
commits.push(...(await gitCommits(["Third"], { cwd })));
await gitTagVersion("v3.0", undefined, { cwd });
commits.push(...(await gitCommits(["Fourth"], { cwd })));
await gitTagVersion("v3.0.0-beta.1", undefined, { cwd });
const result = await getTags({cwd, options: {tagFormat: `v\${version}`}}, [{name: 'master'}]);
const result = await getTags({ cwd, options: { tagFormat: `v\${version}` } }, [{ name: "master" }]);
t.deepEqual(result, [
{
name: 'master',
name: "master",
tags: [
{gitTag: 'v1.0.0', version: '1.0.0', channels: [null]},
{gitTag: 'v2.0.0', version: '2.0.0', channels: [null]},
{gitTag: 'v3.0.0-beta.1', version: '3.0.0-beta.1', channels: [null]},
{ gitTag: "v1.0.0", version: "1.0.0", channels: [null] },
{ gitTag: "v2.0.0", version: "2.0.0", channels: [null] },
{ gitTag: "v3.0.0-beta.1", version: "3.0.0-beta.1", channels: [null] },
],
},
]);
});
test('Get the valid tags from multiple branches', async (t) => {
const {cwd} = await gitRepo();
await gitCommits(['First'], {cwd});
await gitTagVersion('v1.0.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: [null, '1.x']}), 'v1.0.0', {cwd});
await gitCommits(['Second'], {cwd});
await gitTagVersion('v1.1.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: [null, '1.x']}), 'v1.1.0', {cwd});
await gitCheckout('1.x', true, {cwd});
await gitCheckout('master', false, {cwd});
await gitCommits(['Third'], {cwd});
await gitTagVersion('v2.0.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: [null, 'next']}), 'v2.0.0', {cwd});
await gitCheckout('next', true, {cwd});
await gitCommits(['Fourth'], {cwd});
await gitTagVersion('v3.0.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: ['next']}), 'v3.0.0', {cwd});
test("Get the valid tags from multiple branches", async (t) => {
const { cwd } = await gitRepo();
await gitCommits(["First"], { cwd });
await gitTagVersion("v1.0.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: [null, "1.x"] }), "v1.0.0", { cwd });
await gitCommits(["Second"], { cwd });
await gitTagVersion("v1.1.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: [null, "1.x"] }), "v1.1.0", { cwd });
await gitCheckout("1.x", true, { cwd });
await gitCheckout("master", false, { cwd });
await gitCommits(["Third"], { cwd });
await gitTagVersion("v2.0.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: [null, "next"] }), "v2.0.0", { cwd });
await gitCheckout("next", true, { cwd });
await gitCommits(["Fourth"], { cwd });
await gitTagVersion("v3.0.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: ["next"] }), "v3.0.0", { cwd });
const result = await getTags({cwd, options: {tagFormat: `v\${version}`}}, [
{name: '1.x'},
{name: 'master'},
{name: 'next'},
const result = await getTags({ cwd, options: { tagFormat: `v\${version}` } }, [
{ name: "1.x" },
{ name: "master" },
{ name: "next" },
]);
t.deepEqual(result, [
{
name: '1.x',
name: "1.x",
tags: [
{gitTag: 'v1.0.0', version: '1.0.0', channels: [null, '1.x']},
{gitTag: 'v1.1.0', version: '1.1.0', channels: [null, '1.x']},
{ gitTag: "v1.0.0", version: "1.0.0", channels: [null, "1.x"] },
{ gitTag: "v1.1.0", version: "1.1.0", channels: [null, "1.x"] },
],
},
{
name: 'master',
tags: [...result[0].tags, {gitTag: 'v2.0.0', version: '2.0.0', channels: [null, 'next']}],
name: "master",
tags: [...result[0].tags, { gitTag: "v2.0.0", version: "2.0.0", channels: [null, "next"] }],
},
{
name: 'next',
tags: [...result[1].tags, {gitTag: 'v3.0.0', version: '3.0.0', channels: ['next']}],
name: "next",
tags: [...result[1].tags, { gitTag: "v3.0.0", version: "3.0.0", channels: ["next"] }],
},
]);
});
test('Return branches with and empty tags array if no valid tag is found', async (t) => {
const {cwd} = await gitRepo();
await gitCommits(['First'], {cwd});
await gitTagVersion('foo', undefined, {cwd});
await gitCommits(['Second'], {cwd});
await gitTagVersion('v2.0.x', undefined, {cwd});
await gitCommits(['Third'], {cwd});
await gitTagVersion('v3.0', undefined, {cwd});
test("Return branches with and empty tags array if no valid tag is found", async (t) => {
const { cwd } = await gitRepo();
await gitCommits(["First"], { cwd });
await gitTagVersion("foo", undefined, { cwd });
await gitCommits(["Second"], { cwd });
await gitTagVersion("v2.0.x", undefined, { cwd });
await gitCommits(["Third"], { cwd });
await gitTagVersion("v3.0", undefined, { cwd });
const result = await getTags({cwd, options: {tagFormat: `prefix@v\${version}`}}, [{name: 'master'}]);
const result = await getTags({ cwd, options: { tagFormat: `prefix@v\${version}` } }, [{ name: "master" }]);
t.deepEqual(result, [{name: 'master', tags: []}]);
t.deepEqual(result, [{ name: "master", tags: [] }]);
});
test('Return branches with and empty tags array if no valid tag is found in history of configured branches', async (t) => {
const {cwd} = await gitRepo();
await gitCommits(['First'], {cwd});
await gitCheckout('next', true, {cwd});
await gitCommits(['Second'], {cwd});
await gitTagVersion('v1.0.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: [null, 'next']}), 'v1.0.0', {cwd});
await gitCommits(['Third'], {cwd});
await gitTagVersion('v2.0.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: [null, 'next']}), 'v2.0.0', {cwd});
await gitCommits(['Fourth'], {cwd});
await gitTagVersion('v3.0.0', undefined, {cwd});
await gitAddNote(JSON.stringify({channels: [null, 'next']}), 'v3.0.0', {cwd});
await gitCheckout('master', false, {cwd});
test("Return branches with and empty tags array if no valid tag is found in history of configured branches", async (t) => {
const { cwd } = await gitRepo();
await gitCommits(["First"], { cwd });
await gitCheckout("next", true, { cwd });
await gitCommits(["Second"], { cwd });
await gitTagVersion("v1.0.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: [null, "next"] }), "v1.0.0", { cwd });
await gitCommits(["Third"], { cwd });
await gitTagVersion("v2.0.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: [null, "next"] }), "v2.0.0", { cwd });
await gitCommits(["Fourth"], { cwd });
await gitTagVersion("v3.0.0", undefined, { cwd });
await gitAddNote(JSON.stringify({ channels: [null, "next"] }), "v3.0.0", { cwd });
await gitCheckout("master", false, { cwd });
const result = await getTags({cwd, options: {tagFormat: `prefix@v\${version}`}}, [{name: 'master'}, {name: 'next'}]);
const result = await getTags({ cwd, options: { tagFormat: `prefix@v\${version}` } }, [
{ name: "master" },
{ name: "next" },
]);
t.deepEqual(result, [
{name: 'master', tags: []},
{name: 'next', tags: []},
{ name: "master", tags: [] },
{ name: "next", tags: [] },
]);
});
test('Get the highest valid tag corresponding to the "tagFormat"', async (t) => {
const {cwd} = await gitRepo();
await gitCommits(['First'], {cwd});
const { cwd } = await gitRepo();
await gitCommits(["First"], { cwd });
await gitTagVersion('1.0.0', undefined, {cwd});
t.deepEqual(await getTags({cwd, options: {tagFormat: `\${version}`}}, [{name: 'master'}]), [
{name: 'master', tags: [{gitTag: '1.0.0', version: '1.0.0', channels: [null]}]},
await gitTagVersion("1.0.0", undefined, { cwd });
t.deepEqual(await getTags({ cwd, options: { tagFormat: `\${version}` } }, [{ name: "master" }]), [
{ name: "master", tags: [{ gitTag: "1.0.0", version: "1.0.0", channels: [null] }] },
]);
await gitTagVersion('foo-1.0.0-bar', undefined, {cwd});
t.deepEqual(await getTags({cwd, options: {tagFormat: `foo-\${version}-bar`}}, [{name: 'master'}]), [
{name: 'master', tags: [{gitTag: 'foo-1.0.0-bar', version: '1.0.0', channels: [null]}]},
await gitTagVersion("foo-1.0.0-bar", undefined, { cwd });
t.deepEqual(await getTags({ cwd, options: { tagFormat: `foo-\${version}-bar` } }, [{ name: "master" }]), [
{ name: "master", tags: [{ gitTag: "foo-1.0.0-bar", version: "1.0.0", channels: [null] }] },
]);
await gitTagVersion('foo-v1.0.0-bar', undefined, {cwd});
t.deepEqual(await getTags({cwd, options: {tagFormat: `foo-v\${version}-bar`}}, [{name: 'master'}]), [
await gitTagVersion("foo-v1.0.0-bar", undefined, { cwd });
t.deepEqual(await getTags({ cwd, options: { tagFormat: `foo-v\${version}-bar` } }, [{ name: "master" }]), [
{
name: 'master',
tags: [{gitTag: 'foo-v1.0.0-bar', version: '1.0.0', channels: [null]}],
name: "master",
tags: [{ gitTag: "foo-v1.0.0-bar", version: "1.0.0", channels: [null] }],
},
]);
await gitTagVersion('(.+)/1.0.0/(a-z)', undefined, {cwd});
t.deepEqual(await getTags({cwd, options: {tagFormat: `(.+)/\${version}/(a-z)`}}, [{name: 'master'}]), [
await gitTagVersion("(.+)/1.0.0/(a-z)", undefined, { cwd });
t.deepEqual(await getTags({ cwd, options: { tagFormat: `(.+)/\${version}/(a-z)` } }, [{ name: "master" }]), [
{
name: 'master',
tags: [{gitTag: '(.+)/1.0.0/(a-z)', version: '1.0.0', channels: [null]}],
name: "master",
tags: [{ gitTag: "(.+)/1.0.0/(a-z)", version: "1.0.0", channels: [null] }],
},
]);
await gitTagVersion('2.0.0-1.0.0-bar.1', undefined, {cwd});
t.deepEqual(await getTags({cwd, options: {tagFormat: `2.0.0-\${version}-bar.1`}}, [{name: 'master'}]), [
await gitTagVersion("2.0.0-1.0.0-bar.1", undefined, { cwd });
t.deepEqual(await getTags({ cwd, options: { tagFormat: `2.0.0-\${version}-bar.1` } }, [{ name: "master" }]), [
{
name: 'master',
tags: [{gitTag: '2.0.0-1.0.0-bar.1', version: '1.0.0', channels: [null]}],
name: "master",
tags: [{ gitTag: "2.0.0-1.0.0-bar.1", version: "1.0.0", channels: [null] }],
},
]);
await gitTagVersion('3.0.0-bar.2', undefined, {cwd});
t.deepEqual(await getTags({cwd, options: {tagFormat: `\${version}-bar.2`}}, [{name: 'master'}]), [
{name: 'master', tags: [{gitTag: '3.0.0-bar.2', version: '3.0.0', channels: [null]}]},
await gitTagVersion("3.0.0-bar.2", undefined, { cwd });
t.deepEqual(await getTags({ cwd, options: { tagFormat: `\${version}-bar.2` } }, [{ name: "master" }]), [
{ name: "master", tags: [{ gitTag: "3.0.0-bar.2", version: "3.0.0", channels: [null] }] },
]);
});
+193 -191
View File
@@ -1,17 +1,17 @@
import test from 'ava';
import * as normalize from '../../lib/branches/normalize.js';
import test from "ava";
import * as normalize from "../../lib/branches/normalize.js";
const toTags = (versions) => versions.map((version) => ({version}));
const toTags = (versions) => versions.map((version) => ({ version }));
test('Maintenance branches - initial state', (t) => {
test("Maintenance branches - initial state", (t) => {
const maintenance = [
{name: '1.x', channel: '1.x', tags: []},
{name: '1.1.x', tags: []},
{name: '1.2.x', tags: []},
{ name: "1.x", channel: "1.x", tags: [] },
{ name: "1.1.x", tags: [] },
{ name: "1.2.x", tags: [] },
];
const release = [{name: 'master', tags: []}];
const release = [{ name: "master", tags: [] }];
t.deepEqual(
normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
normalize.maintenance({ maintenance, release }).map(({ type, name, range, accept, channel, mergeRange }) => ({
type,
name,
range,
@@ -21,51 +21,51 @@ test('Maintenance branches - initial state', (t) => {
})),
[
{
type: 'maintenance',
name: '1.1.x',
range: '>=1.1.0 <1.0.0',
type: "maintenance",
name: "1.1.x",
range: ">=1.1.0 <1.0.0",
accept: [],
channel: '1.1.x',
mergeRange: '>=1.1.0 <1.2.0',
channel: "1.1.x",
mergeRange: ">=1.1.0 <1.2.0",
},
{
type: 'maintenance',
name: '1.2.x',
range: '>=1.2.0 <1.0.0',
type: "maintenance",
name: "1.2.x",
range: ">=1.2.0 <1.0.0",
accept: [],
channel: '1.2.x',
mergeRange: '>=1.2.0 <1.3.0',
channel: "1.2.x",
mergeRange: ">=1.2.0 <1.3.0",
},
{
type: 'maintenance',
name: '1.x',
range: '>=1.3.0 <1.0.0',
type: "maintenance",
name: "1.x",
range: ">=1.3.0 <1.0.0",
accept: [],
channel: '1.x',
mergeRange: '>=1.3.0 <2.0.0',
channel: "1.x",
mergeRange: ">=1.3.0 <2.0.0",
},
]
);
});
test('Maintenance branches - cap range to first release present on default branch and not in any Maintenance one', (t) => {
test("Maintenance branches - cap range to first release present on default branch and not in any Maintenance one", (t) => {
const maintenance = [
{name: '1.x', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1', '1.3.0', '1.4.0', '1.5.0'])},
{name: 'name', range: '1.1.x', tags: toTags(['1.0.0', '1.0.1', '1.1.0', '1.1.1'])},
{name: '1.2.x', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1'])},
{name: '2.x.x', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1', '1.5.0'])},
{ name: "1.x", tags: toTags(["1.0.0", "1.1.0", "1.1.1", "1.2.0", "1.2.1", "1.3.0", "1.4.0", "1.5.0"]) },
{ name: "name", range: "1.1.x", tags: toTags(["1.0.0", "1.0.1", "1.1.0", "1.1.1"]) },
{ name: "1.2.x", tags: toTags(["1.0.0", "1.1.0", "1.1.1", "1.2.0", "1.2.1"]) },
{ name: "2.x.x", tags: toTags(["1.0.0", "1.1.0", "1.1.1", "1.2.0", "1.2.1", "1.5.0"]) },
];
const release = [
{
name: 'master',
tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1', '1.3.0', '1.4.0', '1.5.0', '1.6.0', '2.0.0']),
name: "master",
tags: toTags(["1.0.0", "1.1.0", "1.1.1", "1.2.0", "1.2.1", "1.3.0", "1.4.0", "1.5.0", "1.6.0", "2.0.0"]),
},
];
t.deepEqual(
normalize
.maintenance({maintenance, release})
.map(({type, name, range, accept, channel, mergeRange: maintenanceRange}) => ({
.maintenance({ maintenance, release })
.map(({ type, name, range, accept, channel, mergeRange: maintenanceRange }) => ({
type,
name,
range,
@@ -75,50 +75,50 @@ test('Maintenance branches - cap range to first release present on default branc
})),
[
{
type: 'maintenance',
name: 'name',
range: '>=1.1.1 <1.2.0',
accept: ['patch'],
channel: 'name',
mergeRange: '>=1.1.0 <1.2.0',
type: "maintenance",
name: "name",
range: ">=1.1.1 <1.2.0",
accept: ["patch"],
channel: "name",
mergeRange: ">=1.1.0 <1.2.0",
},
{
type: 'maintenance',
name: '1.2.x',
range: '>=1.2.1 <1.3.0',
accept: ['patch'],
channel: '1.2.x',
mergeRange: '>=1.2.0 <1.3.0',
type: "maintenance",
name: "1.2.x",
range: ">=1.2.1 <1.3.0",
accept: ["patch"],
channel: "1.2.x",
mergeRange: ">=1.2.0 <1.3.0",
},
{
type: 'maintenance',
name: '1.x',
range: '>=1.5.0 <1.6.0',
accept: ['patch'],
channel: '1.x',
mergeRange: '>=1.3.0 <2.0.0',
type: "maintenance",
name: "1.x",
range: ">=1.5.0 <1.6.0",
accept: ["patch"],
channel: "1.x",
mergeRange: ">=1.3.0 <2.0.0",
},
{
type: 'maintenance',
name: '2.x.x',
range: '>=2.0.0 <1.6.0',
type: "maintenance",
name: "2.x.x",
range: ">=2.0.0 <1.6.0",
accept: [],
channel: '2.x.x',
mergeRange: '>=2.0.0 <3.0.0',
channel: "2.x.x",
mergeRange: ">=2.0.0 <3.0.0",
},
]
);
});
test('Maintenance branches - cap range to default branch last release if all release are also present on maintenance branch', (t) => {
test("Maintenance branches - cap range to default branch last release if all release are also present on maintenance branch", (t) => {
const maintenance = [
{name: '1.x', tags: toTags(['1.0.0', '1.2.0', '1.3.0'])},
{name: '2.x.x', tags: toTags(['1.0.0', '1.2.0', '1.3.0', '2.0.0'])},
{ name: "1.x", tags: toTags(["1.0.0", "1.2.0", "1.3.0"]) },
{ name: "2.x.x", tags: toTags(["1.0.0", "1.2.0", "1.3.0", "2.0.0"]) },
];
const release = [{name: 'master', tags: toTags(['1.0.0', '1.2.0', '1.3.0', '2.0.0'])}];
const release = [{ name: "master", tags: toTags(["1.0.0", "1.2.0", "1.3.0", "2.0.0"]) }];
t.deepEqual(
normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
normalize.maintenance({ maintenance, release }).map(({ type, name, range, accept, channel, mergeRange }) => ({
type,
name,
range,
@@ -128,270 +128,272 @@ test('Maintenance branches - cap range to default branch last release if all rel
})),
[
{
type: 'maintenance',
name: '1.x',
range: '>=1.3.0 <2.0.0',
accept: ['patch', 'minor'],
channel: '1.x',
mergeRange: '>=1.0.0 <2.0.0',
type: "maintenance",
name: "1.x",
range: ">=1.3.0 <2.0.0",
accept: ["patch", "minor"],
channel: "1.x",
mergeRange: ">=1.0.0 <2.0.0",
},
{
type: 'maintenance',
name: '2.x.x',
range: '>=2.0.0 <2.0.0',
type: "maintenance",
name: "2.x.x",
range: ">=2.0.0 <2.0.0",
accept: [],
channel: '2.x.x',
mergeRange: '>=2.0.0 <3.0.0',
channel: "2.x.x",
mergeRange: ">=2.0.0 <3.0.0",
},
]
);
});
test('Release branches - initial state', (t) => {
test("Release branches - initial state", (t) => {
const release = [
{name: 'master', tags: []},
{name: 'next', channel: 'next', tags: []},
{name: 'next-major', tags: []},
{ name: "master", tags: [] },
{ name: "next", channel: "next", tags: [] },
{ name: "next-major", tags: [] },
];
t.deepEqual(
normalize
.release({release})
.map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
.release({ release })
.map(({ type, name, range, accept, channel, main }) => ({ type, name, range, accept, channel, main })),
[
{
type: 'release',
name: 'master',
range: '>=1.0.0',
accept: ['patch', 'minor', 'major'],
type: "release",
name: "master",
range: ">=1.0.0",
accept: ["patch", "minor", "major"],
channel: undefined,
main: true,
},
{
type: 'release',
name: 'next',
range: '>=1.0.0',
accept: ['patch', 'minor', 'major'],
channel: 'next',
type: "release",
name: "next",
range: ">=1.0.0",
accept: ["patch", "minor", "major"],
channel: "next",
main: false,
},
{
type: 'release',
name: 'next-major',
range: '>=1.0.0',
accept: ['patch', 'minor', 'major'],
channel: 'next-major',
type: "release",
name: "next-major",
range: ">=1.0.0",
accept: ["patch", "minor", "major"],
channel: "next-major",
main: false,
},
]
);
});
test('Release branches - 3 release branches', (t) => {
test("Release branches - 3 release branches", (t) => {
const release = [
{name: 'master', tags: toTags(['1.0.0', '1.0.1', '1.0.2'])},
{name: 'next', tags: toTags(['1.0.0', '1.0.1', '1.0.2', '1.1.0', '1.2.0'])},
{name: 'next-major', tags: toTags(['1.0.0', '1.0.1', '1.0.2', '1.1.0', '1.2.0', '2.0.0', '2.0.1', '2.1.0'])},
{ name: "master", tags: toTags(["1.0.0", "1.0.1", "1.0.2"]) },
{ name: "next", tags: toTags(["1.0.0", "1.0.1", "1.0.2", "1.1.0", "1.2.0"]) },
{ name: "next-major", tags: toTags(["1.0.0", "1.0.1", "1.0.2", "1.1.0", "1.2.0", "2.0.0", "2.0.1", "2.1.0"]) },
];
t.deepEqual(
normalize
.release({release})
.map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
.release({ release })
.map(({ type, name, range, accept, channel, main }) => ({ type, name, range, accept, channel, main })),
[
{type: 'release', name: 'master', range: '>=1.0.2 <1.1.0', accept: ['patch'], channel: undefined, main: true},
{ type: "release", name: "master", range: ">=1.0.2 <1.1.0", accept: ["patch"], channel: undefined, main: true },
{
type: 'release',
name: 'next',
range: '>=1.2.0 <2.0.0',
accept: ['patch', 'minor'],
channel: 'next',
type: "release",
name: "next",
range: ">=1.2.0 <2.0.0",
accept: ["patch", "minor"],
channel: "next",
main: false,
},
{
type: 'release',
name: 'next-major',
range: '>=2.1.0',
accept: ['patch', 'minor', 'major'],
channel: 'next-major',
type: "release",
name: "next-major",
range: ">=2.1.0",
accept: ["patch", "minor", "major"],
channel: "next-major",
main: false,
},
]
);
});
test('Release branches - 2 release branches', (t) => {
test("Release branches - 2 release branches", (t) => {
const release = [
{name: 'master', tags: toTags(['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.2.0'])},
{name: 'next', tags: toTags(['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.2.0', '2.0.0', '2.0.1', '2.1.0'])},
{ name: "master", tags: toTags(["1.0.0", "1.0.1", "1.1.0", "1.1.1", "1.2.0"]) },
{ name: "next", tags: toTags(["1.0.0", "1.0.1", "1.1.0", "1.1.1", "1.2.0", "2.0.0", "2.0.1", "2.1.0"]) },
];
t.deepEqual(
normalize
.release({release})
.map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
.release({ release })
.map(({ type, name, range, accept, channel, main }) => ({ type, name, range, accept, channel, main })),
[
{
type: 'release',
name: 'master',
range: '>=1.2.0 <2.0.0',
accept: ['patch', 'minor'],
type: "release",
name: "master",
range: ">=1.2.0 <2.0.0",
accept: ["patch", "minor"],
channel: undefined,
main: true,
},
{
type: 'release',
name: 'next',
range: '>=2.1.0',
accept: ['patch', 'minor', 'major'],
channel: 'next',
type: "release",
name: "next",
range: ">=2.1.0",
accept: ["patch", "minor", "major"],
channel: "next",
main: false,
},
]
);
});
test('Release branches - 1 release branches', (t) => {
const release = [{name: 'master', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0'])}];
test("Release branches - 1 release branches", (t) => {
const release = [{ name: "master", tags: toTags(["1.0.0", "1.1.0", "1.1.1", "1.2.0"]) }];
t.deepEqual(
normalize.release({release}).map(({type, name, range, accept, channel}) => ({type, name, range, accept, channel})),
[{type: 'release', name: 'master', range: '>=1.2.0', accept: ['patch', 'minor', 'major'], channel: undefined}]
normalize
.release({ release })
.map(({ type, name, range, accept, channel }) => ({ type, name, range, accept, channel })),
[{ type: "release", name: "master", range: ">=1.2.0", accept: ["patch", "minor", "major"], channel: undefined }]
);
});
test('Release branches - cap ranges to first release only present on following branch', (t) => {
test("Release branches - cap ranges to first release only present on following branch", (t) => {
const release = [
{name: 'master', tags: toTags(['1.0.0', '1.1.0', '1.2.0', '2.0.0'])},
{name: 'next', tags: toTags(['1.0.0', '1.1.0', '1.2.0', '2.0.0', '2.1.0'])},
{name: 'next-major', tags: toTags(['1.0.0', '1.1.0', '1.2.0', '2.0.0', '2.1.0', '2.2.0'])},
{ name: "master", tags: toTags(["1.0.0", "1.1.0", "1.2.0", "2.0.0"]) },
{ name: "next", tags: toTags(["1.0.0", "1.1.0", "1.2.0", "2.0.0", "2.1.0"]) },
{ name: "next-major", tags: toTags(["1.0.0", "1.1.0", "1.2.0", "2.0.0", "2.1.0", "2.2.0"]) },
];
t.deepEqual(
normalize
.release({release})
.map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
.release({ release })
.map(({ type, name, range, accept, channel, main }) => ({ type, name, range, accept, channel, main })),
[
{type: 'release', name: 'master', range: '>=2.0.0 <2.1.0', accept: ['patch'], channel: undefined, main: true},
{type: 'release', name: 'next', range: '>=2.1.0 <2.2.0', accept: ['patch'], channel: 'next', main: false},
{ type: "release", name: "master", range: ">=2.0.0 <2.1.0", accept: ["patch"], channel: undefined, main: true },
{ type: "release", name: "next", range: ">=2.1.0 <2.2.0", accept: ["patch"], channel: "next", main: false },
{
type: 'release',
name: 'next-major',
range: '>=2.2.0',
accept: ['patch', 'minor', 'major'],
channel: 'next-major',
type: "release",
name: "next-major",
range: ">=2.2.0",
accept: ["patch", "minor", "major"],
channel: "next-major",
main: false,
},
]
);
});
test('Release branches - Handle missing previous tags in branch history', (t) => {
test("Release branches - Handle missing previous tags in branch history", (t) => {
const release = [
{name: 'master', tags: toTags(['1.0.0', '2.0.0'])},
{name: 'next', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '2.0.0'])},
{ name: "master", tags: toTags(["1.0.0", "2.0.0"]) },
{ name: "next", tags: toTags(["1.0.0", "1.1.0", "1.1.1", "1.2.0", "2.0.0"]) },
];
t.deepEqual(
normalize
.release({release})
.map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
.release({ release })
.map(({ type, name, range, accept, channel, main }) => ({ type, name, range, accept, channel, main })),
[
{
type: 'release',
name: 'master',
range: '>=2.0.0',
accept: ['patch', 'minor', 'major'],
type: "release",
name: "master",
range: ">=2.0.0",
accept: ["patch", "minor", "major"],
channel: undefined,
main: true,
},
{
type: 'release',
name: 'next',
range: '>=2.0.0',
accept: ['patch', 'minor', 'major'],
channel: 'next',
type: "release",
name: "next",
range: ">=2.0.0",
accept: ["patch", "minor", "major"],
channel: "next",
main: false,
},
]
);
});
test('Release branches - limit releases on 2nd and 3rd branch based on 1st branch last release', (t) => {
test("Release branches - limit releases on 2nd and 3rd branch based on 1st branch last release", (t) => {
const release = [
{name: 'master', tags: toTags(['1.0.0', '1.1.0', '2.0.0', '3.0.0'])},
{name: 'next', tags: toTags(['1.0.0', '1.1.0'])},
{name: 'next-major', tags: toTags(['1.0.0', '1.1.0', '2.0.0'])},
{ name: "master", tags: toTags(["1.0.0", "1.1.0", "2.0.0", "3.0.0"]) },
{ name: "next", tags: toTags(["1.0.0", "1.1.0"]) },
{ name: "next-major", tags: toTags(["1.0.0", "1.1.0", "2.0.0"]) },
];
t.deepEqual(
normalize
.release({release})
.map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
.release({ release })
.map(({ type, name, range, accept, channel, main }) => ({ type, name, range, accept, channel, main })),
[
{
type: 'release',
name: 'master',
range: '>=3.0.0',
accept: ['patch', 'minor', 'major'],
type: "release",
name: "master",
range: ">=3.0.0",
accept: ["patch", "minor", "major"],
channel: undefined,
main: true,
},
{
type: 'release',
name: 'next',
range: '>=3.0.0',
accept: ['patch', 'minor', 'major'],
channel: 'next',
type: "release",
name: "next",
range: ">=3.0.0",
accept: ["patch", "minor", "major"],
channel: "next",
main: false,
},
{
type: 'release',
name: 'next-major',
range: '>=3.0.0',
accept: ['patch', 'minor', 'major'],
channel: 'next-major',
type: "release",
name: "next-major",
range: ">=3.0.0",
accept: ["patch", "minor", "major"],
channel: "next-major",
main: false,
},
]
);
});
test('Prerelease branches', (t) => {
test("Prerelease branches", (t) => {
const prerelease = [
{name: 'beta', channel: 'beta', prerelease: true, tags: []},
{name: 'alpha', prerelease: 'preview', tags: []},
{ name: "beta", channel: "beta", prerelease: true, tags: [] },
{ name: "alpha", prerelease: "preview", tags: [] },
];
t.deepEqual(
normalize.prerelease({prerelease}).map(({type, name, channel}) => ({type, name, channel})),
normalize.prerelease({ prerelease }).map(({ type, name, channel }) => ({ type, name, channel })),
[
{type: 'prerelease', name: 'beta', channel: 'beta'},
{type: 'prerelease', name: 'alpha', channel: 'alpha'},
{ type: "prerelease", name: "beta", channel: "beta" },
{ type: "prerelease", name: "alpha", channel: "alpha" },
]
);
});
test('Allow to set channel to "false" to prevent default', (t) => {
const maintenance = [{name: '1.x', channel: false, tags: []}];
const maintenance = [{ name: "1.x", channel: false, tags: [] }];
const release = [
{name: 'master', channel: false, tags: []},
{name: 'next', channel: false, tags: []},
{ name: "master", channel: false, tags: [] },
{ name: "next", channel: false, tags: [] },
];
const prerelease = [{name: 'beta', channel: false, prerelease: true, tags: []}];
const prerelease = [{ name: "beta", channel: false, prerelease: true, tags: [] }];
t.deepEqual(
normalize.maintenance({maintenance, release}).map(({name, channel}) => ({name, channel})),
[{name: '1.x', channel: false}]
normalize.maintenance({ maintenance, release }).map(({ name, channel }) => ({ name, channel })),
[{ name: "1.x", channel: false }]
);
t.deepEqual(
normalize.release({release}).map(({name, channel}) => ({name, channel})),
normalize.release({ release }).map(({ name, channel }) => ({ name, channel })),
[
{name: 'master', channel: false},
{name: 'next', channel: false},
{ name: "master", channel: false },
{ name: "next", channel: false },
]
);
t.deepEqual(
normalize.prerelease({prerelease}).map(({name, channel}) => ({name, channel})),
[{name: 'beta', channel: false}]
normalize.prerelease({ prerelease }).map(({ name, channel }) => ({ name, channel })),
[{ name: "beta", channel: false }]
);
});