homemade

C-like JS preprocessor

Homemade.js

Cozy C-like preprocessor. Implements include, exclude, define, put, if, elif, ifdef.

node homemade.js path/to/source.js path/to/destination.js

See grunt-homemade task.

Fully compatible with preprocessor.js syntax.

Source:

//#exclude 
console.log(a, b, c)
//#end 

Result:

Useful when you want to remove supporting code from the build, like helper functions etc.

Source:

//#include ./c.js 

c.js:

Hello world!

Result:

Hello world!

Files are inserted in a recursive way, so that inserted files will be handled also. The current directory . is taken one of the current file. The current file is that where the current #inline directive is.

Source:

//#define name = "Hello world" 
//#define dictToArray = function(dict){ var result = []; for (var key in dict){ result.push(key + " " + dict[key]) }; return result; } 

Defined variables can be used later in #put or #ifs.

#put — places variable source (uses tosource for serialization)

Source:

var projectName = //#put name 
//#define a = {a:1, b:2, c:3} 
//#put a; 
//#put dictToArray(a); 
//#put `var a = ` + projectName + `;` 

Result:

var projectName = 'Hello world'
{a:1, b:2, c:3}
["a 1", "b 2", "c 3"]

To output raw code, use markdown inline code notation, like \raw code` + variable`

Source:

//#if DEV 
    console.log("debug:", result)
//#else 
    //#put "var projectName = '" + name + "'" 
//#endif 

Result with DEV === true:

    console.log("debug:", result)

Result with DEV === false:

    var projectName = 'Hello world'

For more examples see test/before.js.

build.js:

(function($){
    //#ifndef pluginName 
        var pluginName = "awesomePlugin"
    //#else 
        /* #put `var pluginName = ` + pluginName */
    //#endif 
 
    //#include "../src/utils.js" 
    //#include "../src/AwesomePlugin.js" 
 
    //jquery-plugin 
    if ($){
        $['fn'][pluginName] = function (arg) {
            return this['each'](function(i,e){
                var $e = $(e);
                var instance = new AwesomePlugin($e[0], arg);
                $e.data(pluginName, instance);
            })
        };
    } else {
        window[pluginName] = AwesomePlugin;
    }
})(window['jQuery'] || window['Zepto']);

This plugin was created as a fast replacement to preprocessor.js and alike, due to lack of necessary building features in them on that moment, like define, put etc.

For now homemade has some flaws:

  • Insecure − context is defined in global scope, so that you have to beware of variable names in #define
  • Nested conditions are not supported
  • No decent syntax errors detection

Copyright Dmitry Ivanov. Written by Dmitry Ivanov. Licensed under the MIT license.