@@ -2,7 +2,7 @@ import * as path from 'path';
22
33import { createFilter } from '@rollup/pluginutils' ;
44
5- import type { Plugin , SourceDescription } from 'rollup' ;
5+ import type { Plugin , PluginContext , SourceDescription } from 'rollup' ;
66import type { Watch } from 'typescript' ;
77
88import type { RollupTypescriptOptions } from '../types' ;
@@ -37,6 +37,23 @@ export default function typescript(options: RollupTypescriptOptions = {}): Plugi
3737 tslib,
3838 typescript : ts
3939 } = getPluginOptions ( options ) ;
40+ const createProgram = ( context : PluginContext ) =>
41+ createWatchProgram ( ts , context , {
42+ formatHost,
43+ resolveModule,
44+ parsedOptions,
45+ writeFile ( fileName , data ) {
46+ if ( parsedOptions . options . composite || parsedOptions . options . incremental ) {
47+ tsCache . cacheCode ( fileName , data ) ;
48+ }
49+ emittedFiles . set ( fileName , data ) ;
50+ } ,
51+ status ( diagnostic ) {
52+ watchProgramHelper . handleStatus ( diagnostic ) ;
53+ } ,
54+ transformers
55+ } ) ;
56+
4057 const tsCache = new TSCache ( cacheDir ) ;
4158 const emittedFiles = new Map < string , string > ( ) ;
4259 const watchProgramHelper = new WatchProgramHelper ( ) ;
@@ -56,6 +73,14 @@ export default function typescript(options: RollupTypescriptOptions = {}): Plugi
5673 name : 'typescript' ,
5774
5875 buildStart ( rollupOptions ) {
76+ if ( typeof rollupOptions . input === 'string' ) {
77+ parsedOptions . fileNames = [ path . resolve ( rollupOptions . input ) ] ;
78+ }
79+
80+ if ( Array . isArray ( rollupOptions . input ) ) {
81+ parsedOptions . fileNames = rollupOptions . input . map ( ( fileName ) => path . resolve ( fileName ) ) ;
82+ }
83+
5984 emitParsedOptionsErrors ( ts , this , parsedOptions ) ;
6085
6186 preflight ( {
@@ -74,21 +99,7 @@ export default function typescript(options: RollupTypescriptOptions = {}): Plugi
7499 program = null ;
75100 }
76101 if ( ! program ) {
77- program = createWatchProgram ( ts , this , {
78- formatHost,
79- resolveModule,
80- parsedOptions,
81- writeFile ( fileName , data ) {
82- if ( parsedOptions . options . composite || parsedOptions . options . incremental ) {
83- tsCache . cacheCode ( fileName , data ) ;
84- }
85- emittedFiles . set ( fileName , data ) ;
86- } ,
87- status ( diagnostic ) {
88- watchProgramHelper . handleStatus ( diagnostic ) ;
89- } ,
90- transformers
91- } ) ;
102+ program = createProgram ( this ) ;
92103 }
93104 } ,
94105
@@ -139,7 +150,6 @@ export default function typescript(options: RollupTypescriptOptions = {}): Plugi
139150
140151 if ( resolved ) {
141152 if ( / \. d \. [ c m ] ? t s / . test ( resolved . extension ) ) return null ;
142- if ( ! filter ( resolved . resolvedFileName ) ) return null ;
143153 return path . normalize ( resolved . resolvedFileName ) ;
144154 }
145155
@@ -149,16 +159,20 @@ export default function typescript(options: RollupTypescriptOptions = {}): Plugi
149159 async load ( id ) {
150160 if ( ! filter ( id ) ) return null ;
151161
152- this . addWatchFile ( id ) ;
162+ const resolvedId = path . resolve ( id ) ;
163+
164+ this . addWatchFile ( resolvedId ) ;
153165 await watchProgramHelper . wait ( ) ;
154166
155- const fileName = normalizePath ( id ) ;
167+ const fileName = normalizePath ( resolvedId ) ;
156168 if ( ! parsedOptions . fileNames . includes ( fileName ) ) {
157169 // Discovered new file that was not known when originally parsing the TypeScript config
158- parsedOptions . fileNames . push ( fileName ) ;
170+ parsedOptions . fileNames . push ( path . resolve ( fileName ) ) ;
171+
172+ createProgram ( this ) . close ( ) ;
159173 }
160174
161- const output = findTypescriptOutput ( ts , parsedOptions , id , emittedFiles , tsCache ) ;
175+ const output = findTypescriptOutput ( ts , parsedOptions , resolvedId , emittedFiles , tsCache ) ;
162176
163177 return output . code != null ? ( output as SourceDescription ) : null ;
164178 } ,
0 commit comments