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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user