1- import { existsSync } from 'node:fs'
2- import { readFile } from 'node:fs/promises'
3- import path from 'node:path'
41import { createUnplugin } from 'unplugin'
52import { createFilter } from '@rollup/pluginutils'
63import { REGEX_SETUP_SFC , REGEX_VUE_SFC } from '@vue-macros/common'
7- import { setResolveTSFileIdImpl , tsFileCache } from '@vue-macros/api'
4+ import { RollupResolve , setResolveTSFileIdImpl } from '@vue-macros/api'
85import { transformBetterDefine } from './core'
9- import type { ModuleNode } from 'vite'
10- import type { ResolveTSFileIdImpl } from '@vue-macros/api'
116import type { PluginContext } from 'rollup'
127import type { FilterPattern } from '@rollup/pluginutils'
138
@@ -36,92 +31,15 @@ export default createUnplugin<Options | undefined, false>(
3631const options = resolveOptions ( userOptions )
3732const filter = createFilter ( options . include , options . exclude )
3833
39- const referencedFiles = new Map <
40- string /* file */ ,
41- Set < string /* importer */ >
42- > ( )
43-
44- function collectReferencedFile ( importer :string , file :string ) {
45- if ( ! importer ) return
46- if ( ! referencedFiles . has ( file ) ) {
47- referencedFiles . set ( file , new Set ( [ importer ] ) )
48- } else {
49- referencedFiles . get ( file ) ! . add ( importer )
50- }
51- }
52-
53- const resolveCache = new Map <
54- string /* importer */ ,
55- Map < string /* id */ , string /* result */ >
56- > ( )
57-
58- function withResolveCache ( id :string , importer :string , result :string ) {
59- if ( ! resolveCache . has ( importer ) ) {
60- resolveCache . set ( importer , new Map ( [ [ id , result ] ] ) )
61- return result
62- }
63- resolveCache . get ( importer ) ! . set ( id , result )
64- return result
65- }
66-
67- const RollupResolve =
68- ( ctx :PluginContext ) :ResolveTSFileIdImpl =>
69- async ( id , importer ) => {
70- const cached = resolveCache . get ( importer ) ?. get ( id )
71- if ( cached ) return cached
72-
73- async function tryPkgEntry ( ) {
74- try {
75- const pkgPath = ( await ctx . resolve ( `${ id } /package.json` , importer ) )
76- ?. id
77- if ( ! pkgPath ) return
78-
79- const pkg = JSON . parse ( await readFile ( pkgPath , 'utf-8' ) )
80- const types = pkg . types || pkg . typings
81- if ( ! types ) return
82-
83- const entry = path . resolve ( pkgPath , '..' , types )
84- return existsSync ( entry ) ?entry :undefined
85- } catch { }
86- }
87-
88- const tryResolve = async ( id :string ) => {
89- try {
90- return (
91- ( await ctx . resolve ( id , importer ) ) ?. id ||
92- ( await ctx . resolve ( `${ id } .d` , importer ) ) ?. id
93- )
94- } catch { }
95-
96- return
97- }
98-
99- if ( ! id . startsWith ( '.' ) ) {
100- const entry = await tryPkgEntry ( )
101- if ( entry ) return withResolveCache ( id , importer , entry )
102- }
103-
104- let resolved = await tryResolve ( id )
105- if ( ! resolved ) return
106- if ( existsSync ( resolved ) ) {
107- collectReferencedFile ( importer , resolved )
108- return withResolveCache ( id , importer , resolved )
109- }
110-
111- resolved = await tryResolve ( resolved )
112- if ( resolved && existsSync ( resolved ) ) {
113- collectReferencedFile ( importer , resolved )
114- return withResolveCache ( id , importer , resolved )
115- }
116- }
34+ const { resolve, handleHotUpdate} = RollupResolve ( )
11735
11836return {
11937 name,
12038enforce :'pre' ,
12139
12240buildStart ( ) {
12341if ( meta . framework === 'rollup' || meta . framework === 'vite' ) {
124- setResolveTSFileIdImpl ( RollupResolve ( this as PluginContext ) )
42+ setResolveTSFileIdImpl ( resolve ( this as PluginContext ) )
12543}
12644} ,
12745
@@ -143,28 +61,7 @@ export default createUnplugin<Options | undefined, false>(
14361options . isProduction = config . isProduction
14462} ,
14563
146- handleHotUpdate ( { file, server, modules} ) {
147- const cache = new Map < string , Set < ModuleNode > > ( )
148- function getAffectedModules ( file :string ) :Set < ModuleNode > {
149- if ( cache . has ( file ) ) return cache . get ( file ) !
150-
151- if ( ! referencedFiles . has ( file ) ) return new Set ( [ ] )
152- const modules = new Set < ModuleNode > ( [ ] )
153- cache . set ( file , modules )
154- for ( const importer of referencedFiles . get ( file ) ! ) {
155- const mods = server . moduleGraph . getModulesByFile ( importer )
156- if ( mods ) mods . forEach ( ( m ) => modules . add ( m ) )
157-
158- getAffectedModules ( importer ) . forEach ( ( m ) => modules . add ( m ) )
159- }
160- return modules
161- }
162-
163- if ( tsFileCache [ file ] ) delete tsFileCache [ file ]
164-
165- const affected = getAffectedModules ( file )
166- return [ ...modules , ...affected ]
167- } ,
64+ handleHotUpdate,
16865} ,
16966}
17067}