Skip to content

Commit

Permalink
chore: warnings for ref transform
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Aug 24, 2021
1 parent 8f1101c commit 586ec51
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 45 deletions.
10 changes: 1 addition & 9 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -48,7 +48,7 @@ import {
genNormalScriptCssVarsCode
} from './cssVars'
import { compileTemplate, SFCTemplateCompileOptions } from './compileTemplate'
import { warnExperimental, warnOnce } from './warn'
import { warnOnce } from './warn'
import { rewriteDefault } from './rewriteDefault'
import { createCache } from './cache'
import {
Expand Down Expand Up @@ -652,10 +652,6 @@ export function compileScript(

// apply ref transform
if (enableRefTransform && shouldTransformRef(script.content)) {
warnExperimental(
`ref sugar`,
`https://github.com/vuejs/rfcs/discussions/369`
)
const { rootVars, importedHelpers } = transformRefAST(
scriptAst,
s,
Expand Down Expand Up @@ -900,10 +896,6 @@ export function compileScript(

// 3. Apply ref sugar transform
if (enableRefTransform && shouldTransformRef(scriptSetup.content)) {
warnExperimental(
`ref sugar`,
`https://github.com/vuejs/rfcs/discussions/369`
)
const { rootVars, importedHelpers } = transformRefAST(
scriptSetupAst,
s,
Expand Down
15 changes: 0 additions & 15 deletions packages/compiler-sfc/src/warn.ts
Expand Up @@ -14,18 +14,3 @@ export function warn(msg: string) {
`\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.`
)
}
90 changes: 69 additions & 21 deletions packages/ref-transform/src/refTransform.ts
Expand Up @@ -104,6 +104,9 @@ export function transformAST(
rootVars: string[]
importedHelpers: string[]
} {
// TODO remove when out of experimental
warnExperimental()

const importedHelpers = new Set<string>()
const rootScope: Scope = {}
const scopeStack: Scope[] = [rootScope]
Expand Down Expand Up @@ -148,7 +151,12 @@ export function transformAST(
if (stmt.declare) continue
for (const decl of stmt.declarations) {
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(
toVarCall,
decl.init as CallExpression,
Expand Down Expand Up @@ -369,18 +377,38 @@ export function transformAST(
}
}

const toVarCall = isToVarCall(node)
if (toVarCall && (!parent || parent.type !== 'VariableDeclarator')) {
return error(
`${toVarCall} can only be used as the initializer of ` +
`a variable declaration.`,
node
)
}
if (node.type === 'CallExpression' && node.callee.type === 'Identifier') {
const callee = node.callee.name

if (isToRefCall(node)) {
s.remove(node.callee.start! + offset, node.callee.end! + offset)
return this.skip()
const toVarCall = isToVarCall(callee)
if (toVarCall && (!parent || parent.type !== 'VariableDeclarator')) {
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) {
Expand All @@ -401,11 +429,7 @@ export function transformAST(
}
}

function isToVarCall(node: Node): string | false {
if (node.type !== 'CallExpression' || node.callee.type !== 'Identifier') {
return false
}
const callee = node.callee.name
function isToVarCall(callee: string): string | false {
if (callee === TO_VAR_SYMBOL) {
return TO_VAR_SYMBOL
}
Expand All @@ -415,9 +439,33 @@ function isToVarCall(node: Node): string | false {
return false
}

function isToRefCall(node: Node): node is CallExpression {
return (
node.type === 'CallExpression' &&
(node.callee as Identifier).name === TO_REF_SYMBOL
const RFC_LINK = `https://github.com/vuejs/rfcs/discussions/369`
const hasWarned: Record<string, boolean> = {}

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`
)
}

0 comments on commit 586ec51

Please sign in to comment.