index.js
function getter() {

      // not found
      var cached = internalCache[filename];
      if (!cached) {
        return undefined;
      }
      // we have already tested whether the cached value is valid and deleted it if not
      else if (isTestedCache[filename]) {
        return cached.output;
      }
      // test the input
      else {
        var isMatch = cached.input && fs.existsSync(filename) &&
          (cached.input === fs.readFileSync(filename).toString());
        isTestedCache[filename] = true;
        internalCache[filename] = isMatch && cached;
        return getter();
      }
    }
function getter() {

      // not found
      var cached = internalCache[filename];
      if (!cached) {
        return undefined;
      }
      // we have already tested whether the cached value is valid and deleted it if not
      else if (isTestedCache[filename]) {
        return cached.output;
      }
      // test the input
      else {
        var isMatch = cached.input && fs.existsSync(filename) &&
          (cached.input === fs.readFileSync(filename).toString());
        isTestedCache[filename] = true;
        internalCache[filename] = isMatch && cached;
        return getter();
      }
    }
function getter ( ) { // not found var cached = internalCache [ filename ] ; if ( ! cached ) { return undefined ; } // we have already tested whether the cached value is valid and deleted it if not else if ( isTestedCache [ filename ] ) { return cached . output ; } // test the input else { var isMatch = cached . input && fs . existsSync ( filename ) && ( cached . input === fs . readFileSync ( filename ) . toString ( ) ) ; isTestedCache [ filename ] = true ; internalCache [ filename ] = isMatch && cached ; return getter ( ) ; } }
create a getter we need to use a getter as it is the only hook at which we can perform comparison the value is accessed multiple times each compile cycle but is only set at the end of the cycle getters will persist for the life of the internal cache so the test cache also needs to persist
create a getter we need to use a getter as it is the only hook at which we can perform comparison the value is accessed multiple times each compile cycle but is only set at the end of the cycle getters will persist for the life of the internal cache so the test cache also needs to persist