if (
parent &&
parent.type.startsWith('TS') &&
- parent.type !== 'TSAsExpression' &&
- parent.type !== 'TSNonNullExpression' &&
- parent.type !== 'TSTypeAssertion'
+ !TS_NODE_TYPES.includes(parent.type)
) {
return this.skip()
}
return true
}
+
+export const TS_NODE_TYPES = [
+ 'TSAsExpression', // foo as number
+ 'TSTypeAssertion', // (<number>foo)
+ 'TSNonNullExpression', // foo!
+ 'TSInstantiationExpression', // foo<string>
+ 'TSSatisfiesExpression' // foo satisfies T
+]
+export function unwrapTSNode(node: Node): Node {
+ if (TS_NODE_TYPES.includes(node.type)) {
+ return unwrapTSNode((node as any).expression)
+ } else {
+ return node
+ }
+}
})
})
+ test('defineProps w/ TS assertion', () => {
+ const { content, bindings } = compile(`
+ <script setup lang="ts">
+ defineProps(['foo'])! as any
+ </script>
+ `)
+ expect(content).toMatch(`props: ['foo']`)
+ assertCode(content)
+ expect(bindings).toStrictEqual({
+ foo: BindingTypes.PROPS
+ })
+ })
+
test('withDefaults (static)', () => {
const { content, bindings } = compile(`
<script setup lang="ts">
UNREF,
SimpleExpressionNode,
isFunctionType,
- walkIdentifiers
+ walkIdentifiers,
+ unwrapTSNode
} from '@vue/compiler-dom'
import { DEFAULT_FILENAME, SFCDescriptor, SFCScriptBlock } from './parse'
import {
}
if (node.type === 'ExpressionStatement') {
+ const expr = unwrapTSNode(node.expression)
// process `defineProps` and `defineEmit(s)` calls
if (
- processDefineProps(node.expression) ||
- processDefineEmits(node.expression) ||
- processDefineOptions(node.expression) ||
- processWithDefaults(node.expression)
+ processDefineProps(expr) ||
+ processDefineEmits(expr) ||
+ processDefineOptions(expr) ||
+ processWithDefaults(expr)
) {
s.remove(node.start! + startOffset, node.end! + startOffset)
- } else if (processDefineExpose(node.expression)) {
+ } else if (processDefineExpose(expr)) {
// defineExpose({}) -> expose({})
- const callee = (node.expression as CallExpression).callee
+ const callee = (expr as CallExpression).callee
s.overwrite(
callee.start! + startOffset,
callee.end! + startOffset,
let left = total
for (let i = 0; i < total; i++) {
const decl = node.declarations[i]
- if (decl.init) {
- if (processDefineOptions(decl.init)) {
+ const init = decl.init && unwrapTSNode(decl.init)
+ if (init) {
+ if (processDefineOptions(init)) {
error(
`${DEFINE_OPTIONS}() has no returning value, it cannot be assigned.`,
node
// defineProps / defineEmits
const isDefineProps =
- processDefineProps(decl.init, decl.id, node.kind) ||
- processWithDefaults(decl.init, decl.id, node.kind)
- const isDefineEmits = processDefineEmits(decl.init, decl.id)
+ processDefineProps(init, decl.id, node.kind) ||
+ processWithDefaults(init, decl.id, node.kind)
+ const isDefineEmits = processDefineEmits(init, decl.id)
if (isDefineProps || isDefineEmits) {
if (left === 1) {
s.remove(node.start! + startOffset, node.end! + startOffset)
)
// export const foo = ...
- for (const { id, init } of node.declarations) {
+ for (const { id, init: _init } of node.declarations) {
+ const init = _init && unwrapTSNode(_init)
const isDefineCall = !!(
isConst &&
isCallOf(