From 586ec51c49692c26abe167ff6213f91151dbdb03 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 24 Aug 2021 10:26:38 -0400 Subject: [PATCH] chore: warnings for ref transform --- packages/compiler-sfc/src/compileScript.ts | 10 +-- packages/compiler-sfc/src/warn.ts | 15 ---- packages/ref-transform/src/refTransform.ts | 90 +++++++++++++++++----- 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 92af5bd7b8..4ff9baee56 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -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 { @@ -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, @@ -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, diff --git a/packages/compiler-sfc/src/warn.ts b/packages/compiler-sfc/src/warn.ts index 6efa419cda..13cfa4da72 100644 --- a/packages/compiler-sfc/src/warn.ts +++ b/packages/compiler-sfc/src/warn.ts @@ -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.` - ) -} diff --git a/packages/ref-transform/src/refTransform.ts b/packages/ref-transform/src/refTransform.ts index aeaafd7111..2421699bc7 100644 --- a/packages/ref-transform/src/refTransform.ts +++ b/packages/ref-transform/src/refTransform.ts @@ -104,6 +104,9 @@ export function transformAST( rootVars: string[] importedHelpers: string[] } { + // TODO remove when out of experimental + warnExperimental() + const importedHelpers = new Set() const rootScope: Scope = {} const scopeStack: Scope[] = [rootScope] @@ -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, @@ -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) { @@ -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 } @@ -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 = {} + +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` ) } -- 2.47.3