Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc1d57a6

Browse files
committed
feat(api): dts resolver for all bundlers
1 parent74dadb1 commitc1d57a6

File tree

7 files changed

+83
-144
lines changed

7 files changed

+83
-144
lines changed

‎.changeset/two-pumas-ring.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@vue-macros/better-define":minor
3+
"@vue-macros/api":minor
4+
"@vue-macros/define-prop":patch
5+
---
6+
7+
DTS resolver for all bundlers
8+

‎packages/api/src/index.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export*from'@vue-macros/common'
22

33
export*from'./vue'
4-
export*from'./resolve'
54
export*from'./ts'

‎packages/api/src/resolve.ts‎

Lines changed: 0 additions & 88 deletions
This file was deleted.

‎packages/api/src/ts/namespace.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import{isTSDeclaration}from'./is'
2-
import{resolveTSFileId}from'./resolve-file'
2+
import{resolveDts}from'./resolve-file'
33
import{
44
resolveTSReferencedType,
55
typeTSResolvedType,
@@ -45,7 +45,7 @@ export async function resolveTSNamespace(scope: TSScope): Promise<void> {
4545
type:stmt.declaration,
4646
})
4747
}elseif(stmt.type==='ExportAllDeclaration'){
48-
constresolved=awaitresolveTSFileId(stmt.source.value,file.filePath)
48+
constresolved=awaitresolveDts(stmt.source.value,file.filePath)
4949
if(!resolved)continue
5050

5151
constsourceScope=awaitgetTSFile(resolved)
@@ -56,7 +56,7 @@ export async function resolveTSNamespace(scope: TSScope): Promise<void> {
5656
letsourceExports:TSNamespace
5757

5858
if(stmt.source){
59-
constresolved=awaitresolveTSFileId(stmt.source.value,file.filePath)
59+
constresolved=awaitresolveDts(stmt.source.value,file.filePath)
6060
if(!resolved)continue
6161

6262
constscope=awaitgetTSFile(resolved)
@@ -112,7 +112,7 @@ export async function resolveTSNamespace(scope: TSScope): Promise<void> {
112112
type:stmt,
113113
})
114114
}elseif(stmt.type==='ImportDeclaration'){
115-
constresolved=awaitresolveTSFileId(stmt.source.value,file.filePath)
115+
constresolved=awaitresolveDts(stmt.source.value,file.filePath)
116116
if(!resolved)continue
117117

118118
constimportScope=awaitgetTSFile(resolved)
Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,80 @@
1-
import{lstatSync}from'node:fs'
21
importpathfrom'node:path'
2+
import{tsFileCache}from'./scope'
3+
importtype{ResolverFactory}from'oxc-resolver'
4+
importtype{ModuleNode,Plugin}from'vite'
35

4-
exporttypeResolveTSFileIdImpl=(
5-
id:string,
6-
importer:string,
7-
)=>Promise<string|undefined>|string|undefined
6+
lettypesResolver:ResolverFactory
87

9-
exportconstresolveTSFileId:ResolveTSFileIdImpl=(id,importer)=>{
10-
returnresolveTSFileIdImpl(id,importer)
8+
constreferencedFiles=newMap<string/* file */,Set<string/* importer */>>()
9+
10+
functioncollectReferencedFile(importer:string,file:string){
11+
if(!importer)return
12+
if(!referencedFiles.has(file)){
13+
referencedFiles.set(file,newSet([importer]))
14+
}else{
15+
referencedFiles.get(file)!.add(importer)
16+
}
1117
}
1218

13-
/**
14-
*@limitation don't node_modules and JavaScript file
15-
*/
16-
exportconstresolveTSFileIdNode:ResolveTSFileIdImpl=(
19+
constresolveCache=newMap<
20+
string/* importer */,
21+
Map<string/* id */,string/* result */>
22+
>()
23+
24+
exportasyncfunctionresolveDts(
1725
id:string,
1826
importer:string,
19-
)=>{
20-
return(
21-
tryResolve(id,importer)||
22-
tryResolve(`${id}.ts`,importer)||
23-
tryResolve(`${id}.d.ts`,importer)||
24-
tryResolve(`${id}/index`,importer)||
25-
tryResolve(`${id}/index.ts`,importer)||
26-
tryResolve(`${id}/index.d.ts`,importer)
27+
):Promise<string|undefined>{
28+
constcached=resolveCache.get(importer)?.get(id)
29+
if(cached)returncached
30+
31+
if(!typesResolver){
32+
const{ ResolverFactory}=awaitimport('oxc-resolver')
33+
typesResolver=newResolverFactory({
34+
mainFields:['types'],
35+
conditionNames:['types','import'],
36+
extensions:['.d.ts','.ts'],
37+
})
38+
}
39+
40+
const{ error,path:resolved}=awaittypesResolver.async(
41+
path.dirname(importer),
42+
id,
2743
)
28-
}
29-
functiontryResolve(id:string,importer:string){
30-
constfilePath=path.resolve(importer,'..',id)
31-
try{
32-
conststat=lstatSync(filePath)
33-
if(stat.isFile())returnfilePath
34-
}catch{
35-
return
44+
if(error||!resolved)return
45+
46+
collectReferencedFile(importer,resolved)
47+
if(resolveCache.has(importer)){
48+
resolveCache.get(importer)!.set(id,resolved)
49+
}else{
50+
resolveCache.set(importer,newMap([[id,resolved]]))
3651
}
52+
returnresolved
3753
}
3854

39-
letresolveTSFileIdImpl:ResolveTSFileIdImpl=resolveTSFileIdNode
55+
exportconstresolveDtsHMR:NonNullable<Plugin['handleHotUpdate']>=({
56+
file,
57+
server,
58+
modules,
59+
})=>{
60+
constcache=newMap<string,Set<ModuleNode>>()
61+
if(tsFileCache[file])deletetsFileCache[file]
62+
63+
constaffected=getAffectedModules(file)
64+
return[...modules, ...affected]
4065

41-
exportfunctionsetResolveTSFileIdImpl(impl:ResolveTSFileIdImpl):void{
42-
resolveTSFileIdImpl=impl
66+
functiongetAffectedModules(file:string):Set<ModuleNode>{
67+
if(cache.has(file))returncache.get(file)!
68+
if(!referencedFiles.has(file))returnnewSet([])
69+
70+
constmodules=newSet<ModuleNode>([])
71+
cache.set(file,modules)
72+
for(constimporterofreferencedFiles.get(file)!){
73+
constmods=server.moduleGraph.getModulesByFile(importer)
74+
if(mods)mods.forEach((m)=>modules.add(m))
75+
76+
getAffectedModules(importer).forEach((m)=>modules.add(m))
77+
}
78+
returnmodules
79+
}
4380
}

‎packages/better-define/src/index.ts‎

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
importprocessfrom'node:process'
2-
import{OxcResolve,setResolveTSFileIdImpl}from'@vue-macros/api'
2+
import{resolveDtsHMR}from'@vue-macros/api'
33
import{
44
createFilter,
55
detectVueVersion,
@@ -15,7 +15,6 @@ import {
1515
}from'unplugin'
1616
import{generatePluginName}from'#macros'with{type:'macro'}
1717
import{transformBetterDefine}from'./core'
18-
importtype{PluginContext}from'rollup'
1918

2019
exporttypeOptions=BaseOptions
2120
exporttypeOptionsResolved=MarkRequired<
@@ -47,18 +46,10 @@ const plugin: UnpluginInstance<Options | undefined, false> = createUnplugin(
4746
constoptions=resolveOptions(userOptions,framework)
4847
constfilter=createFilter(options)
4948

50-
const{ resolve, handleHotUpdate}=OxcResolve()
51-
5249
return{
5350
name,
5451
enforce:'pre',
5552

56-
buildStart(){
57-
if(framework==='rollup'||framework==='vite'){
58-
setResolveTSFileIdImpl(resolve(thisasPluginContext))
59-
}
60-
},
61-
6253
transformInclude:filter,
6354
asynctransform(code,id){
6455
try{
@@ -74,7 +65,7 @@ const plugin: UnpluginInstance<Options | undefined, false> = createUnplugin(
7465
options.isProduction??=config.isProduction
7566
},
7667

77-
handleHotUpdate,
68+
handleHotUpdate:resolveDtsHMR,
7869
},
7970
}
8071
},

‎packages/define-prop/src/index.ts‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
importprocessfrom'node:process'
2-
import{OxcResolve,setResolveTSFileIdImpl}from'@vue-macros/api'
2+
import{resolveDtsHMR}from'@vue-macros/api'
33
import{
44
createFilter,
55
detectVueVersion,
@@ -17,7 +17,6 @@ import {
1717
import{generatePluginName}from'#macros'with{type:'macro'}
1818
import{transformDefineProp,typeEdition}from'./core'
1919
import{helperCode,helperId}from'./core/helper'
20-
importtype{PluginContext}from'rollup'
2120

2221
exportinterfaceOptionsextendsBaseOptions{
2322
edition?:Edition
@@ -52,18 +51,11 @@ const plugin: UnpluginInstance<Options | undefined, false> = createUnplugin(
5251
(userOptions={},{ framework})=>{
5352
constoptions=resolveOptions(userOptions,framework)
5453
constfilter=createFilter(options)
55-
const{ resolve, handleHotUpdate}=OxcResolve()
5654

5755
return{
5856
name,
5957
enforce:'pre',
6058

61-
buildStart(){
62-
if(framework==='rollup'||framework==='vite'){
63-
setResolveTSFileIdImpl(resolve(thisasPluginContext))
64-
}
65-
},
66-
6759
resolveId(id){
6860
if(id===normalizePath(helperId))returnid
6961
},
@@ -91,7 +83,7 @@ const plugin: UnpluginInstance<Options | undefined, false> = createUnplugin(
9183
options.isProduction??=config.isProduction
9284
},
9385

94-
handleHotUpdate,
86+
handleHotUpdate:resolveDtsHMR,
9587
},
9688
}
9789
},

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp