Skip to content

Commit 77b1ca4

Browse files
author
Ives van Hoorne
committed
Support nested component cache invalidations
1 parent df1a254 commit 77b1ca4

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/sandbox/eval/js.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,15 @@ import resolveModule from '../utils/resolve-module';
44

55
const moduleCache = new Map();
66

7+
/**
8+
* Deletes the cache of all modules that use module and module itself
9+
*/
710
export function deleteCache(module) {
11+
moduleCache.forEach((value) => {
12+
if (value.requires.includes(module.id)) {
13+
deleteCache(value.module);
14+
}
15+
});
816
moduleCache.delete(module.id);
917
}
1018

@@ -28,6 +36,7 @@ function evaluate(code, require) {
2836

2937
export default function evaluateJS(mainModule, modules, directories, manifest, depth) {
3038
try {
39+
const requires = [];
3140
require = function require(path) { // eslint-disable-line no-unused-vars
3241
const dependencyManifest = manifest[path] || manifest[`${path}.js`];
3342
if (dependencyManifest) return window.dependencies(dependencyManifest.id);
@@ -36,9 +45,11 @@ export default function evaluateJS(mainModule, modules, directories, manifest, d
3645
if (mainModule === module) throw new Error(`${mainModule.title} is importing itself`);
3746
if (!module) throw new Error(`Cannot find module in path: ${path}`);
3847

48+
requires.push(module.id);
3949
// Check if this module has been evaluated before, if so return that
40-
return moduleCache.get(module.id) ||
41-
evalModule(module, modules, directories, manifest, depth + 1);
50+
const cache = moduleCache.get(module.id);
51+
52+
return cache ? cache.exports : evalModule(module, modules, directories, manifest, depth + 1);
4253
};
4354

4455
const compiledCode = compileCode(mainModule.code, mainModule.title);
@@ -47,7 +58,7 @@ export default function evaluateJS(mainModule, modules, directories, manifest, d
4758
const exports = evaluate(compiledCode, require);
4859

4960
// Always set a (if no error) new cache for this module, because we know this changed
50-
moduleCache.set(mainModule.id, exports);
61+
moduleCache.set(mainModule.id, { exports, module: mainModule, requires });
5162
return exports;
5263
} catch (e) {
5364
// Remove cache

0 commit comments

Comments
 (0)