Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions packages/@vue/cli/lib/GeneratorAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const mergeDeps = require('./util/mergeDeps')
const runCodemod = require('./util/runCodemod')
const stringifyJS = require('./util/stringifyJS')
const ConfigTransform = require('./ConfigTransform')
const { semver, getPluginLink, toShortPluginId, loadModule } = require('@vue/cli-shared-utils')
const { semver, error, getPluginLink, toShortPluginId, loadModule } = require('@vue/cli-shared-utils')

const isString = val => typeof val === 'string'
const isFunction = val => typeof val === 'function'
Expand Down Expand Up @@ -81,6 +81,20 @@ class GeneratorAPI {
this.generator.fileMiddlewares.push(middleware)
}

/**
* Normalize absolute path, Windows-style path
* to the relative path used as index in this.files
* @param {string} p the path to normalize
*/
_normalizePath (p) {
if (path.isAbsolute(p)) {
p = path.relative(this.generator.context, p)
}
// The `files` tree always use `/` in its index.
// So we need to normalize the path string in case the user passes a Windows path.
return p.replace(/\\/g, '/')
}

/**
* Resolve path for a project.
*
Expand Down Expand Up @@ -373,10 +387,20 @@ class GeneratorAPI {
* @param {object} options additional options for the codemod
*/
transformScript (file, codemod, options) {
const normalizedPath = this._normalizePath(file)

this._injectFileMiddleware(files => {
files[file] = runCodemod(
if (typeof files[normalizedPath] === 'undefined') {
error(`Cannot find file ${normalizedPath}`)
return
}

files[normalizedPath] = runCodemod(
codemod,
{ path: this.resolve(file), source: files[file] },
{
path: this.resolve(normalizedPath),
source: files[normalizedPath]
},
options
)
})
Expand Down