for #2543 BREAKING CHANGE: semantic-release is now ESM-only. since it is used through its own executable, the impact on consuming projects should be minimal BREAKING CHANGE: references to plugin files in configs need to include the file extension because of executing in an ESM context
398 lines
11 KiB
JavaScript
398 lines
11 KiB
JavaScript
import test from 'ava';
|
|
import * as normalize from '../../lib/branches/normalize.js';
|
|
|
|
const toTags = (versions) => versions.map((version) => ({version}));
|
|
|
|
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: []},
|
|
];
|
|
const release = [{name: 'master', tags: []}];
|
|
t.deepEqual(
|
|
normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
|
|
type,
|
|
name,
|
|
range,
|
|
accept,
|
|
channel,
|
|
mergeRange,
|
|
})),
|
|
[
|
|
{
|
|
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',
|
|
},
|
|
{
|
|
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',
|
|
},
|
|
{
|
|
type: 'maintenance',
|
|
name: '1.x',
|
|
range: '>=1.3.0 <1.0.0',
|
|
accept: [],
|
|
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) => {
|
|
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'])},
|
|
];
|
|
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']),
|
|
},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize
|
|
.maintenance({maintenance, release})
|
|
.map(({type, name, range, accept, channel, mergeRange: maintenanceRange}) => ({
|
|
type,
|
|
name,
|
|
range,
|
|
accept,
|
|
channel,
|
|
mergeRange: maintenanceRange,
|
|
})),
|
|
[
|
|
{
|
|
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.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',
|
|
accept: [],
|
|
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) => {
|
|
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'])},
|
|
];
|
|
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}) => ({
|
|
type,
|
|
name,
|
|
range,
|
|
accept,
|
|
channel,
|
|
mergeRange,
|
|
})),
|
|
[
|
|
{
|
|
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',
|
|
accept: [],
|
|
channel: '2.x.x',
|
|
mergeRange: '>=2.0.0 <3.0.0',
|
|
},
|
|
]
|
|
);
|
|
});
|
|
|
|
test('Release branches - initial state', (t) => {
|
|
const release = [
|
|
{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})),
|
|
[
|
|
{
|
|
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',
|
|
main: false,
|
|
},
|
|
{
|
|
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) => {
|
|
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'])},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize
|
|
.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: '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',
|
|
main: false,
|
|
},
|
|
]
|
|
);
|
|
});
|
|
|
|
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'])},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize
|
|
.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'],
|
|
channel: undefined,
|
|
main: true,
|
|
},
|
|
{
|
|
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'])}];
|
|
|
|
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}]
|
|
);
|
|
});
|
|
|
|
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'])},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize
|
|
.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: '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) => {
|
|
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'])},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize
|
|
.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'],
|
|
channel: undefined,
|
|
main: true,
|
|
},
|
|
{
|
|
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) => {
|
|
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'])},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize
|
|
.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'],
|
|
channel: undefined,
|
|
main: true,
|
|
},
|
|
{
|
|
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',
|
|
main: false,
|
|
},
|
|
]
|
|
);
|
|
});
|
|
|
|
test('Prerelease branches', (t) => {
|
|
const prerelease = [
|
|
{name: 'beta', channel: 'beta', prerelease: true, tags: []},
|
|
{name: 'alpha', prerelease: 'preview', tags: []},
|
|
];
|
|
|
|
t.deepEqual(
|
|
normalize.prerelease({prerelease}).map(({type, name, channel}) => ({type, name, channel})),
|
|
[
|
|
{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 release = [
|
|
{name: 'master', channel: false, tags: []},
|
|
{name: 'next', channel: false, 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}]
|
|
);
|
|
t.deepEqual(
|
|
normalize.release({release}).map(({name, channel}) => ({name, channel})),
|
|
[
|
|
{name: 'master', channel: false},
|
|
{name: 'next', channel: false},
|
|
]
|
|
);
|
|
t.deepEqual(
|
|
normalize.prerelease({prerelease}).map(({name, channel}) => ({name, channel})),
|
|
[{name: 'beta', channel: false}]
|
|
);
|
|
});
|