@@ -6,14 +6,20 @@ var applySourceMap = require('vinyl-sourcemaps-apply');
66var objectAssign = require ( 'object-assign' ) ;
77var replaceExt = require ( 'replace-ext' ) ;
88var babel = require ( 'babel-core' ) ;
9+ var lru = require ( 'lru-cache' ) ;
10+ var crypto = require ( 'crypto' ) ;
911
1012function replaceExtension ( fp ) {
1113 return path . extname ( fp ) ? replaceExt ( fp , '.js' ) : fp ;
1214}
1315
14- module . exports = function ( opts ) {
16+ module . exports = function ( opts , lruOptions ) {
1517 opts = opts || { } ;
1618
19+ lruOptions = lruOptions || 500 ;
20+
21+ var cache = lru ( lruOptions ) ;
22+
1723 return through . obj ( function ( file , enc , cb ) {
1824 if ( file . isNull ( ) ) {
1925 cb ( null , file ) ;
@@ -34,7 +40,17 @@ module.exports = function (opts) {
3440 sourceMapTarget : file . relative
3541 } ) ;
3642
37- var res = babel . transform ( file . contents . toString ( ) , fileOpts ) ;
43+ var resultHash = crypto . createHash ( 'sha1' ) . update ( file . contents . toString ( ) ) . digest ( 'hex' ) ;
44+
45+ var res ;
46+
47+ res = cache . get ( resultHash ) ;
48+
49+ if ( ! res ) {
50+ res = babel . transform ( file . contents . toString ( ) , fileOpts ) ;
51+
52+ cache . set ( resultHash , res ) ;
53+ }
3854
3955 if ( file . sourceMap && res . map ) {
4056 res . map . file = replaceExtension ( res . map . file ) ;
0 commit comments