81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
|  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);
 | |
|     }
 | |
| };
 |