Skip to content

Commit 7947f05

Browse files
committed
refactor(semantic-release): extracted the scaffolding functionality to follow the plugin pattern
1 parent e489fc1 commit 7947f05

File tree

8 files changed

+183
-58
lines changed

8 files changed

+183
-58
lines changed

package-lock.json

Lines changed: 83 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"@form8ion/eslint-config-mocha": "1.2.12",
5959
"@form8ion/remark-lint-preset": "2.1.6",
6060
"@rollup/plugin-babel": "5.3.0",
61+
"@rollup/plugin-node-resolve": "13.1.1",
6162
"@travi/any": "2.0.19",
6263
"babel-plugin-istanbul": "6.1.1",
6364
"ban-sensitive-files": "1.9.16",

rollup.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import autoExternal from 'rollup-plugin-auto-external';
2+
import nodeResolve from '@rollup/plugin-node-resolve';
23

34
export default {
45
input: 'src/index.js',
5-
plugins: [autoExternal()],
6+
plugins: [autoExternal(), nodeResolve({mainFields: ['module']})],
67
output: [
78
{file: 'lib/index.cjs.js', format: 'cjs', sourcemap: true},
89
{file: 'lib/index.es.js', format: 'es', sourcemap: true}

src/scaffolder-test.js

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import deepmerge from 'deepmerge';
12
import {projectTypes} from '@form8ion/javascript-core';
23

34
import sinon from 'sinon';
45
import any from '@travi/any';
56
import {assert} from 'chai';
67

8+
import * as semanticReleaseScaffolder from './semantic-release/scaffolder';
79
import * as commitizenScaffolder from './commitizen';
810
import * as commitlintScaffolder from './commitlint';
911
import scaffoldCommitConvention from './scaffolder';
@@ -12,31 +14,26 @@ suite('commit-convention scaffolder', () => {
1214
let sandbox;
1315
const projectRoot = any.string();
1416
const packageManager = any.word();
15-
const commitizenScripts = any.simpleObject();
16-
const commitizenDevDependencies = any.listOf(any.string);
1717
const publishedProjectType = any.fromList([projectTypes.PACKAGE, projectTypes.CLI]);
18-
const contributionBadges = {
19-
'commit-convention': {
20-
img: 'https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg',
21-
text: 'Conventional Commits',
22-
link: 'https://conventionalcommits.org'
23-
}
24-
};
25-
const semanticReleaseBadge = {
26-
img: 'https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release',
27-
text: 'semantic-release: angular',
28-
link: 'https://github.com/semantic-release/semantic-release'
18+
const mergedResults = any.simpleObject();
19+
const commitizenResults = any.simpleObject();
20+
const semanticReleaseResults = any.simpleObject();
21+
const conventionalCommitsBadge = {
22+
img: 'https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg',
23+
text: 'Conventional Commits',
24+
link: 'https://conventionalcommits.org'
2925
};
3026

3127
setup(() => {
3228
sandbox = sinon.createSandbox();
3329

30+
sandbox.stub(deepmerge, 'all');
3431
sandbox.stub(commitlintScaffolder, 'default');
3532
sandbox.stub(commitizenScaffolder, 'default');
33+
sandbox.stub(semanticReleaseScaffolder, 'default');
3634

37-
commitizenScaffolder.default
38-
.withArgs({projectRoot})
39-
.resolves({devDependencies: commitizenDevDependencies, scripts: commitizenScripts});
35+
commitizenScaffolder.default.withArgs({projectRoot}).resolves(commitizenResults);
36+
semanticReleaseScaffolder.default.returns(semanticReleaseResults);
4037
});
4138

4239
teardown(() => sandbox.restore());
@@ -51,53 +48,66 @@ suite('commit-convention scaffolder', () => {
5148
pathWithinParent: any.string(),
5249
projectType: publishedProjectType
5350
}),
54-
{
55-
packageProperties: {version: '0.0.0-semantically-released'},
56-
badges: {contribution: {'semantic-release': semanticReleaseBadge}}
57-
}
51+
semanticReleaseResults
5852
);
5953
});
6054

6155
test('that the convention is configured', async () => {
6256
const commitlintConfig = any.simpleObject();
63-
const commitlintDevDependencies = any.listOf(any.string);
64-
commitlintScaffolder.default
65-
.withArgs({projectRoot, config: commitlintConfig})
66-
.resolves({devDependencies: commitlintDevDependencies});
57+
const commitlintResults = any.simpleObject();
58+
commitlintScaffolder.default.withArgs({projectRoot, config: commitlintConfig}).resolves(commitlintResults);
59+
deepmerge.all
60+
.withArgs([
61+
commitizenResults,
62+
commitlintResults,
63+
{
64+
vcsIgnore: {files: [], directories: []},
65+
badges: {contribution: {'commit-convention': conventionalCommitsBadge}}
66+
},
67+
{}
68+
])
69+
.returns(mergedResults);
6770

68-
assert.deepEqual(
71+
assert.equal(
6972
await scaffoldCommitConvention({projectRoot, packageManager, configs: {commitlint: commitlintConfig}}),
70-
{
71-
devDependencies: [...commitizenDevDependencies, ...commitlintDevDependencies],
72-
scripts: commitizenScripts,
73-
vcsIgnore: {files: [], directories: []},
74-
badges: {contribution: contributionBadges}
75-
}
73+
mergedResults
7674
);
7775
});
7876

7977
test('that commitlint is not configured if no config is provided', async () => {
78+
deepmerge.all
79+
.withArgs([
80+
commitizenResults,
81+
{
82+
vcsIgnore: {files: [], directories: []},
83+
badges: {contribution: {'commit-convention': conventionalCommitsBadge}}
84+
},
85+
{}
86+
])
87+
.returns(mergedResults);
88+
8089
assert.deepEqual(
8190
await scaffoldCommitConvention({projectRoot, configs: {}, packageManager}),
82-
{
83-
devDependencies: commitizenDevDependencies,
84-
scripts: commitizenScripts,
85-
vcsIgnore: {files: [], directories: []},
86-
badges: {contribution: contributionBadges}
87-
}
91+
mergedResults
8892
);
8993
assert.notCalled(commitlintScaffolder.default);
9094
});
9195

9296
test('that semantic-release is configured for packages', async () => {
93-
const {badges, packageProperties} = await scaffoldCommitConvention({
94-
projectRoot,
95-
projectType: publishedProjectType,
96-
configs: {},
97-
packageManager
98-
});
97+
deepmerge.all
98+
.withArgs([
99+
commitizenResults,
100+
{
101+
vcsIgnore: {files: [], directories: []},
102+
badges: {contribution: {'commit-convention': conventionalCommitsBadge}}
103+
},
104+
semanticReleaseResults
105+
])
106+
.returns(mergedResults);
99107

100-
assert.equal(packageProperties.version, '0.0.0-semantically-released');
101-
assert.deepEqual(badges.contribution['semantic-release'], semanticReleaseBadge);
108+
assert.deepEqual(
109+
await scaffoldCommitConvention({projectRoot, projectType: publishedProjectType, configs: {}, packageManager}),
110+
mergedResults
111+
);
102112
});
103113
});

src/scaffolder.js

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
import deepmerge from 'deepmerge';
22
import {projectTypes} from '@form8ion/javascript-core';
33

4+
import {scaffold as scaffoldSemanticRelease} from './semantic-release';
45
import scaffoldCommitizen from './commitizen';
56
import scaffoldCommitlint from './commitlint';
67

78
export default async function ({projectRoot, projectType, configs, pathWithinParent}) {
8-
const detailsForProjectsPublishedToARegistry = [projectTypes.PACKAGE, projectTypes.CLI].includes(projectType) ? {
9-
packageProperties: {version: '0.0.0-semantically-released'},
10-
badges: {
11-
contribution: {
12-
'semantic-release': {
13-
img: 'https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release',
14-
text: 'semantic-release: angular',
15-
link: 'https://github.com/semantic-release/semantic-release'
16-
}
17-
}
18-
}
19-
} : {};
9+
const detailsForProjectsPublishedToARegistry = [projectTypes.PACKAGE, projectTypes.CLI].includes(projectType)
10+
? scaffoldSemanticRelease()
11+
: {};
2012

2113
if (pathWithinParent) return detailsForProjectsPublishedToARegistry;
2214

src/semantic-release/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {default as scaffold} from './scaffolder';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {assert} from 'chai';
2+
3+
import scaffoldSemanticRelease from './scaffolder';
4+
5+
suite('semantic-release scaffolder', () => {
6+
test('that that the badge and version string are generated', async () => {
7+
assert.deepEqual(
8+
await scaffoldSemanticRelease(),
9+
{
10+
packageProperties: {version: '0.0.0-semantically-released'},
11+
badges: {
12+
contribution: {
13+
'semantic-release': {
14+
img: 'https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release',
15+
text: 'semantic-release: angular',
16+
link: 'https://github.com/semantic-release/semantic-release'
17+
}
18+
}
19+
}
20+
}
21+
);
22+
});
23+
});

src/semantic-release/scaffolder.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export default function () {
2+
return {
3+
packageProperties: {version: '0.0.0-semantically-released'},
4+
badges: {
5+
contribution: {
6+
'semantic-release': {
7+
img: 'https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release',
8+
text: 'semantic-release: angular',
9+
link: 'https://github.com/semantic-release/semantic-release'
10+
}
11+
}
12+
}
13+
};
14+
}

0 commit comments

Comments
 (0)