diff --git a/packages/@vue/cli/__tests__/mock-preset-with-template/generator/index.js b/packages/@vue/cli/__tests__/mock-preset-with-template/generator/index.js new file mode 100644 index 0000000000..43ae7a2fc3 --- /dev/null +++ b/packages/@vue/cli/__tests__/mock-preset-with-template/generator/index.js @@ -0,0 +1,3 @@ +module.exports = (api, options) => { + api.render('./template', options) +} diff --git a/packages/@vue/cli/__tests__/mock-preset-with-template/generator/template/test.js b/packages/@vue/cli/__tests__/mock-preset-with-template/generator/template/test.js new file mode 100644 index 0000000000..12db7fb421 --- /dev/null +++ b/packages/@vue/cli/__tests__/mock-preset-with-template/generator/template/test.js @@ -0,0 +1 @@ +<%= ok %> diff --git a/packages/@vue/cli/__tests__/mock-preset-with-template/preset.json b/packages/@vue/cli/__tests__/mock-preset-with-template/preset.json new file mode 100644 index 0000000000..63ec289edc --- /dev/null +++ b/packages/@vue/cli/__tests__/mock-preset-with-template/preset.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@vue/cli-plugin-babel": {} + } +} diff --git a/packages/@vue/cli/__tests__/mock-preset-with-template/prompts.js b/packages/@vue/cli/__tests__/mock-preset-with-template/prompts.js new file mode 100644 index 0000000000..26971b45f2 --- /dev/null +++ b/packages/@vue/cli/__tests__/mock-preset-with-template/prompts.js @@ -0,0 +1,5 @@ +module.exports = [{ + type: 'confirm', + name: 'ok', + message: 'Are you ok?' +}] diff --git a/packages/@vue/cli/__tests__/preset.spec.js b/packages/@vue/cli/__tests__/preset.spec.js index 15f0707e0c..7afab7b1f9 100644 --- a/packages/@vue/cli/__tests__/preset.spec.js +++ b/packages/@vue/cli/__tests__/preset.spec.js @@ -30,3 +30,29 @@ test('fetching local preset with prompts and generator', async () => { const pkg = require(path.resolve(cwd, name, 'package.json')) expect(pkg.devDependencies).toHaveProperty('@vue/cli-plugin-babel') }) + +test('should recognize generator/index.js in a local preset directory', async () => { + const cwd = path.resolve(__dirname, '../../../test') + const name = 'test-preset-template' + + expectPrompts([{ + message: 'Are you ok', + confirm: true + }]) + + await create( + name, + { + force: true, + git: false, + cwd, + preset: path.resolve(__dirname, './mock-preset-with-template') + } + ) + + const testFile = await fs.readFile(path.resolve(cwd, name, 'test.js'), 'utf-8') + expect(testFile).toBe('true\n') + + const pkg = require(path.resolve(cwd, name, 'package.json')) + expect(pkg.devDependencies).toHaveProperty('@vue/cli-plugin-babel') +}) diff --git a/packages/@vue/cli/lib/util/loadPresetFromDir.js b/packages/@vue/cli/lib/util/loadPresetFromDir.js index f5d32aaec2..096368b2ce 100644 --- a/packages/@vue/cli/lib/util/loadPresetFromDir.js +++ b/packages/@vue/cli/lib/util/loadPresetFromDir.js @@ -8,10 +8,10 @@ module.exports = async function loadPresetFromDir (dir) { } const preset = await fs.readJson(presetPath) - // if the preset dir contains generator.js, we will inject it as a hidden + // if the preset dir contains generator.js or generator/index.js, we will inject it as a hidden // plugin so it will be invoked by the generator. - const generatorPath = path.join(dir, 'generator.js') - if (fs.existsSync(generatorPath)) { + const hasGenerator = fs.existsSync(path.join(dir, 'generator.js')) || fs.existsSync(path.join(dir, 'generator/index.js')) + if (hasGenerator) { (preset.plugins || (preset.plugins = {}))[dir.replace(/[\/]$/, '')] = { _isPreset: true, prompts: true