Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: normalize the file argument of transformScript, fix Windows compatibility #5424

Merged
merged 1 commit into from May 8, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 27 additions & 3 deletions packages/@vue/cli/lib/GeneratorAPI.js
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