Skip to content

Commit e583be3

Browse files
committed
feat: add variable$
1 parent bc06644 commit e583be3

File tree

6 files changed

+54
-89
lines changed

6 files changed

+54
-89
lines changed

README.md

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ module.exports = {
8383

8484
```ts
8585
// ~/store/user.ts
86-
export const useUserStore = $$defineStore('user', () => {
86+
export const useUserStore = defineStore$('user', () => {
8787
let token = $ref('')
8888
function login() {
8989
token = 'TOKEN'
@@ -119,24 +119,20 @@ 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)
132-
})
130+
provide$('base64', base64)
133131
// is equivalent to:
134-
watch($$(base64), () => {
135-
console.log(base64)
136-
})
132+
provide('base64', $$(base64))
137133
138-
const stop = $$watch(base64, () => {
139-
console.log($base64)
134+
const stop = watch$(base64, () => {
135+
console.log$(base64)
140136
stop()
141137
})
142138
// is equivalent to:
@@ -145,7 +141,7 @@ const stop = watch($$(base64), () => {
145141
stop()
146142
})
147143
148-
$$defineExpose({
144+
defineExpose$({
149145
base64,
150146
})
151147
// is equivalent to:

playground/src/App.vue

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
<script setup lang="ts">
2-
import { inject, toRefs, watch } from 'vue'
2+
import { inject, provide, 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)
11+
provide$('base64', base64)
1112
12-
watch($base64, () => {
13-
console.log(base64)
14-
})
15-
16-
const stop = $$watch(base64, () => {
17-
console.log($base64)
13+
const stop = watch$(base64, () => {
14+
console.log$(base64)
1815
stop()
1916
})
2017
21-
$$defineExpose({
18+
defineExpose$({
2219
base64,
2320
})
2421
</script>

playground/store/user.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { defineStore } from 'pinia'
22

3-
export const useUserStore = $$defineStore('user', () => {
3+
export const useUserStore = defineStore$('user', () => {
44
let token = $ref('')
55
function login() {
66
token = 'TOKEN'

src/index.ts

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -96,32 +96,24 @@ function transformReactivityFunction(code: string, id: string) {
9696

9797
for (const { ast, offset } of asts) {
9898
walkAST<t.Node>(ast, {
99-
enter(node, parent) {
99+
enter(node) {
100+
if (node.type !== 'CallExpression') return
101+
100102
if (
101-
node.type === 'Identifier' &&
102103
/^\$(?!(\$|ref|computed|shallowRef|toRef|customRef|defineProp|defineProps|defineModels)?(\(|$))/.test(
103-
s.sliceNode(node, { offset })
104+
s.sliceNode(node.callee, { offset })
104105
)
105106
) {
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)
107+
s.appendRight(node.callee.start! + offset + 1, '(')
108+
s.appendRight(node.end! + offset, ')')
109+
}
110+
111+
if (s.sliceNode(node.callee, { offset }).endsWith('$')) {
112+
s.remove(node.callee.end! + offset - 1, node.callee.end! + offset)
109113

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 (
118-
node.type === 'Identifier' &&
119-
parent?.type !== 'MemberExpression' &&
120-
parent?.type !== 'VariableDeclarator'
121-
) {
122-
s.appendRight(node.start! + offset + 1, '$(')
123-
s.appendRight(node.end! + offset, ')')
124-
}
114+
node.arguments.forEach((argument) => {
115+
transformArguments(argument, s, offset)
116+
})
125117
}
126118
},
127119
})

src/volar.ts

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -95,52 +95,32 @@ function transform({
9595
node: import('typescript/lib/tsserverlibrary').Node,
9696
parent: import('typescript/lib/tsserverlibrary').Node
9797
) {
98-
if (
99-
ts.isIdentifier(node) &&
100-
/^\$(?!(\$|ref|computed|shallowRef|toRef|customRef|defineProp|defineProps|defineModels)?(\(|$))/.test(
101-
node.getText(ast)
102-
)
103-
) {
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 (
132-
ts.isIdentifier(node) &&
133-
!ts.isPropertyAccessExpression(parent) &&
134-
!ts.isVariableDeclaration(parent)
98+
if (ts.isCallExpression(node)) {
99+
if (
100+
/^\$(?!(\$|ref|computed|shallowRef|toRef|customRef|defineProp|defineProps|defineModels)?(\(|$))/.test(
101+
node.expression.getText(ast)
102+
)
135103
) {
136104
replaceSourceRange(
137105
codes,
138106
source,
139-
node.getStart(ast, false) + 1,
140-
node.getStart(ast, false) + 1,
141-
'$('
107+
node.expression.getStart(ast, false) + 1,
108+
node.expression.getStart(ast, false) + 1,
109+
'('
142110
)
143-
replaceSourceRange(codes, source, node.end, node.end, ')')
111+
replaceSourceRange(codes, source, node.getEnd(), node.getEnd(), ')')
112+
}
113+
114+
if (node.expression.getText(ast).endsWith('$')) {
115+
replaceSourceRange(
116+
codes,
117+
source,
118+
node.expression.getEnd() - 1,
119+
node.expression.getEnd()
120+
)
121+
node.arguments.forEach((argument) => {
122+
transformArguments(argument)
123+
})
144124
}
145125
}
146126

tests/fixtures/basic.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="tsx">
2-
import {ref, watch} from 'vue'
2+
import { ref, watch } from 'vue'
33
44
function useApi(defaultName = ref('')){
55
const id = ref(1)
@@ -12,13 +12,13 @@ function useApi(defaultName = ref('')){
1212
1313
const { id, name } = $useApi()
1414
id === 1
15-
useApi($name)
15+
useApi$(name)
1616
17-
watch($name,()=>{
17+
watch$(name,()=>{
1818
1919
})
2020
21-
$$defineExpose({
21+
defineExpose$({
2222
name,
2323
})
2424
</script>

0 commit comments

Comments
 (0)