@@ -7,6 +7,7 @@ use std::{
77 sync:: Arc ,
88} ;
99
10+ use napi:: { bindgen_prelude:: AsyncTask , Task } ;
1011use napi_derive:: napi;
1112use oxc_resolver:: { ResolveOptions , Resolver } ;
1213
@@ -42,6 +43,26 @@ pub fn sync(path: String, request: String) -> ResolveResult {
4243 resolve ( & resolver, & path, & request)
4344}
4445
46+ pub struct ResolveTask {
47+ resolver : Arc < Resolver > ,
48+ directory : PathBuf ,
49+ request : String ,
50+ }
51+
52+ #[ napi]
53+ impl Task for ResolveTask {
54+ type Output = ResolveResult ;
55+ type JsValue = ResolveResult ;
56+
57+ fn compute ( & mut self ) -> napi:: Result < Self :: Output > {
58+ Ok ( resolve ( & self . resolver , & self . directory , & self . request ) )
59+ }
60+
61+ fn resolve ( & mut self , _: napi:: Env , result : Self :: Output ) -> napi:: Result < Self :: JsValue > {
62+ Ok ( result)
63+ }
64+ }
65+
4566#[ napi]
4667pub struct ResolverFactory {
4768 resolver : Arc < Resolver > ,
@@ -86,10 +107,10 @@ impl ResolverFactory {
86107 /// Asynchronously resolve `specifier` at an absolute path to a `directory`.
87108 #[ allow( clippy:: needless_pass_by_value) ]
88109 #[ napi( js_name = "async" ) ]
89- pub async fn resolve_async ( & self , directory : String , request : String ) -> ResolveResult {
110+ pub fn resolve_async ( & self , directory : String , request : String ) -> AsyncTask < ResolveTask > {
90111 let path = PathBuf :: from ( directory) ;
91112 let resolver = self . resolver . clone ( ) ;
92- tokio :: spawn ( async move { resolve ( & resolver, & path, & request) } ) . await . unwrap ( )
113+ AsyncTask :: new ( ResolveTask { resolver, directory : path, request } )
93114 }
94115
95116 fn normalize_options ( op : NapiResolveOptions ) -> ResolveOptions {
0 commit comments