onIdent: (id: Identifier) => void
) {
for (const p of node.params) {
- ;(walk as any)(p, {
- enter(child: Node, parent: Node) {
- if (
- child.type === 'Identifier' &&
- // do not record as scope variable if is a destructured key
- !isStaticPropertyKey(child, parent) &&
- // do not record if this is a default value
- // assignment of a destructured variable
- !(
- parent &&
- parent.type === 'AssignmentPattern' &&
- parent.right === child
- )
- ) {
- onIdent(child)
- }
- }
- })
+ for (const id of extractIdentifiers(p)) {
+ onIdent(id)
+ }
}
}
import { warnExperimental, warnOnce } from './warn'
import { rewriteDefault } from './rewriteDefault'
import { createCache } from './cache'
-import { transformAST as transformWithRefSugar } from '@vue/ref-transform'
+import {
+ shouldTransform,
+ transformAST as transformWithRefSugar
+} from '@vue/ref-transform'
// Special compiler macros
const DEFINE_PROPS = 'defineProps'
}
// 3. Apply ref sugar transform
- if (enableRefSugar) {
+ if (enableRefSugar && shouldTransform(source)) {
warnExperimental(
`ref sugar`,
`https://github.com/vuejs/rfcs/discussions/369`
This package is the lower-level transform that can be used standalone. Higher-level tooling (e.g. `@vitejs/plugin-vue` and `vue-loader`) will provide integration via options.
+### `shouldTransform`
+
+Can be used to do a cheap check to determine whether full transform should be performed.
+
+```js
+import { shouldTransform } from '@vue/ref-transform'
+
+shouldTransform(`let a = ref(0)`) // false
+shouldTransform(`let a = $ref(0)`) // true
+```
+
### `transform`
```js
### `transformAST`
+Transform with an existing Babel AST + MagicString instance. This is used internally by `@vue/compiler-sfc` to avoid double parse/transform cost.
+
```js
import { transformAST } from '@vue/ref-transform'
import { parse } from '@babel/parser'
const TO_VAR_SYMBOL = '$'
const TO_REF_SYMBOL = '$$'
const shorthands = ['ref', 'computed', 'shallowRef']
+const transformCheckRE = /[^\w]\$(?:\$|ref|computed|shallowRef)?\(/
+
+export function shouldTransform(src: string): boolean {
+ return transformCheckRE.test(src)
+}
export interface ReactiveDeclarator {
node: VariableDeclarator