create-expo-cljs-app
Version:
Create a react native application with Expo and Shadow-CLJS!
80 lines (61 loc) • 1.76 kB
JavaScript
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
*/
"use strict";
const Module = require("./Module");
const Package = require("./Package");
class ModuleCache {
constructor(options) {
this._getClosestPackage = options.getClosestPackage;
this._moduleCache = Object.create(null);
this._packageCache = Object.create(null);
this._packageModuleMap = new WeakMap();
}
getModule(filePath) {
if (!this._moduleCache[filePath]) {
this._moduleCache[filePath] = new Module(filePath, this);
}
return this._moduleCache[filePath];
}
getPackage(filePath) {
if (!this._packageCache[filePath]) {
this._packageCache[filePath] = new Package({
file: filePath
});
}
return this._packageCache[filePath];
}
getPackageForModule(module) {
let packagePath = this._packageModuleMap.get(module);
if (packagePath) {
if (this._packageCache[packagePath]) {
return this._packageCache[packagePath];
} else {
this._packageModuleMap.delete(module);
}
}
packagePath = this._getClosestPackage(module.path);
if (!packagePath) {
return null;
}
this._packageModuleMap.set(module, packagePath);
return this.getPackage(packagePath);
}
processFileChange(type, filePath) {
if (this._moduleCache[filePath]) {
this._moduleCache[filePath].invalidate();
delete this._moduleCache[filePath];
}
if (this._packageCache[filePath]) {
this._packageCache[filePath].invalidate();
delete this._packageCache[filePath];
}
}
}
module.exports = ModuleCache;