Skip to content

Commit d6c9260

Browse files
committed
feat: support $variable
1 parent 3271ddc commit d6c9260

File tree

4 files changed

+69
-69
lines changed

4 files changed

+69
-69
lines changed

README.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,32 +119,33 @@ const { token, login } = $toRefs(useUserStore())
119119
const { token, login } = $(toRefs(useUserStore()))
120120
login()
121121
122-
const text = $inject('text', token)
122+
const text = $inject('text', $token)
123123
// is equivalent to:
124124
const text = $(inject('text', $$(defaultText)))
125125
126-
const { base64 } = $useBase64(text)
126+
const { base64 } = $useBase64($text)
127127
// is equivalent to:
128128
const { base64 } = $(useBase64($$(text)))
129129
130-
$watch(base64, () => {
131-
$console.log(base64)
130+
watch($base64, () => {
131+
console.log(base64)
132132
})
133133
// is equivalent to:
134134
watch($$(base64), () => {
135-
console.log($$(base64))
135+
console.log(base64)
136136
})
137137
138138
const stop = $$watch(base64, () => {
139-
$console.log(base64)
139+
console.log($base64)
140+
stop()
140141
})
141142
// is equivalent to:
142143
const stop = watch($$(base64), () => {
143144
console.log($$(base64))
145+
stop()
144146
})
145-
stop()
146147
147-
$defineExpose({
148+
$$defineExpose({
148149
base64,
149150
})
150151
// is equivalent to:

playground/src/App.vue

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
<script setup lang="ts">
2-
import { type Ref, inject, ref, toRefs, watch } from 'vue'
2+
import { computed, inject, toRefs, watch } from 'vue'
33
import { useBase64 } from '@vueuse/core'
44
import { useUserStore } from '../store/user'
55
66
const { token, login } = $toRefs(useUserStore())
77
login()
88
9-
const text = $inject('text', token)
10-
const { base64 } = $useBase64(text)
9+
const text = $inject('text', $token)
10+
const { base64 } = $useBase64($text)
1111
12-
$watch(base64, () => {
13-
$console.log(base64)
12+
const a = $computed(() => 1)
13+
const b = $(computed(() => 1))
14+
15+
watch($base64, () => {
16+
console.log(base64)
1417
})
1518
1619
const stop = $$watch(base64, () => {
17-
$console.log(base64)
20+
console.log($base64)
21+
stop()
1822
})
19-
stop()
2023
21-
$defineExpose({
24+
$$defineExpose({
2225
base64,
2326
})
2427
</script>

src/index.ts

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createUnplugin } from 'unplugin'
22
import {
3+
MagicString,
34
REGEX_SETUP_SFC,
45
REGEX_SRC_FILE,
56
babelParse,
@@ -9,7 +10,6 @@ import {
910
parseSFC,
1011
walkAST,
1112
} from '@vue-macros/common'
12-
import { MagicString } from 'vue/compiler-sfc'
1313
import { type Options, resolveOption } from './core/options'
1414
import type * as t from '@babel/types'
1515

@@ -97,39 +97,27 @@ function transformReactivityFunction(code: string, id: string) {
9797
for (const { ast, offset } of asts) {
9898
walkAST<t.Node>(ast, {
9999
enter(node, parent) {
100-
let name
101100
if (
102-
node.type === 'CallExpression' &&
103-
[
104-
'Identifier',
105-
'MemberExpression',
106-
'OptionalMemberExpression',
107-
].includes(node.callee.type) &&
101+
node.type === 'Identifier' &&
108102
/^\$(?!(\$|ref|computed|shallowRef|toRef|customRef|defineProp|defineProps|defineModels)?(\(|$))/.test(
109-
(name = code.slice(
110-
node.callee.start! + offset,
111-
node.callee.end! + offset
112-
))
103+
s.sliceNode(node, { offset })
113104
)
114105
) {
115-
if (name.startsWith('$$')) {
116-
s.remove(
117-
node.callee.start! + offset,
118-
node.callee.start! + offset + 2
119-
)
120-
} else if (parent?.type === 'VariableDeclarator') {
121-
s.appendRight(node.callee.start! + offset + 1, '(')
106+
if (parent?.type === 'CallExpression' && parent.callee === node) {
107+
if (s.sliceNode(node, { offset }).startsWith('$$')) {
108+
s.remove(node.start! + offset, node.start! + offset + 2)
109+
110+
parent.arguments.forEach((argument) => {
111+
transformArguments(argument, s, offset)
112+
})
113+
} else {
114+
s.appendRight(node.start! + offset + 1, '(')
115+
s.appendRight(parent.end! + offset, ')')
116+
}
117+
} else if (node.type === 'Identifier') {
118+
s.appendRight(node.start! + offset + 1, '$(')
122119
s.appendRight(node.end! + offset, ')')
123-
} else {
124-
s.remove(
125-
node.callee.start! + offset,
126-
node.callee.start! + offset + 1
127-
)
128120
}
129-
130-
node.arguments.forEach((argument) => {
131-
transformArguments(argument, s, offset)
132-
})
133121
}
134122
},
135123
})

src/volar.ts

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -96,46 +96,54 @@ function transform({
9696
parent: import('typescript/lib/tsserverlibrary').Node
9797
) {
9898
if (
99-
ts.isCallExpression(node) &&
99+
ts.isIdentifier(node) &&
100100
/^\$(?!(\$|ref|computed|shallowRef|toRef|customRef|defineProp|defineProps|defineModels)?(\(|$))/.test(
101-
node.expression.getText(ast)
101+
node.getText(ast)
102102
)
103103
) {
104-
if (node.expression.getText(ast).startsWith('$$')) {
105-
replaceSourceRange(
106-
codes,
107-
source,
108-
node.expression.getStart(ast, false),
109-
node.expression.getStart(ast, false) + 2
110-
)
111-
} else if (ts.isVariableDeclaration(parent)) {
104+
if (ts.isCallExpression(parent) && parent.expression === node) {
105+
if (node.getText(ast).startsWith('$$')) {
106+
replaceSourceRange(
107+
codes,
108+
source,
109+
node.getStart(ast, false),
110+
node.getStart(ast, false) + 2
111+
)
112+
parent.arguments.forEach((argument) => {
113+
transformArguments(argument)
114+
})
115+
} else {
116+
replaceSourceRange(
117+
codes,
118+
source,
119+
node.getStart(ast, false) + 1,
120+
node.getStart(ast, false) + 1,
121+
'('
122+
)
123+
replaceSourceRange(
124+
codes,
125+
source,
126+
parent.getEnd(),
127+
parent.getEnd(),
128+
')'
129+
)
130+
}
131+
} else if (ts.isIdentifier(node)) {
112132
replaceSourceRange(
113133
codes,
114134
source,
115-
node.expression.getStart(ast, false) + 1,
116-
node.expression.getStart(ast, false) + 1,
117-
'('
135+
node.getStart(ast, false) + 1,
136+
node.getStart(ast, false) + 1,
137+
'$('
118138
)
119139
replaceSourceRange(codes, source, node.end, node.end, ')')
120-
} else {
121-
replaceSourceRange(
122-
codes,
123-
source,
124-
node.expression.getStart(ast, false),
125-
node.expression.getStart(ast, false) + 1
126-
)
127140
}
128-
129-
node.arguments.forEach((argument) => {
130-
transformArguments(argument)
131-
})
132141
}
133142

134143
node.forEachChild((child) => {
135144
walkReactivityFunction(child, node)
136145
})
137146
}
138-
139147
ast.forEachChild((child) => walkReactivityFunction(child, ast))
140148
}
141149

0 commit comments

Comments
 (0)