@@ -4,7 +4,7 @@ const inquirer = require('inquirer')
4
4
const EventEmitter = require ( 'events' )
5
5
const Generator = require ( './Generator' )
6
6
const cloneDeep = require ( 'lodash.clonedeep' )
7
- const sortObject = require ( './util/sortObject' )
7
+ // const sortObject = require('./util/sortObject')
8
8
const getVersions = require ( './util/getVersions' )
9
9
const PackageManager = require ( './util/ProjectPackageManager' )
10
10
const { clearConsole } = require ( './util/clearConsole' )
@@ -42,6 +42,7 @@ const {
42
42
exit,
43
43
loadModule
44
44
} = require ( '@vue/cli-shared-utils' )
45
+ // const { isTemplateExpression } = require('typescript')
45
46
46
47
const isManualMode = answers => answers . preset === '__manual__'
47
48
@@ -115,11 +116,11 @@ module.exports = class Creator extends EventEmitter {
115
116
// Currently we rely on the `plugins` object enumeration order,
116
117
// which depends on the order of the field initialization.
117
118
// 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
+ // }
123
124
124
125
// legacy support for vuex
125
126
if ( preset . vuex ) {
@@ -370,9 +371,15 @@ module.exports = class Creator extends EventEmitter {
370
371
// { id: options } => [{ id, apply, options }]
371
372
async resolvePlugins ( rawPlugins , pkg ) {
372
373
// 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
+ */
374
379
const plugins = [ ]
380
+
375
381
for ( const id of Object . keys ( rawPlugins ) ) {
382
+ /** @type {GeneratorApply }} */
376
383
const apply = loadModule ( `${ id } /generator` , this . context ) || ( ( ) => { } )
377
384
let options = rawPlugins [ id ] || { }
378
385
@@ -395,7 +402,35 @@ module.exports = class Creator extends EventEmitter {
395
402
}
396
403
}
397
404
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 }
399
434
}
400
435
return plugins
401
436
}
0 commit comments