chore: warnings for ref transform
This commit is contained in:
parent
8f1101c498
commit
586ec51c49
@ -48,7 +48,7 @@ import {
|
|||||||
genNormalScriptCssVarsCode
|
genNormalScriptCssVarsCode
|
||||||
} from './cssVars'
|
} from './cssVars'
|
||||||
import { compileTemplate, SFCTemplateCompileOptions } from './compileTemplate'
|
import { compileTemplate, SFCTemplateCompileOptions } from './compileTemplate'
|
||||||
import { warnExperimental, warnOnce } from './warn'
|
import { warnOnce } from './warn'
|
||||||
import { rewriteDefault } from './rewriteDefault'
|
import { rewriteDefault } from './rewriteDefault'
|
||||||
import { createCache } from './cache'
|
import { createCache } from './cache'
|
||||||
import {
|
import {
|
||||||
@ -652,10 +652,6 @@ export function compileScript(
|
|||||||
|
|
||||||
// apply ref transform
|
// apply ref transform
|
||||||
if (enableRefTransform && shouldTransformRef(script.content)) {
|
if (enableRefTransform && shouldTransformRef(script.content)) {
|
||||||
warnExperimental(
|
|
||||||
`ref sugar`,
|
|
||||||
`https://github.com/vuejs/rfcs/discussions/369`
|
|
||||||
)
|
|
||||||
const { rootVars, importedHelpers } = transformRefAST(
|
const { rootVars, importedHelpers } = transformRefAST(
|
||||||
scriptAst,
|
scriptAst,
|
||||||
s,
|
s,
|
||||||
@ -900,10 +896,6 @@ export function compileScript(
|
|||||||
|
|
||||||
// 3. Apply ref sugar transform
|
// 3. Apply ref sugar transform
|
||||||
if (enableRefTransform && shouldTransformRef(scriptSetup.content)) {
|
if (enableRefTransform && shouldTransformRef(scriptSetup.content)) {
|
||||||
warnExperimental(
|
|
||||||
`ref sugar`,
|
|
||||||
`https://github.com/vuejs/rfcs/discussions/369`
|
|
||||||
)
|
|
||||||
const { rootVars, importedHelpers } = transformRefAST(
|
const { rootVars, importedHelpers } = transformRefAST(
|
||||||
scriptSetupAst,
|
scriptSetupAst,
|
||||||
s,
|
s,
|
||||||
|
@ -14,18 +14,3 @@ export function warn(msg: string) {
|
|||||||
`\x1b[1m\x1b[33m[@vue/compiler-sfc]\x1b[0m\x1b[33m ${msg}\x1b[0m\n`
|
`\x1b[1m\x1b[33m[@vue/compiler-sfc]\x1b[0m\x1b[33m ${msg}\x1b[0m\n`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function warnExperimental(feature: string, url: string) {
|
|
||||||
// eslint-disable-next-line
|
|
||||||
if (typeof window !== 'undefined') {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
warnOnce(
|
|
||||||
`${feature} is still an experimental proposal.\n` +
|
|
||||||
`Follow its status at ${url}.`
|
|
||||||
)
|
|
||||||
warnOnce(
|
|
||||||
`When using experimental features,\n` +
|
|
||||||
`it is recommended to pin your vue dependencies to exact versions to avoid breakage.`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
@ -104,6 +104,9 @@ export function transformAST(
|
|||||||
rootVars: string[]
|
rootVars: string[]
|
||||||
importedHelpers: string[]
|
importedHelpers: string[]
|
||||||
} {
|
} {
|
||||||
|
// TODO remove when out of experimental
|
||||||
|
warnExperimental()
|
||||||
|
|
||||||
const importedHelpers = new Set<string>()
|
const importedHelpers = new Set<string>()
|
||||||
const rootScope: Scope = {}
|
const rootScope: Scope = {}
|
||||||
const scopeStack: Scope[] = [rootScope]
|
const scopeStack: Scope[] = [rootScope]
|
||||||
@ -148,7 +151,12 @@ export function transformAST(
|
|||||||
if (stmt.declare) continue
|
if (stmt.declare) continue
|
||||||
for (const decl of stmt.declarations) {
|
for (const decl of stmt.declarations) {
|
||||||
let toVarCall
|
let toVarCall
|
||||||
if (decl.init && (toVarCall = isToVarCall(decl.init))) {
|
if (
|
||||||
|
decl.init &&
|
||||||
|
decl.init.type === 'CallExpression' &&
|
||||||
|
decl.init.callee.type === 'Identifier' &&
|
||||||
|
(toVarCall = isToVarCall(decl.init.callee.name))
|
||||||
|
) {
|
||||||
processRefDeclaration(
|
processRefDeclaration(
|
||||||
toVarCall,
|
toVarCall,
|
||||||
decl.init as CallExpression,
|
decl.init as CallExpression,
|
||||||
@ -369,18 +377,38 @@ export function transformAST(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const toVarCall = isToVarCall(node)
|
if (node.type === 'CallExpression' && node.callee.type === 'Identifier') {
|
||||||
if (toVarCall && (!parent || parent.type !== 'VariableDeclarator')) {
|
const callee = node.callee.name
|
||||||
return error(
|
|
||||||
`${toVarCall} can only be used as the initializer of ` +
|
|
||||||
`a variable declaration.`,
|
|
||||||
node
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isToRefCall(node)) {
|
const toVarCall = isToVarCall(callee)
|
||||||
s.remove(node.callee.start! + offset, node.callee.end! + offset)
|
if (toVarCall && (!parent || parent.type !== 'VariableDeclarator')) {
|
||||||
return this.skip()
|
return error(
|
||||||
|
`${toVarCall} can only be used as the initializer of ` +
|
||||||
|
`a variable declaration.`,
|
||||||
|
node
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callee === TO_REF_SYMBOL) {
|
||||||
|
s.remove(node.callee.start! + offset, node.callee.end! + offset)
|
||||||
|
return this.skip()
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO remove when out of experimental
|
||||||
|
if (callee === '$raw') {
|
||||||
|
error(
|
||||||
|
`$raw() has been replaced by $$(). ` +
|
||||||
|
`See ${RFC_LINK} for latest updates.`,
|
||||||
|
node
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (callee === '$fromRef') {
|
||||||
|
error(
|
||||||
|
`$fromRef() has been replaced by $(). ` +
|
||||||
|
`See ${RFC_LINK} for latest updates.`,
|
||||||
|
node
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
leave(node: Node, parent?: Node) {
|
leave(node: Node, parent?: Node) {
|
||||||
@ -401,11 +429,7 @@ export function transformAST(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isToVarCall(node: Node): string | false {
|
function isToVarCall(callee: string): string | false {
|
||||||
if (node.type !== 'CallExpression' || node.callee.type !== 'Identifier') {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
const callee = node.callee.name
|
|
||||||
if (callee === TO_VAR_SYMBOL) {
|
if (callee === TO_VAR_SYMBOL) {
|
||||||
return TO_VAR_SYMBOL
|
return TO_VAR_SYMBOL
|
||||||
}
|
}
|
||||||
@ -415,9 +439,33 @@ function isToVarCall(node: Node): string | false {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
function isToRefCall(node: Node): node is CallExpression {
|
const RFC_LINK = `https://github.com/vuejs/rfcs/discussions/369`
|
||||||
return (
|
const hasWarned: Record<string, boolean> = {}
|
||||||
node.type === 'CallExpression' &&
|
|
||||||
(node.callee as Identifier).name === TO_REF_SYMBOL
|
function warnExperimental() {
|
||||||
|
// eslint-disable-next-line
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
warnOnce(
|
||||||
|
`@vue/ref-transform is an experimental feature.\n` +
|
||||||
|
`Experimental features may change behavior between patch versions.\n` +
|
||||||
|
`It is recommended to pin your vue dependencies to exact versions to avoid breakage.\n` +
|
||||||
|
`You can follow the proposal's status at ${RFC_LINK}.`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function warnOnce(msg: string) {
|
||||||
|
const isNodeProd =
|
||||||
|
typeof process !== 'undefined' && process.env.NODE_ENV === 'production'
|
||||||
|
if (!isNodeProd && !__TEST__ && !hasWarned[msg]) {
|
||||||
|
hasWarned[msg] = true
|
||||||
|
warn(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function warn(msg: string) {
|
||||||
|
console.warn(
|
||||||
|
`\x1b[1m\x1b[33m[@vue/compiler-sfc]\x1b[0m\x1b[33m ${msg}\x1b[0m\n`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user