81 lines
1.9 KiB
JavaScript
81 lines
1.9 KiB
JavaScript
|
var util = require('util'),
|
||
|
os = require('os'),
|
||
|
path = require('path'),
|
||
|
mkdirp = require('mkdirp'),
|
||
|
rimraf = require('rimraf'),
|
||
|
fs = require('fs');
|
||
|
|
||
|
function SourceStore(/*opts*/) {
|
||
|
}
|
||
|
|
||
|
SourceStore.prototype.registerSource = function (/* filePath, sourceText */) {
|
||
|
throw new Error('registerSource must be overridden');
|
||
|
};
|
||
|
|
||
|
SourceStore.prototype.getSource = function (/* filePath */) {
|
||
|
throw new Error('getSource must be overridden');
|
||
|
};
|
||
|
|
||
|
SourceStore.prototype.dispose = function () {
|
||
|
};
|
||
|
|
||
|
function MemoryStore() {
|
||
|
this.data = {};
|
||
|
}
|
||
|
|
||
|
util.inherits(MemoryStore, SourceStore);
|
||
|
|
||
|
MemoryStore.prototype.registerSource = function (filePath, sourceText) {
|
||
|
this.data[filePath] = sourceText;
|
||
|
};
|
||
|
|
||
|
MemoryStore.prototype.getSource = function (filePath) {
|
||
|
return this.data[filePath] || null;
|
||
|
};
|
||
|
|
||
|
function FileStore(opts) {
|
||
|
opts = opts || {};
|
||
|
var tmpDir = opts.tmpdir || os.tmpdir();
|
||
|
this.counter = 0;
|
||
|
this.mappings = [];
|
||
|
this.basePath = path.resolve(tmpDir, '.istanbul', 'cache_');
|
||
|
mkdirp.sync(path.dirname(this.basePath));
|
||
|
}
|
||
|
|
||
|
util.inherits(FileStore, SourceStore);
|
||
|
|
||
|
FileStore.prototype.registerSource = function (filePath, sourceText) {
|
||
|
if (this.mappings[filePath]) {
|
||
|
return;
|
||
|
}
|
||
|
this.counter += 1;
|
||
|
var mapFile = this.basePath + this.counter;
|
||
|
this.mappings[filePath] = mapFile;
|
||
|
fs.writeFileSync(mapFile, sourceText, 'utf8');
|
||
|
};
|
||
|
|
||
|
FileStore.prototype.getSource = function (filePath) {
|
||
|
var mapFile = this.mappings[filePath];
|
||
|
if (!mapFile) {
|
||
|
return null;
|
||
|
}
|
||
|
return fs.readFileSync(mapFile, 'utf8');
|
||
|
};
|
||
|
|
||
|
FileStore.prototype.dispose = function () {
|
||
|
this.mappings = [];
|
||
|
rimraf.sync(path.dirname(this.basePath));
|
||
|
};
|
||
|
|
||
|
module.exports = {
|
||
|
create: function (type, opts) {
|
||
|
opts = opts || {};
|
||
|
type = (type || 'memory').toLowerCase();
|
||
|
|
||
|
if (type === 'file') {
|
||
|
return new FileStore(opts);
|
||
|
}
|
||
|
return new MemoryStore(opts);
|
||
|
}
|
||
|
};
|