61 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import fs = require('fs');
 | |
| import fse = require('fs-extra');
 | |
| import path = require('path');
 | |
| import {wrapDiffingPlugin, DiffingBroccoliPlugin, DiffResult} from './diffing-broccoli-plugin';
 | |
| 
 | |
| var minimatch = require('minimatch');
 | |
| var FILE_ENCODING = {encoding: 'utf-8'};
 | |
| 
 | |
| /**
 | |
|  * Intercepts each changed file and replaces its contents with
 | |
|  * the associated changes.
 | |
|  */
 | |
| class DiffingReplace implements DiffingBroccoliPlugin {
 | |
|   // TODO: define an interface for options
 | |
|   constructor(private inputPath: string, private cachePath: string, private options: any) {}
 | |
| 
 | |
|   rebuild(treeDiff: DiffResult) {
 | |
|     var patterns = this.options.patterns;
 | |
|     var files = this.options.files;
 | |
| 
 | |
|     treeDiff.addedPaths.concat(treeDiff.changedPaths)
 | |
|         .forEach((changedFilePath) => {
 | |
|           var sourceFilePath = path.join(this.inputPath, changedFilePath);
 | |
|           var destFilePath = path.join(this.cachePath, changedFilePath);
 | |
|           var destDirPath = path.dirname(destFilePath);
 | |
| 
 | |
|           if (!fs.existsSync(destDirPath)) {
 | |
|             fse.mkdirpSync(destDirPath);
 | |
|           }
 | |
| 
 | |
|           var fileMatches = files.some((filePath: string) => minimatch(changedFilePath, filePath));
 | |
|           if (fileMatches) {
 | |
|             var content = fs.readFileSync(sourceFilePath, FILE_ENCODING);
 | |
|             patterns.forEach((pattern: any) => {
 | |
|               var replacement = pattern.replacement;
 | |
|               if (typeof replacement === 'function') {
 | |
|                 replacement = function(content: string) {
 | |
|                   return pattern.replacement(content, changedFilePath);
 | |
|                 };
 | |
|               }
 | |
|               content = content.replace(pattern.match, replacement);
 | |
|             });
 | |
|             fs.writeFileSync(destFilePath, content, FILE_ENCODING);
 | |
|           } else if (!fs.existsSync(destFilePath)) {
 | |
|             try {
 | |
|               fs.symlinkSync(sourceFilePath, destFilePath);
 | |
|             } catch (e) {
 | |
|               fs.writeFileSync(destFilePath, fs.readFileSync(sourceFilePath));
 | |
|             }
 | |
|           }
 | |
|         });
 | |
| 
 | |
|     treeDiff.removedPaths.forEach((removedFilePath) => {
 | |
|       var destFilePath = path.join(this.cachePath, removedFilePath);
 | |
|       fs.unlinkSync(destFilePath);
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| export default wrapDiffingPlugin(DiffingReplace);
 |