| /* |
| Copyright 2015, Yahoo Inc. |
| Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. |
| */ |
| 'use strict'; |
| |
| const fs = require('fs'); |
| const os = require('os'); |
| const path = require('path'); |
| const mkdirp = require('make-dir'); |
| const rimraf = require('rimraf'); |
| |
| /* This exists for compatibility only to avoid changing the |
| * prototype chain. */ |
| class SourceStore {} |
| |
| class MemoryStore extends SourceStore { |
| constructor() { |
| super(); |
| |
| this.data = {}; |
| } |
| |
| registerSource(filePath, sourceText) { |
| this.data[filePath] = sourceText; |
| } |
| |
| getSource(filePath) { |
| return this.data[filePath] || null; |
| } |
| |
| dispose() {} |
| } |
| |
| class FileStore extends SourceStore { |
| constructor(opts = {}) { |
| super(); |
| |
| const tmpDir = opts.tmpdir || os.tmpdir(); |
| this.counter = 0; |
| this.mappings = []; |
| this.basePath = path.resolve(tmpDir, '.istanbul', 'cache_'); |
| mkdirp.sync(path.dirname(this.basePath)); |
| } |
| |
| registerSource(filePath, sourceText) { |
| if (this.mappings[filePath]) { |
| return; |
| } |
| |
| this.counter += 1; |
| const mapFile = this.basePath + this.counter; |
| this.mappings[filePath] = mapFile; |
| fs.writeFileSync(mapFile, sourceText, 'utf8'); |
| } |
| |
| getSource(filePath) { |
| const mapFile = this.mappings[filePath]; |
| if (!mapFile) { |
| return null; |
| } |
| |
| return fs.readFileSync(mapFile, 'utf8'); |
| } |
| |
| dispose() { |
| this.mappings = []; |
| rimraf.sync(path.dirname(this.basePath)); |
| } |
| } |
| |
| module.exports = { |
| create(type = 'memory', opts = {}) { |
| if (type.toLowerCase() === 'file') { |
| return new FileStore(opts); |
| } |
| |
| return new MemoryStore(opts); |
| } |
| }; |