Skip to content

Commit a464362

Browse files
committed
feat(plugins): moved the vcs-host plugins under the plugins map
BREAKING CHANGE: vcs-host plugins must now be supplied under the `plugins` property rather than as a direct property and must be a full plugin
1 parent 7ce0013 commit a464362

9 files changed

+41
-31
lines changed

src/options-validator.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import {decisionsSchema} from './options-schemas.js';
88

99
export function validate(options) {
1010
return validateOptions(joi.object({
11-
vcsHosts: vcsHostPluginsSchema,
1211
decisions: decisionsSchema,
13-
plugins: joi.object({dependencyUpdaters: dependencyUpdaterPluginsSchema, languages: languagePluginsSchema})
12+
plugins: joi.object({
13+
dependencyUpdaters: dependencyUpdaterPluginsSchema,
14+
languages: languagePluginsSchema,
15+
vcsHosts: vcsHostPluginsSchema
16+
})
1417
}), options) || {};
1518
}

src/options-validator.test.js

+12-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import joi from 'joi';
2-
import {validateOptions} from '@form8ion/core';
2+
import * as core from '@form8ion/core';
33

44
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
55
import any from '@travi/any';
@@ -11,7 +11,11 @@ import vcsHostPluginsSchema from './vcs/host/schema.js';
1111
import dependencyUpdaterPluginsSchema from './dependency-updater/schema.js';
1212
import {validate} from './options-validator.js';
1313

14-
vi.mock('@form8ion/core');
14+
vi.mock('@form8ion/core', async () => ({
15+
validateOptions: vi.fn(),
16+
optionsSchemas: {form8ionPlugin: joi.object()}
17+
}));
18+
vi.mock('./vcs/host/schema.js');
1519

1620
describe('options validator', () => {
1721
beforeEach(() => {
@@ -29,14 +33,17 @@ describe('options validator', () => {
2933
const fullSchema = any.simpleObject();
3034
const validatedOptions = any.simpleObject();
3135
when(joi.object)
32-
.calledWith({dependencyUpdaters: dependencyUpdaterPluginsSchema, languages: languagePluginsSchema})
36+
.calledWith({
37+
dependencyUpdaters: dependencyUpdaterPluginsSchema,
38+
languages: languagePluginsSchema,
39+
vcsHosts: vcsHostPluginsSchema
40+
})
3341
.mockReturnValue(pluginsSchema);
3442
when(joi.object).calledWith({
35-
vcsHosts: vcsHostPluginsSchema,
3643
decisions: decisionsSchema,
3744
plugins: pluginsSchema
3845
}).mockReturnValue(fullSchema);
39-
when(validateOptions).calledWith(fullSchema, options).mockReturnValue(validatedOptions);
46+
when(core.validateOptions).calledWith(fullSchema, options).mockReturnValue(validatedOptions);
4047

4148
expect(validate(options)).toEqual(validatedOptions);
4249
});

src/scaffolder.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import lift from './lift.js';
1919

2020
export async function scaffold(options) {
2121
const projectRoot = process.cwd();
22-
const {vcsHosts = {}, decisions, plugins: {dependencyUpdaters, languages}} = validate(options);
22+
const {decisions, plugins: {dependencyUpdaters, languages, vcsHosts = {}}} = validate(options);
2323

2424
const {
2525
[coreQuestionNames.PROJECT_NAME]: projectName,

src/scaffolder.test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ describe('project scaffolder', () => {
9494
const contributingResults = any.simpleObject();
9595
when(optionsValidator.validate)
9696
.calledWith(options)
97-
.mockReturnValue({vcsHosts, decisions, plugins: {dependencyUpdaters, languages}});
97+
.mockReturnValue({decisions, plugins: {dependencyUpdaters, languages, vcsHosts}});
9898
when(prompts.promptForBaseDetails)
9999
.calledWith(projectPath, decisions)
100100
.mockResolvedValue({
@@ -259,7 +259,7 @@ describe('project scaffolder', () => {
259259
};
260260
when(optionsValidator.validate)
261261
.calledWith(options)
262-
.mockReturnValue({vcsHosts, decisions, plugins: {languages}});
262+
.mockReturnValue({decisions, plugins: {languages, vcsHosts}});
263263
scaffoldGit.mockResolvedValue(vcs);
264264
liftGit.mockResolvedValue({nextSteps: gitNextSteps});
265265
prompts.promptForBaseDetails.mockResolvedValue({

src/vcs/host/scaffolder.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default function (hosts, options) {
55
const {host: chosenHost, ...rest} = options;
66
const host = lowercasedHosts[chosenHost];
77

8-
if (host) return host.scaffolder(rest);
8+
if (host) return host.scaffold(rest);
99

1010
return {};
1111
}

src/vcs/host/scaffolder.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ describe('vcs host scaffolder', () => {
1010
const otherOptions = any.simpleObject();
1111
const results = any.simpleObject();
1212
const chosenHostScaffolder = vi.fn();
13-
const hostScaffolders = {...any.simpleObject(), [chosenHost]: {scaffolder: chosenHostScaffolder}};
13+
const hostScaffolders = {...any.simpleObject(), [chosenHost]: {scaffold: chosenHostScaffolder}};
1414
when(chosenHostScaffolder).calledWith(otherOptions).mockResolvedValue(results);
1515

1616
expect(await scaffoldVcsHost(hostScaffolders, {...otherOptions, host: chosenHost.toLowerCase()})).toEqual(results);

src/vcs/host/schema.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import joi from 'joi';
2+
import {optionsSchemas} from '@form8ion/core';
23

3-
export default joi.object().pattern(/^/, joi.object({
4-
scaffolder: joi.func().arity(1).required(),
4+
export default joi.object().pattern(/^/, optionsSchemas.form8ionPlugin.keys({
55
prompt: joi.func().required(),
66
public: joi.bool(),
77
private: joi.bool()

src/vcs/host/schema.test.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('vcs-host plugins schema', () => {
1313
any.listOf(any.string),
1414
{
1515
factory: () => ({
16-
scaffolder: foo => foo,
16+
scaffold: foo => foo,
1717
prompt: () => undefined,
1818
public: any.boolean(),
1919
private: any.boolean()
@@ -31,40 +31,40 @@ describe('vcs-host plugins schema', () => {
3131

3232
it('should require a `scaffolder` to be included', () => {
3333
expect(() => validateOptions(vcsHostSchema, {[key]: {}}))
34-
.toThrowError(`"${key}.scaffolder" is required`);
34+
.toThrowError(`"${key}.scaffold" is required`);
3535
});
3636

3737
it('should require `scaffolder` to be a function', () => {
38-
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffolder: any.word()}}))
39-
.toThrowError(`"${key}.scaffolder" must be of type function`);
38+
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffold: any.word()}}))
39+
.toThrowError(`"${key}.scaffold" must be of type function`);
4040
});
4141

4242
it('should require the scaffolder to accept a single argument', () => {
43-
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffolder: () => undefined}}))
44-
.toThrowError(`"${key}.scaffolder" must have an arity of 1`);
43+
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffold: () => undefined}}))
44+
.toThrowError(`"${key}.scaffold" must have an arity of 1`);
4545
});
4646

4747
it('should require a `prompt` property', () => {
48-
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffolder: foo => foo}}))
48+
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffold: foo => foo}}))
4949
.toThrowError(`"${key}.prompt" is required`);
5050
});
5151

5252
it('should require the `prompt` to be a function', () => {
53-
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffolder: foo => foo, prompt: any.word()}}))
53+
expect(() => validateOptions(vcsHostSchema, {[key]: {scaffold: foo => foo, prompt: any.word()}}))
5454
.toThrowError(`"${key}.prompt" must be of type function`);
5555
});
5656

5757
it('should require the `public` property to be a boolean', () => {
5858
expect(() => validateOptions(
5959
vcsHostSchema,
60-
{[key]: {scaffolder: foo => foo, prompt: bar => bar, public: any.word()}}
60+
{[key]: {scaffold: foo => foo, prompt: bar => bar, public: any.word()}}
6161
)).toThrowError(`"${key}.public" must be a boolean`);
6262
});
6363

6464
it('should require the `private` property to be a boolean', () => {
6565
expect(() => validateOptions(
6666
vcsHostSchema,
67-
{[key]: {scaffolder: foo => foo, prompt: bar => bar, private: any.word()}}
67+
{[key]: {scaffold: foo => foo, prompt: bar => bar, private: any.word()}}
6868
)).toThrowError(`"${key}.private" must be a boolean`);
6969
});
7070
});

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,13 @@ When(/^the project is scaffolded$/, async function () {
6969
}
7070
}
7171
}
72-
}
73-
},
74-
...vcsHost && {
75-
vcsHosts: {
76-
[vcsHost]: {
77-
scaffolder: ({name, owner}) => ({sshUrl: this.remoteOriginUrl, name, owner}),
78-
prompt: () => undefined
72+
},
73+
...vcsHost && {
74+
vcsHosts: {
75+
[vcsHost]: {
76+
scaffold: ({name, owner}) => ({sshUrl: this.remoteOriginUrl, name, owner}),
77+
prompt: () => undefined
78+
}
7979
}
8080
}
8181
},

0 commit comments

Comments
 (0)