Skip to content

Commit

Permalink
resolve emits types
Browse files Browse the repository at this point in the history
  • Loading branch information
g-plane committed Feb 1, 2024
1 parent 79e3671 commit f66b239
Show file tree
Hide file tree
Showing 34 changed files with 367 additions and 25 deletions.
13 changes: 9 additions & 4 deletions visitor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1422,8 +1422,13 @@ where
return;
};

if let Some(prop_types) = self.extract_props_type(maybe_setup) {
inject_option(call_expr, "props", Expr::Object(prop_types));
let props_types = self.extract_props_type(maybe_setup);
let emits_types = self.extract_emits_type(maybe_setup);
if let Some(prop_types) = props_types {
inject_define_component_option(call_expr, "props", Expr::Object(prop_types));
}
if let Some(emits_type) = emits_types {
inject_define_component_option(call_expr, "emits", Expr::Array(emits_type));
}
}

Expand All @@ -1443,15 +1448,15 @@ where
return;
}

inject_option(
inject_define_component_option(
call,
"name",
Expr::Lit(Lit::Str(quote_str!(name.sym.clone()))),
);
}
}

fn inject_option(call: &mut CallExpr, name: &'static str, value: Expr) {
fn inject_define_component_option(call: &mut CallExpr, name: &'static str, value: Expr) {
let options = call.args.get_mut(1);
if options
.as_ref()
Expand Down
163 changes: 142 additions & 21 deletions visitor/src/resolve_type.rs

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/disabled/input.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { defineComponent, type SetupContext } from 'vue'

defineComponent((_, ctx: SetupContext<(e: 'foo' | 'bar') => void>) => {})
2 changes: 2 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/disabled/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { defineComponent, type SetupContext } from 'vue';
defineComponent((_, ctx: SetupContext<(e: 'foo' | 'bar') => void>)=>{});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

export interface Emits { (e: 'foo' | 'bar'): void }

defineComponent((_, ctx: SetupContext<Emits>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineComponent, type SetupContext } from 'vue';
export interface Emits {
(e: 'foo' | 'bar') : void;
}
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"foo",
"bar"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

export type Emits = { (e: 'foo' | 'bar'): void }

defineComponent((_, ctx: SetupContext<Emits>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineComponent, type SetupContext } from 'vue';
export type Emits = {
(e: 'foo' | 'bar') : void;
};
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"foo",
"bar"
]
});
3 changes: 3 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/fn-type/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
7 changes: 7 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/fn-type/input.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { defineComponent, type SetupContext } from 'vue'

defineComponent((_, ctx: SetupContext<(e: 'foo' | 'bar') => void>) => {})

defineComponent((_, ctx: SetupContext<((e: 'foo' | 'bar') => void) | ((e: 'baz', id: number) => void)>) => {})

defineComponent((_, ctx: SetupContext<{(e: 'foo' | 'bar'): void; (e: 'baz', id: number): void;}>) => {})
24 changes: 24 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/fn-type/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { defineComponent, type SetupContext } from 'vue';
defineComponent((_, ctx: SetupContext<(e: 'foo' | 'bar') => void>)=>{}, {
emits: [
"foo",
"bar"
]
});
defineComponent((_, ctx: SetupContext<((e: 'foo' | 'bar') => void) | ((e: 'baz', id: number) => void)>)=>{}, {
emits: [
"foo",
"bar",
"baz"
]
});
defineComponent((_, ctx: SetupContext<{
(e: 'foo' | 'bar') : void;
(e: 'baz', id: number) : void;
}>)=>{}, {
emits: [
"foo",
"bar",
"baz"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { defineComponent, type SetupContext } from 'vue'

interface Base { (e: 'foo'): void }
interface Emits extends Base { (e: 'bar'): void }

defineComponent((_, ctx: SetupContext<Emits>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { defineComponent, type SetupContext } from 'vue';
interface Base {
(e: 'foo') : void;
}
interface Emits extends Base {
(e: 'bar') : void;
}
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"bar",
"foo"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
5 changes: 5 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/interface/input.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

interface Emits { (e: 'foo' | 'bar'): void }

defineComponent((_, ctx: SetupContext<Emits>) => {})
10 changes: 10 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/interface/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineComponent, type SetupContext } from 'vue';
interface Emits {
(e: 'foo' | 'bar') : void;
}
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"foo",
"bar"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

defineComponent((_, ctx: SetupContext<{ foo: [], bar: [] }>) => {})

defineComponent((_, ctx: SetupContext<{ 'foo:bar': [] }>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { defineComponent, type SetupContext } from 'vue';
defineComponent((_, ctx: SetupContext<{
foo: [];
bar: [];
}>)=>{}, {
emits: [
"foo",
"bar"
]
});
defineComponent((_, ctx: SetupContext<{
'foo:bar': [];
}>)=>{}, {
emits: [
"foo:bar"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

export type Emits = (e: 'foo' | 'bar') => void

defineComponent((_, ctx: SetupContext<Emits>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineComponent, type SetupContext } from 'vue';
export type Emits = (e: 'foo' | 'bar') => void;
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"foo",
"bar"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

type Emits = (e: 'foo' | 'bar') => void

defineComponent((_, ctx: SetupContext<Emits>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineComponent, type SetupContext } from 'vue';
type Emits = (e: 'foo' | 'bar') => void;
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"foo",
"bar"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { defineComponent, type SetupContext } from 'vue'

type Emits = { (e: 'foo' | 'bar'): void }

defineComponent((_, ctx: SetupContext<Emits>) => {})
10 changes: 10 additions & 0 deletions visitor/tests/fixture/resolve-emits-types/type-alias/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineComponent, type SetupContext } from 'vue';
type Emits = {
(e: 'foo' | 'bar') : void;
};
defineComponent((_, ctx: SetupContext<Emits>)=>{}, {
emits: [
"foo",
"bar"
]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"resolveType": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { defineComponent, type SetupContext } from 'vue'

type BaseEmit = "change"
type Emit = "some" | "emit" | BaseEmit

defineComponent((_, ctx: SetupContext<{
(e: Emit): void;
(e: "another", val: string): void;
}>) => {})
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { defineComponent, type SetupContext } from 'vue';
type BaseEmit = "change";
type Emit = "some" | "emit" | BaseEmit;
defineComponent((_, ctx: SetupContext<{
(e: Emit) : void;
(e: "another", val: string) : void;
}>)=>{}, {
emits: [
"some",
"emit",
"change",
"another"
]
});

0 comments on commit f66b239

Please sign in to comment.