Skip to content

Commit

Permalink
fix(define-model): improve limit
Browse files Browse the repository at this point in the history
  • Loading branch information
sxzz committed Nov 11, 2022
1 parent c157f1a commit bb50fa6
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 5 deletions.
5 changes: 5 additions & 0 deletions .changeset/blue-yaks-share.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@vue-macros/define-model': patch
---

improve limit
19 changes: 14 additions & 5 deletions packages/define-model/src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,14 @@ export const transformDefineModel = (
let hasDefineProps = false
let hasDefineEmits = false
let hasDefineModel = false

let propsTypeDecl: TSInterfaceBody | TSTypeLiteral | undefined
let propsDestructureDecl: Node | undefined
let emitsTypeDecl: TSInterfaceBody | TSTypeLiteral | undefined
let emitsIdentifier: string | undefined

let runtimeDefineFn: string | undefined

let modelDecl: Node | undefined
let modelDeclKind: string | undefined
let modelTypeDecl: TSInterfaceBody | TSTypeLiteral | undefined
Expand All @@ -66,14 +69,14 @@ export const transformDefineModel = (
}
const fnName = type === 'props' ? DEFINE_PROPS : DEFINE_EMITS

if (node.arguments[0]) {
runtimeDefineFn = fnName
return false
}

if (type === 'props') hasDefineProps = true
else hasDefineEmits = true

if (node.arguments[0])
throw new SyntaxError(
`${fnName}() cannot accept non-type arguments when used with ${DEFINE_MODEL}()`
)

const typeDeclRaw = node.typeParameters?.params?.[0]
if (!typeDeclRaw)
throw new SyntaxError(
Expand Down Expand Up @@ -516,6 +519,12 @@ export const transformDefineModel = (
}

if (!modelTypeDecl) return

if (runtimeDefineFn)
throw new SyntaxError(
`${runtimeDefineFn}() cannot accept non-type arguments when used with ${DEFINE_MODEL}()`
)

if (modelTypeDecl.type !== 'TSTypeLiteral') {
throw new SyntaxError(
`type argument passed to ${DEFINE_MODEL}() must be a literal type, or a reference to an interface or literal type.`
Expand Down
20 changes: 20 additions & 0 deletions packages/define-model/tests/__snapshots__/fixtures.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,26 @@ modelValue.value = 'newValue'
"
`;
exports[`fixtures > ./fixtures/runtime/vue3/define-props-runtime.vue 1`] = `undefined`;
exports[`fixtures > ./fixtures/runtime/vue3/empty.vue 1`] = `
"<script setup lang=\\"ts\\">
import _DM_useVModel from '/plugin-define-model/use-vmodel';
defineProps<{
}>();
defineEmits<{
}>();
_DM_useVModel()
</script>
"
`;
exports[`fixtures > ./fixtures/runtime/vue3/error-empty-define-props.vue 1`] = `"defineProps() expected a type parameter when used with defineModel."`;
exports[`fixtures > ./fixtures/runtime/vue3/error-runtime.vue 1`] = `"defineProps() cannot accept non-type arguments when used with defineModel()"`;
exports[`fixtures > ./fixtures/runtime/vue3/multi-decl.vue 1`] = `
"<script setup lang=\\"ts\\">
import _DM_useVModel from '/plugin-define-model/use-vmodel';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<script setup lang="ts">
defineProps({
foo: String,
})
/* defineModel */
</script>
3 changes: 3 additions & 0 deletions packages/define-model/tests/fixtures/runtime/vue3/empty.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<script setup lang="ts">
defineModel<{}>()
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<script setup lang="ts">
defineModel<{
modelValue: string
}>()
defineProps()
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<script setup lang="ts">
defineProps({
foo: String,
})
defineModel<{}>()
</script>

0 comments on commit bb50fa6

Please sign in to comment.