Skip to content

Commit c340a01

Browse files
committed
invalidate file cache when file modified time changes
1 parent 44992f2 commit c340a01

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

src/babel/rewriteHbs.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
} from './get-file-coordinates.ts';
99

1010
const fileCache = new Map<string, string>();
11+
const fileModifiedTimes = new Map<string, number>();
1112

1213
const invalidTagPatterns = [
1314
/^:/, // Don't process named blocks (:block-name)
@@ -17,8 +18,18 @@ const isInvalidTag = combineRegexPatterns(invalidTagPatterns);
1718
const p = new Preprocessor();
1819
const 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+
2031
function 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

2940
function 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

Comments
 (0)