Skip to content

Commit d504185

Browse files
committed
feat(wip): implement generator execution order
1 parent ae967f7 commit d504185

File tree

3 files changed

+47
-8
lines changed

3 files changed

+47
-8
lines changed

Diff for: packages/@vue/cli-plugin-typescript/generator/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,5 @@ module.exports = (
7171

7272
require('./convert')(api, { convertJsToTs })
7373
}
74+
75+
module.exports.before = '@vue/cli-plugin-router'

Diff for: packages/@vue/cli-service/generator/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,5 @@ module.exports = (api, options) => {
7575
api.extendPackage(options.configs)
7676
}
7777
}
78+
79+
module.exports.stage = 0

Diff for: packages/@vue/cli/lib/Creator.js

+43-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const inquirer = require('inquirer')
44
const EventEmitter = require('events')
55
const Generator = require('./Generator')
66
const cloneDeep = require('lodash.clonedeep')
7-
const sortObject = require('./util/sortObject')
7+
// const sortObject = require('./util/sortObject')
88
const getVersions = require('./util/getVersions')
99
const PackageManager = require('./util/ProjectPackageManager')
1010
const { clearConsole } = require('./util/clearConsole')
@@ -42,6 +42,7 @@ const {
4242
exit,
4343
loadModule
4444
} = require('@vue/cli-shared-utils')
45+
// const { isTemplateExpression } = require('typescript')
4546

4647
const isManualMode = answers => answers.preset === '__manual__'
4748

@@ -115,11 +116,11 @@ module.exports = class Creator extends EventEmitter {
115116
// Currently we rely on the `plugins` object enumeration order,
116117
// which depends on the order of the field initialization.
117118
// FIXME: Remove this ugly hack after the plugin ordering API settled down
118-
if (preset.plugins['@vue/cli-plugin-router'] && preset.plugins['@vue/cli-plugin-typescript']) {
119-
const tmp = preset.plugins['@vue/cli-plugin-typescript']
120-
delete preset.plugins['@vue/cli-plugin-typescript']
121-
preset.plugins['@vue/cli-plugin-typescript'] = tmp
122-
}
119+
// if (preset.plugins['@vue/cli-plugin-router'] && preset.plugins['@vue/cli-plugin-typescript']) {
120+
// const tmp = preset.plugins['@vue/cli-plugin-typescript']
121+
// delete preset.plugins['@vue/cli-plugin-typescript']
122+
// preset.plugins['@vue/cli-plugin-typescript'] = tmp
123+
// }
123124

124125
// legacy support for vuex
125126
if (preset.vuex) {
@@ -370,9 +371,15 @@ module.exports = class Creator extends EventEmitter {
370371
// { id: options } => [{ id, apply, options }]
371372
async resolvePlugins (rawPlugins, pkg) {
372373
// ensure cli-service is invoked first
373-
rawPlugins = sortObject(rawPlugins, ['@vue/cli-service'], true)
374+
// rawPlugins = sortObject(rawPlugins, ['@vue/cli-service'], true)
375+
/**
376+
* @typedef {{before?: string|Array<string>, _before: Set<string> stage?: number)}} GeneratorApply
377+
* @type {Array<{id: string, apply: GeneratorApply, options: any}>}
378+
*/
374379
const plugins = []
380+
375381
for (const id of Object.keys(rawPlugins)) {
382+
/** @type {GeneratorApply}} */
376383
const apply = loadModule(`${id}/generator`, this.context) || (() => {})
377384
let options = rawPlugins[id] || {}
378385

@@ -395,7 +402,35 @@ module.exports = class Creator extends EventEmitter {
395402
}
396403
}
397404

398-
plugins.push({ id, apply, options })
405+
// TODO: define function in @vue/cli-shared-utils
406+
if (typeof apply.before === 'string') {
407+
apply._before = new Set([apply.before])
408+
} else if (Array.isArray(apply.before)) {
409+
apply._before = new Set(apply.before)
410+
} else {
411+
apply._before = new Set()
412+
}
413+
414+
let stage = 100
415+
if (typeof apply.stage === 'number') {
416+
stage = apply.stage
417+
}
418+
let i = plugins.length
419+
while (i > 0) {
420+
i--
421+
const x = plugins[i]
422+
plugins[i + 1] = x
423+
const xStage = x.apply.stage || 0
424+
if (xStage > stage) {
425+
continue
426+
}
427+
if (xStage === stage && !x.apply._before.has(id)) {
428+
continue
429+
}
430+
i++
431+
break
432+
}
433+
plugins[i] = { id, apply, options }
399434
}
400435
return plugins
401436
}

0 commit comments

Comments
 (0)