Skip to content

Commit

Permalink
Merge pull request #2 from djulien/master
Browse files Browse the repository at this point in the history
allowed nested transforms
  • Loading branch information
bahmutov committed Sep 17, 2015
2 parents a3d7391 + 8ed943a commit b915569
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 5 deletions.
29 changes: 26 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

// based on https://github.com/gotwarlost/istanbul/blob/master/lib/hook.js
'use strict'; //catch errors more easily

/*
Copyright (c) 2012, Yahoo! Inc. All rights reserved.
Expand All @@ -8,7 +10,12 @@
var fs = require('fs'),
Module = require('module');

//dummy definition in case module is not available:
if (!Module) Module = {};
if (!Module._extensions) { console.log("dummy module def"); Module._extensions = []; }

var originalLoaders = {};
var nestedTransforms = {}; //allow nested transforms

var verify = {
extension: function (str) {
Expand Down Expand Up @@ -40,14 +47,28 @@ function hook(extension, transform, options) {
verify.extension(extension);
verify.transform(transform);

originalLoaders[extension] = Module._extensions[extension];
if (!nestedTransforms[extension]) nestedTransforms[extension] = [];
if (!nestedTransforms[extension].length) //only store the first one -DJ
originalLoaders[extension] = Module._extensions[extension];
nestedTransforms[extension].push(transform); //allow nested transforms -DJ


Module._extensions[extension] = function (module, filename) {
if (options.verbose) {
console.log('transforming', filename);
}
var source = fs.readFileSync(filename, 'utf8');
var ret = transform(source, filename);
var ret = null; //transform(source, filename);
nestedTransforms[extension].every(function(nested) //nesting order performs earlier first, later last
{
// console.log("IN: " + source);
ret = nested(source, filename);
// console.log("OUT: " + ret);
// if (typeof ret !== 'string') return false; //break
// if (!options.toString) return false; //stop here
source = ret + ""; //convert to string and keep going
return true; //continue
});
if (typeof ret === 'string') {
module._compile(ret, filename);
} else if (options.verbose) {
Expand All @@ -64,7 +85,9 @@ function unhook(extension) {
extension = '.js';
}
verify.extension(extension);
Module._extensions[extension] = originalLoaders[extension];
nestedTransforms[extension].pop(); //assumes no stack underflow
if (!nestedTransforms[extension].length) //restore original only once
Module._extensions[extension] = originalLoaders[extension];
}

module.exports = {
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "node-hook",
"version": "0.1.0",
"version": "0.1.1",
"description": "Run source transform function on Node require",
"main": "index.js",
"scripts": {
"test": "gt test/jsTest.js --output",
"use-case": "node test/use-case.js"
"use-case": "node test/use-case.js & node test/use-case-nested.js"
},
"repository": {
"type": "git",
Expand Down
36 changes: 36 additions & 0 deletions test/use-case-nested.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
var hook = require('../index');
var path = require('path');

function outer_hook(source, filename) {
console.log('wedge +10 into filename', path.relative(__dirname, filename));
source = source.replace(/return a \+ b/, "return a + b + 10");
// console.log(source);
return source;
}

function inner_hook(source, filename) {
console.log('wedge *3 into filename', path.relative(__dirname, filename));
source = source.replace(/return a \+ b/, "return a + b * 3");
// console.log(source);
return source;
}

hook.hook('.js', outer_hook); //+ 10
hook.hook('.js', inner_hook); //* 3

var add = require('./dummy');

console.assert(typeof add === 'function', 'got a function');
//NOTE:
//if inner_hook runs after outer_hook, result will be 2 + 3 * 3 + 10 = 21
//if outer_hook runs after inner_hook, result will be 2 + 3 + 10 * 3 = 35
//if only outer_hook runs, result will be 2 + 3 + 10 = 15
//if only inner_hook runs, result will be 2 + 3 * 3 = 11
//since inner_hook is attached last, it should run after outer_hook
console.log("result: ", add(2, 3));
console.assert(add(2, 3) === 21, 'computed correct function');

console.log('nested test: all seems good');

//eof

0 comments on commit b915569

Please # to comment.