88} from './get-file-coordinates.ts' ;
99
1010const fileCache = new Map < string , string > ( ) ;
11+ const fileModifiedTimes = new Map < string , number > ( ) ;
1112
1213const invalidTagPatterns = [
1314 / ^ : / , // Don't process named blocks (:block-name)
@@ -17,8 +18,18 @@ const isInvalidTag = combineRegexPatterns(invalidTagPatterns);
1718const p = new Preprocessor ( ) ;
1819const parsedFiles = new Map < string , Parsed [ ] > ( ) ;
1920
21+ function isFileCacheValid ( filename : string ) : boolean {
22+ if ( ! fileCache . has ( filename ) || ! fileModifiedTimes . has ( filename ) ) {
23+ return false ;
24+ }
25+
26+ const stats = fs . statSync ( filename ) ;
27+ const cachedMtime = fileModifiedTimes . get ( filename ) ! ;
28+ return stats . mtimeMs === cachedMtime ;
29+ }
30+
2031function parseFile ( filename : string , content : string ) : Parsed [ ] {
21- if ( parsedFiles . has ( filename ) ) {
32+ if ( parsedFiles . has ( filename ) && isFileCacheValid ( filename ) ) {
2233 return parsedFiles . get ( filename ) ! ;
2334 }
2435 const parsed = p . parse ( content ) ;
@@ -27,12 +38,16 @@ function parseFile(filename: string, content: string): Parsed[] {
2738}
2839
2940function getFullFileContent ( filename : string ) : string {
30- if ( fileCache . has ( filename ) ) {
41+ if ( isFileCacheValid ( filename ) ) {
3142 return fileCache . get ( filename ) ! ;
3243 }
3344
3445 const content = fs . readFileSync ( filename , 'utf-8' ) ;
46+ const stats = fs . statSync ( filename ) ;
47+
3548 fileCache . set ( filename , content ) ;
49+ fileModifiedTimes . set ( filename , stats . mtimeMs ) ;
50+
3651 return content ;
3752}
3853
@@ -99,7 +114,7 @@ export function templatePlugin(env: { filename: string }) {
99114 } ;
100115
101116 const parsed = parsedFile . find ( ( program : Parsed ) => {
102- // @ts -expect-error data is accessible
117+ // @ts -expect-error data is accessible but marked private, node.loc.module returns 'an unknown module'
103118 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
104119 return program . contents === node . loc . data . source . source ;
105120 } ) ;
0 commit comments