Skip to content

Commit 8353d13

Browse files
committed
feat(vcs-host): expect vcs-host scaffolder to return details under the vcs results object
1 parent ca5fd56 commit 8353d13

File tree

6 files changed

+71
-40
lines changed

6 files changed

+71
-40
lines changed

src/scaffolder.js

+11-10
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {reportResults} from '@form8ion/results-reporter';
55
import {scaffold as scaffoldReadme} from '@form8ion/readme';
66
import {info} from '@travi/cli-messages';
77

8-
import {scaffold as scaffoldLanguage, prompt as promptForLanguageDetails} from './language/index.js';
8+
import {prompt as promptForLanguageDetails, scaffold as scaffoldLanguage} from './language/index.js';
99
import {initialize as scaffoldGit, scaffold as liftGit} from './vcs/git/git.js';
1010
import {scaffold as scaffoldLicense} from './license/index.js';
1111
import {scaffold as scaffoldVcsHost} from './vcs/host/index.js';
@@ -56,7 +56,7 @@ export async function scaffold(options) {
5656
])
5757
: [];
5858

59-
const gitResults = gitRepo && await liftGit({projectRoot, origin: vcsHostResults});
59+
const gitResults = gitRepo && await liftGit({projectRoot, vcs: vcsHostResults.vcs});
6060

6161
const {[questionNames.PROJECT_LANGUAGE]: projectLanguage} = await promptForLanguageDetails(languages, decisions);
6262

@@ -66,9 +66,15 @@ export async function scaffold(options) {
6666
{projectRoot, projectName, vcs, visibility, license: chosenLicense || 'UNLICENSED', description}
6767
);
6868

69-
const contributors = [license, language, dependencyUpdaterResults, contributing, gitResults].filter(Boolean);
69+
const mergedResults = deepmerge.all([
70+
license,
71+
language,
72+
dependencyUpdaterResults,
73+
contributing,
74+
gitResults
75+
].filter(Boolean));
7076

71-
await lift({projectRoot, vcs, results: deepmerge.all(contributors), enhancers: {...dependencyUpdaters, ...vcsHosts}});
77+
await lift({projectRoot, vcs, results: mergedResults, enhancers: {...dependencyUpdaters, ...vcsHosts}});
7278

7379
if (language && language.verificationCommand) {
7480
info('Verifying the generated project');
@@ -78,10 +84,5 @@ export async function scaffold(options) {
7884
await subprocess;
7985
}
8086

81-
const contributedTasks = contributors
82-
.map(contributor => contributor.nextSteps)
83-
.filter(Boolean)
84-
.reduce((acc, contributedNextSteps) => ([...acc, ...contributedNextSteps]), []);
85-
86-
reportResults({nextSteps: contributedTasks});
87+
reportResults({nextSteps: mergedResults.nextSteps});
8788
}

src/scaffolder.test.js

+50-20
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import any from '@travi/any';
99
import {when} from 'jest-when';
1010

1111
import {scaffold as liftGit, initialize as scaffoldGit} from './vcs/git/git.js';
12-
import * as vcsHostScaffolder from './vcs/host/scaffolder.js';
12+
import {scaffold as scaffoldVcsHost} from './vcs/host/index.js';
1313
import * as licenseScaffolder from './license/scaffolder.js';
1414
import scaffoldLanguage from './language/scaffolder.js';
1515
import * as languagePrompt from './language/prompt.js';
@@ -27,7 +27,7 @@ vi.mock('@form8ion/execa-wrapper');
2727
vi.mock('@form8ion/results-reporter');
2828
vi.mock('./readme');
2929
vi.mock('./vcs/git/git.js');
30-
vi.mock('./vcs/host/scaffolder');
30+
vi.mock('./vcs/host/index.js');
3131
vi.mock('./license/scaffolder');
3232
vi.mock('./language/scaffolder');
3333
vi.mock('./language/prompt');
@@ -53,6 +53,7 @@ describe('project scaffolder', () => {
5353
const documentation = any.simpleObject();
5454
const vcs = any.simpleObject();
5555
const vcsOriginDetails = any.simpleObject();
56+
const vcsHostResults = {...any.simpleObject(), vcs: vcsOriginDetails};
5657
const tags = any.listOf(any.word);
5758
const visibility = any.word();
5859
const vcsIgnore = any.simpleObject();
@@ -117,7 +118,7 @@ describe('project scaffolder', () => {
117118
when(licenseScaffolder.default)
118119
.calledWith({projectRoot: projectPath, license, copyright})
119120
.mockResolvedValue(licenseResults);
120-
when(vcsHostScaffolder.default)
121+
when(scaffoldVcsHost)
121122
.calledWith(
122123
vcsHosts,
123124
{
@@ -127,7 +128,7 @@ describe('project scaffolder', () => {
127128
visibility
128129
}
129130
)
130-
.mockResolvedValue(vcsOriginDetails);
131+
.mockResolvedValue(vcsHostResults);
131132
scaffoldLanguage.mockResolvedValue(languageResults);
132133
when(dependencyUpdaterScaffolder.default)
133134
.calledWith(dependencyUpdaters, decisions, {projectRoot: projectPath, vcs})
@@ -138,7 +139,7 @@ describe('project scaffolder', () => {
138139

139140
expect(liftGit).toHaveBeenCalledWith({
140141
projectRoot: projectPath,
141-
origin: vcsOriginDetails
142+
vcs: vcsOriginDetails
142143
});
143144
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
144145
expect(dependencyUpdaterScaffolder.default).toHaveBeenCalledWith(
@@ -173,7 +174,20 @@ describe('project scaffolder', () => {
173174
[coreQuestionNames.PROJECT_NAME]: projectName,
174175
[questionNames.GIT_REPO]: gitRepoShouldBeInitialized
175176
});
177+
178+
when(scaffoldGit).mockResolvedValue(vcs);
176179
languagePrompt.default.mockResolvedValue({});
180+
when(scaffoldVcsHost)
181+
.calledWith(
182+
{},
183+
{
184+
...vcs,
185+
projectRoot: projectPath,
186+
description: undefined,
187+
visibility: undefined
188+
}
189+
)
190+
.mockResolvedValue(vcsHostResults);
177191

178192
await scaffold();
179193

@@ -184,9 +198,10 @@ describe('project scaffolder', () => {
184198
it('should consider each option except the plugins map optional', async () => {
185199
const emptyOptions = {};
186200
when(optionsValidator.validate).calledWith(emptyOptions).mockReturnValue({plugins: {}});
187-
when(prompts.promptForBaseDetails).calledWith(projectPath, undefined, undefined).mockResolvedValue({});
201+
when(prompts.promptForBaseDetails).calledWith(projectPath, undefined).mockResolvedValue({});
188202
languagePrompt.default.mockResolvedValue({});
189203
scaffoldGit.mockResolvedValue({});
204+
scaffoldVcsHost.mockResolvedValue(vcsHostResults);
190205

191206
await scaffold(emptyOptions);
192207
});
@@ -213,18 +228,36 @@ describe('project scaffolder', () => {
213228
contribution: any.simpleObject()
214229
};
215230
const languageResults = {badges: languageBadges, vcsIgnore, documentation};
231+
when(optionsValidator.validate).calledWith(options).mockReturnValue({plugins: {vcsHosts}});
216232
when(prompts.promptForBaseDetails)
217-
.calledWith(projectPath, undefined, undefined)
218-
.mockResolvedValue({[coreQuestionNames.VISIBILITY]: visibility});
233+
.calledWith(projectPath, undefined)
234+
.mockResolvedValue({
235+
[coreQuestionNames.DESCRIPTION]: description,
236+
[questionNames.GIT_REPO]: true,
237+
[coreQuestionNames.PROJECT_NAME]: projectName,
238+
[coreQuestionNames.VISIBILITY]: visibility
239+
});
219240
when(scaffoldContributing).calledWith({visibility}).mockReturnValue({badges: contributingBadges});
220241
scaffoldLanguage.mockResolvedValue(languageResults);
221-
vcsHostScaffolder.default.mockResolvedValue(vcsOriginDetails);
242+
when(scaffoldVcsHost)
243+
.calledWith(
244+
vcsHosts,
245+
{
246+
...vcs,
247+
projectRoot: projectPath,
248+
description,
249+
visibility
250+
}
251+
)
252+
.mockResolvedValue(vcsHostResults);
222253
dependencyUpdaterScaffolder.default.mockResolvedValue({badges: dependencyUpdaterBadges});
223254
licenseScaffolder.default.mockResolvedValue({badges: licenseBadges});
255+
languagePrompt.default.mockResolvedValue({});
256+
when(scaffoldGit).mockResolvedValue(vcs);
224257

225258
await scaffold(options);
226259

227-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, origin: vcsOriginDetails});
260+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs: vcsOriginDetails});
228261
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
229262
});
230263

@@ -238,7 +271,7 @@ describe('project scaffolder', () => {
238271
await scaffold(options);
239272

240273
expect(liftGit).not.toHaveBeenCalled();
241-
expect(vcsHostScaffolder.default).not.toHaveBeenCalled();
274+
expect(scaffoldVcsHost).not.toHaveBeenCalled();
242275
expect(dependencyUpdaterScaffolder.default).not.toHaveBeenCalled();
243276
});
244277

@@ -287,26 +320,23 @@ describe('project scaffolder', () => {
287320
vcs,
288321
description
289322
}).mockResolvedValue(languageResults);
290-
when(vcsHostScaffolder.default).calledWith(
323+
when(scaffoldVcsHost).calledWith(
291324
vcsHosts,
292325
{
293326
...vcs,
294327
projectRoot: projectPath,
295328
description,
296-
homepage,
297-
visibility,
298-
nextSteps: languageNextSteps,
299-
tags
329+
visibility
300330
}
301-
).mockResolvedValue(vcsOriginDetails);
331+
).mockResolvedValue(vcsHostResults);
302332
when(execa).calledWith(verificationCommand, {shell: true}).mockReturnValue({stdout: {pipe: execaPipe}});
303333
dependencyUpdaterScaffolder.default.mockResolvedValue({});
304334
licenseScaffolder.default.mockResolvedValue({});
305335
scaffoldContributing.mockResolvedValue({});
306336

307337
await scaffold(options);
308338

309-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, origin: vcsOriginDetails});
339+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs: vcsOriginDetails});
310340
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
311341
expect(execaPipe).toHaveBeenCalledWith(process.stdout);
312342
expect(resultsReporter.reportResults).toHaveBeenCalledWith({nextSteps: [...languageNextSteps, ...gitNextSteps]});
@@ -327,15 +357,15 @@ describe('project scaffolder', () => {
327357
when(languagePrompt.default)
328358
.calledWith(languages, decisions)
329359
.mockResolvedValue({[questionNames.PROJECT_LANGUAGE]: projectLanguage});
330-
vcsHostScaffolder.default.mockResolvedValue(vcsOriginDetails);
360+
scaffoldVcsHost.mockResolvedValue(vcsHostResults);
331361
scaffoldLanguage.mockResolvedValue({});
332362
dependencyUpdaterScaffolder.default.mockResolvedValue({});
333363
licenseScaffolder.default.mockResolvedValue({});
334364
scaffoldContributing.mockResolvedValue({});
335365

336366
await scaffold(options);
337367

338-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, origin: vcsOriginDetails});
368+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs: vcsOriginDetails});
339369
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
340370
expect(execa).not.toHaveBeenCalled();
341371
});

src/vcs/git/git.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ async function getExistingRemotes(git) {
1818
}
1919
}
2020

21-
async function defineRemoteOrigin(projectRoot, origin) {
21+
async function defineRemoteOrigin(projectRoot, vcs) {
2222
const git = simpleGit({baseDir: projectRoot});
2323
const existingRemotes = await getExistingRemotes(git);
2424

@@ -28,10 +28,10 @@ async function defineRemoteOrigin(projectRoot, origin) {
2828
return {nextSteps: []};
2929
}
3030

31-
if (origin.sshUrl) {
32-
info(`Setting remote origin to ${origin.sshUrl}`, {level: 'secondary'});
31+
if (vcs.sshUrl) {
32+
info(`Setting remote origin to ${vcs.sshUrl}`, {level: 'secondary'});
3333

34-
await git.addRemote('origin', origin.sshUrl);
34+
await git.addRemote('origin', vcs.sshUrl);
3535

3636
// info('Setting the local `master` branch to track `origin/master`');
3737
//
@@ -82,10 +82,10 @@ export async function initialize(
8282
return undefined;
8383
}
8484

85-
export async function scaffold({projectRoot, origin}) {
85+
export async function scaffold({projectRoot, vcs}) {
8686
info('Finishing Git Configuration');
8787

88-
const remoteOriginResults = await defineRemoteOrigin(projectRoot, origin);
88+
const remoteOriginResults = await defineRemoteOrigin(projectRoot, vcs);
8989

9090
return {nextSteps: [{summary: 'Commit scaffolded files'}, ...remoteOriginResults.nextSteps]};
9191
}

src/vcs/git/git.test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ describe('git', () => {
9191
it('should scaffold the git repo', async () => {
9292
listRemote.mockRejectedValue(new Error('fatal: No remote configured to list refs from.\n'));
9393

94-
const result = await scaffold({projectRoot, origin: {}, results});
94+
const result = await scaffold({projectRoot, vcs: {}, results});
9595

9696
expect(result.nextSteps).toEqual([{summary: 'Commit scaffolded files'}]);
9797
});
@@ -109,7 +109,7 @@ describe('git', () => {
109109
// gitBranch.lookup.withArgs(repository, 'master', gitBranch.BRANCH.LOCAL).resolves(branch);
110110
listRemote.mockResolvedValue(any.listOf(any.word));
111111

112-
const result = await scaffold({projectRoot, origin: {sshUrl}});
112+
const result = await scaffold({projectRoot, vcs: {sshUrl}});
113113

114114
expect(addRemote).toHaveBeenCalledWith('origin', sshUrl);
115115
expect(result.nextSteps).toEqual([

test/integration/features/step_definitions/common-steps.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ When(/^the project is scaffolded$/, async function () {
7373
...vcsHost && {
7474
vcsHosts: {
7575
[vcsHost]: {
76-
scaffold: ({name, owner}) => ({sshUrl: this.remoteOriginUrl, name, owner}),
76+
scaffold: ({name, owner}) => ({vcs: {sshUrl: this.remoteOriginUrl, name, owner}}),
7777
prompt: () => undefined
7878
}
7979
}

vitest.config.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
import {defineConfig} from 'vitest/config';
22

3-
export default defineConfig({test: {globals: true}});
3+
export default defineConfig({test: {globals: true, restoreMocks: true}});

0 commit comments

Comments
 (0)