Skip to content

Commit 9c81339

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

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

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

Lines changed: 2 additions & 0 deletions
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'

packages/@vue/cli-service/generator/index.js

Lines changed: 2 additions & 0 deletions
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

packages/@vue/cli/lib/Creator.js

Lines changed: 42 additions & 8 deletions
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')
@@ -115,11 +115,11 @@ module.exports = class Creator extends EventEmitter {
115115
// Currently we rely on the `plugins` object enumeration order,
116116
// which depends on the order of the field initialization.
117117
// 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-
}
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+
// }
123123

124124
// legacy support for vuex
125125
if (preset.vuex) {
@@ -370,9 +370,15 @@ module.exports = class Creator extends EventEmitter {
370370
// { id: options } => [{ id, apply, options }]
371371
async resolvePlugins (rawPlugins, pkg) {
372372
// ensure cli-service is invoked first
373-
rawPlugins = sortObject(rawPlugins, ['@vue/cli-service'], true)
373+
// rawPlugins = sortObject(rawPlugins, ['@vue/cli-service'], true)
374+
/**
375+
* @typedef {{before?: string|Array<string>, _before: Set<string> stage?: number)}} GeneratorApply
376+
* @type {Array<{id: string, apply: GeneratorApply, options: any}>}
377+
*/
374378
const plugins = []
379+
375380
for (const id of Object.keys(rawPlugins)) {
381+
/** @type {GeneratorApply}} */
376382
const apply = loadModule(`${id}/generator`, this.context) || (() => {})
377383
let options = rawPlugins[id] || {}
378384

@@ -395,7 +401,35 @@ module.exports = class Creator extends EventEmitter {
395401
}
396402
}
397403

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

0 commit comments

Comments
 (0)