Skip to content

Commit 9d52a53

Browse files
committed
feat(vcs): expect vcs details as results from scaffolding the vcs host
since the details are truly about the hosted repository rather than the local repository BREAKING CHANGE: vcs-host scaffolder is expected to return `host`, `name`, and `owner` details in a `vcs` object in results
1 parent 1a1ae41 commit 9d52a53

File tree

8 files changed

+87
-110
lines changed

8 files changed

+87
-110
lines changed

src/scaffolder.js

+15-22
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {info} from '@travi/cli-messages';
88
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';
11-
import {scaffold as scaffoldVcsHost} from './vcs/host/index.js';
1211
import scaffoldDependencyUpdater from './dependency-updater/scaffolder.js';
1312
import {promptForBaseDetails} from './prompts/questions.js';
1413
import {validate} from './options-validator.js';
@@ -32,39 +31,28 @@ export async function scaffold(options) {
3231
} = await promptForBaseDetails(projectRoot, decisions);
3332
const copyright = {year: copyrightYear, holder: copyHolder};
3433

35-
const [vcs, contributing, license] = await Promise.all([
36-
scaffoldGit(gitRepo, projectRoot, projectName, vcsHosts, visibility, decisions),
34+
const [vcsResults, contributing, license] = await Promise.all([
35+
scaffoldGit(gitRepo, projectRoot, projectName, description, vcsHosts, visibility, decisions),
3736
scaffoldContributing({visibility}),
3837
scaffoldLicense({projectRoot, license: chosenLicense, copyright}),
3938
scaffoldReadme({projectName, projectRoot, description}),
4039
scaffoldEditorConfig({projectRoot})
4140
]);
4241

43-
const [vcsHostResults, dependencyUpdaterResults] = vcs
44-
? await Promise.all([
45-
scaffoldVcsHost(vcsHosts, {
46-
...vcs,
47-
projectName,
48-
projectRoot,
49-
description,
50-
visibility
51-
}),
52-
scaffoldDependencyUpdater(
53-
dependencyUpdaters,
54-
decisions,
55-
{projectRoot, vcs}
56-
)
57-
])
58-
: [];
42+
const dependencyUpdaterResults = vcsResults.vcs && await scaffoldDependencyUpdater(
43+
dependencyUpdaters,
44+
decisions,
45+
{projectRoot, vcs: vcsResults.vcs}
46+
);
5947

60-
const gitResults = gitRepo && await liftGit({projectRoot, vcs: vcsHostResults.vcs});
48+
const gitResults = gitRepo && await liftGit({projectRoot, vcs: vcsResults.vcs});
6149

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

6452
const language = await scaffoldLanguage(
6553
languages,
6654
projectLanguage,
67-
{projectRoot, projectName, vcs, visibility, license: chosenLicense || 'UNLICENSED', description}
55+
{projectRoot, projectName, vcs: vcsResults.vcs, visibility, license: chosenLicense || 'UNLICENSED', description}
6856
);
6957

7058
const mergedResults = deepmerge.all([
@@ -75,7 +63,12 @@ export async function scaffold(options) {
7563
gitResults
7664
].filter(Boolean));
7765

78-
await lift({projectRoot, vcs, results: mergedResults, enhancers: {...dependencyUpdaters, ...vcsHosts}});
66+
await lift({
67+
projectRoot,
68+
vcs: vcsResults.vcs,
69+
results: mergedResults,
70+
enhancers: {...dependencyUpdaters, ...vcsHosts}
71+
});
7972

8073
if (language && language.verificationCommand) {
8174
info('Verifying the generated project');

src/scaffolder.test.js

+15-71
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ 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 {scaffold as scaffoldVcsHost} from './vcs/host/index.js';
1312
import * as licenseScaffolder from './license/scaffolder.js';
1413
import scaffoldLanguage from './language/scaffolder.js';
1514
import * as languagePrompt from './language/prompt.js';
@@ -27,7 +26,6 @@ vi.mock('@form8ion/execa-wrapper');
2726
vi.mock('@form8ion/results-reporter');
2827
vi.mock('./readme');
2928
vi.mock('./vcs/git/git.js');
30-
vi.mock('./vcs/host/index.js');
3129
vi.mock('./license/scaffolder');
3230
vi.mock('./language/scaffolder');
3331
vi.mock('./language/prompt');
@@ -52,8 +50,7 @@ describe('project scaffolder', () => {
5250
const vcsHosts = any.simpleObject();
5351
const documentation = any.simpleObject();
5452
const vcs = any.simpleObject();
55-
const vcsOriginDetails = any.simpleObject();
56-
const vcsHostResults = {...any.simpleObject(), vcs: vcsOriginDetails};
53+
const vcsResults = {...any.simpleObject(), vcs};
5754
const tags = any.listOf(any.word);
5855
const visibility = any.word();
5956
const vcsIgnore = any.simpleObject();
@@ -112,24 +109,12 @@ describe('project scaffolder', () => {
112109
.calledWith(languages, decisions)
113110
.mockResolvedValue({[questionNames.PROJECT_LANGUAGE]: projectLanguage});
114111
when(scaffoldGit)
115-
.calledWith(gitRepoShouldBeInitialized, projectPath, projectName, vcsHosts, visibility, decisions)
116-
.mockResolvedValue(vcs);
112+
.calledWith(gitRepoShouldBeInitialized, projectPath, projectName, description, vcsHosts, visibility, decisions)
113+
.mockResolvedValue(vcsResults);
117114
liftGit.mockResolvedValue(gitResults);
118115
when(licenseScaffolder.default)
119116
.calledWith({projectRoot: projectPath, license, copyright})
120117
.mockResolvedValue(licenseResults);
121-
when(scaffoldVcsHost)
122-
.calledWith(
123-
vcsHosts,
124-
{
125-
...vcs,
126-
projectRoot: projectPath,
127-
projectName,
128-
description,
129-
visibility
130-
}
131-
)
132-
.mockResolvedValue(vcsHostResults);
133118
scaffoldLanguage.mockResolvedValue(languageResults);
134119
when(dependencyUpdaterScaffolder.default)
135120
.calledWith(dependencyUpdaters, decisions, {projectRoot: projectPath, vcs})
@@ -138,10 +123,7 @@ describe('project scaffolder', () => {
138123

139124
await scaffold(options);
140125

141-
expect(liftGit).toHaveBeenCalledWith({
142-
projectRoot: projectPath,
143-
vcs: vcsOriginDetails
144-
});
126+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
145127
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
146128
expect(dependencyUpdaterScaffolder.default).toHaveBeenCalledWith(
147129
dependencyUpdaters,
@@ -175,26 +157,13 @@ describe('project scaffolder', () => {
175157
[coreQuestionNames.PROJECT_NAME]: projectName,
176158
[questionNames.GIT_REPO]: gitRepoShouldBeInitialized
177159
});
178-
179-
when(scaffoldGit).mockResolvedValue(vcs);
160+
when(scaffoldGit).mockResolvedValue(vcsResults);
180161
languagePrompt.default.mockResolvedValue({});
181-
when(scaffoldVcsHost)
182-
.calledWith(
183-
{},
184-
{
185-
...vcs,
186-
projectRoot: projectPath,
187-
projectName,
188-
description: undefined,
189-
visibility: undefined
190-
}
191-
)
192-
.mockResolvedValue(vcsHostResults);
193162

194163
await scaffold();
195164

196165
expect(scaffoldGit)
197-
.toHaveBeenCalledWith(gitRepoShouldBeInitialized, projectPath, projectName, {}, undefined, undefined);
166+
.toHaveBeenCalledWith(gitRepoShouldBeInitialized, projectPath, projectName, undefined, {}, undefined, undefined);
198167
});
199168

200169
it('should consider each option except the plugins map optional', async () => {
@@ -203,7 +172,6 @@ describe('project scaffolder', () => {
203172
when(prompts.promptForBaseDetails).calledWith(projectPath, undefined).mockResolvedValue({});
204173
languagePrompt.default.mockResolvedValue({});
205174
scaffoldGit.mockResolvedValue({});
206-
scaffoldVcsHost.mockResolvedValue(vcsHostResults);
207175

208176
await scaffold(emptyOptions);
209177
});
@@ -241,26 +209,14 @@ describe('project scaffolder', () => {
241209
});
242210
when(scaffoldContributing).calledWith({visibility}).mockReturnValue({badges: contributingBadges});
243211
scaffoldLanguage.mockResolvedValue(languageResults);
244-
when(scaffoldVcsHost)
245-
.calledWith(
246-
vcsHosts,
247-
{
248-
...vcs,
249-
projectRoot: projectPath,
250-
projectName,
251-
description,
252-
visibility
253-
}
254-
)
255-
.mockResolvedValue(vcsHostResults);
256212
dependencyUpdaterScaffolder.default.mockResolvedValue({badges: dependencyUpdaterBadges});
257213
licenseScaffolder.default.mockResolvedValue({badges: licenseBadges});
258214
languagePrompt.default.mockResolvedValue({});
259-
when(scaffoldGit).mockResolvedValue(vcs);
215+
when(scaffoldGit).mockResolvedValue(vcsResults);
260216

261217
await scaffold(options);
262218

263-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs: vcsOriginDetails});
219+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
264220
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
265221
});
266222

@@ -269,12 +225,11 @@ describe('project scaffolder', () => {
269225
prompts.promptForBaseDetails.mockResolvedValue({[questionNames.GIT_REPO]: false});
270226
languagePrompt.default.mockResolvedValue({});
271227
scaffoldReadme.mockResolvedValue();
272-
scaffoldGit.mockResolvedValue(undefined);
228+
scaffoldGit.mockResolvedValue({});
273229

274230
await scaffold(options);
275231

276232
expect(liftGit).not.toHaveBeenCalled();
277-
expect(scaffoldVcsHost).not.toHaveBeenCalled();
278233
expect(dependencyUpdaterScaffolder.default).not.toHaveBeenCalled();
279234
});
280235

@@ -303,7 +258,7 @@ describe('project scaffolder', () => {
303258
when(optionsValidator.validate)
304259
.calledWith(options)
305260
.mockReturnValue({decisions, plugins: {languages, vcsHosts}});
306-
scaffoldGit.mockResolvedValue(vcs);
261+
scaffoldGit.mockResolvedValue(vcsResults);
307262
liftGit.mockResolvedValue(gitResults);
308263
prompts.promptForBaseDetails.mockResolvedValue({
309264
[coreQuestionNames.PROJECT_NAME]: projectName,
@@ -323,24 +278,14 @@ describe('project scaffolder', () => {
323278
vcs,
324279
description
325280
}).mockResolvedValue(languageResults);
326-
when(scaffoldVcsHost).calledWith(
327-
vcsHosts,
328-
{
329-
...vcs,
330-
projectRoot: projectPath,
331-
projectName,
332-
description,
333-
visibility
334-
}
335-
).mockResolvedValue(vcsHostResults);
336281
when(execa).calledWith(verificationCommand, {shell: true}).mockReturnValue({stdout: {pipe: execaPipe}});
337282
dependencyUpdaterScaffolder.default.mockResolvedValue({});
338283
licenseScaffolder.default.mockResolvedValue({});
339284
scaffoldContributing.mockResolvedValue({});
340285

341286
await scaffold(options);
342287

343-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs: vcsOriginDetails});
288+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
344289
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
345290
expect(execaPipe).toHaveBeenCalledWith(process.stdout);
346291
expect(resultsReporter.reportResults).toHaveBeenCalledWith({nextSteps: [...languageNextSteps, ...gitNextSteps]});
@@ -350,7 +295,7 @@ describe('project scaffolder', () => {
350295
when(optionsValidator.validate)
351296
.calledWith(options)
352297
.mockReturnValue({vcsHosts, decisions, plugins: {languages}});
353-
scaffoldGit.mockResolvedValue(vcs);
298+
scaffoldGit.mockResolvedValue(vcsResults);
354299
prompts.promptForBaseDetails.mockResolvedValue({
355300
[coreQuestionNames.PROJECT_NAME]: projectName,
356301
[coreQuestionNames.VISIBILITY]: visibility,
@@ -361,15 +306,14 @@ describe('project scaffolder', () => {
361306
when(languagePrompt.default)
362307
.calledWith(languages, decisions)
363308
.mockResolvedValue({[questionNames.PROJECT_LANGUAGE]: projectLanguage});
364-
scaffoldVcsHost.mockResolvedValue(vcsHostResults);
365309
scaffoldLanguage.mockResolvedValue({});
366310
dependencyUpdaterScaffolder.default.mockResolvedValue({});
367311
licenseScaffolder.default.mockResolvedValue({});
368312
scaffoldContributing.mockResolvedValue({});
369313

370314
await scaffold(options);
371315

372-
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs: vcsOriginDetails});
316+
expect(liftGit).toHaveBeenCalledWith({projectRoot: projectPath, vcs});
373317
expect(scaffoldReadme).toHaveBeenCalledWith({projectName, projectRoot: projectPath, description});
374318
expect(execa).not.toHaveBeenCalled();
375319
});
@@ -378,7 +322,7 @@ describe('project scaffolder', () => {
378322
when(optionsValidator.validate).calledWith(options).mockReturnValue({plugins: {languages}});
379323
prompts.promptForBaseDetails.mockResolvedValue({});
380324
languagePrompt.default.mockResolvedValue({[questionNames.PROJECT_LANGUAGE]: projectLanguage});
381-
scaffoldGit.mockResolvedValue({});
325+
scaffoldGit.mockResolvedValue(vcsResults);
382326

383327
await scaffold(options);
384328

@@ -390,7 +334,7 @@ describe('project scaffolder', () => {
390334
description: undefined,
391335
projectName: undefined,
392336
projectRoot: projectPath,
393-
vcs: {},
337+
vcs,
394338
visibility: undefined
395339
}
396340
);

src/vcs/git/git.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {scaffold as scaffoldGit} from '@form8ion/git';
55

66
import promptForVcsHostDetails from '../host/prompt.js';
77
import {questionNames} from '../../prompts/question-names.js';
8+
import {scaffold as scaffoldVcsHost} from '../host/index.js';
89

910
async function getExistingRemotes(git) {
1011
try {
@@ -52,6 +53,7 @@ export async function initialize(
5253
gitRepoShouldBeInitialized,
5354
projectRoot,
5455
projectName,
56+
description,
5557
vcsHosts,
5658
visibility,
5759
decisions
@@ -72,14 +74,17 @@ export async function initialize(
7274
scaffoldGit({projectRoot})
7375
]);
7476

75-
return {
76-
host: answers[questionNames.REPO_HOST].toLowerCase(),
77+
return scaffoldVcsHost(vcsHosts, {
78+
chosenHost: answers[questionNames.REPO_HOST].toLowerCase(),
7779
owner: answers[questionNames.REPO_OWNER],
78-
name: projectName
79-
};
80+
projectName,
81+
projectRoot,
82+
description,
83+
visibility
84+
});
8085
}
8186

82-
return undefined;
87+
return {};
8388
}
8489

8590
export async function scaffold({projectRoot, vcs}) {

0 commit comments

Comments
 (0)