RequireJS and moment.js

by fiddlegrimbo

HTML

<script src="http://requirejs.org/docs/release/2.1.5/comments/require.js"></script>

JavaScript

requirejs.config({
    baseUrl: 'https://raw.github.com/timrwood/moment/2.0.0/',
    /*
    baseUrl: 'https://raw.github.com/timrwood/moment/2.0.0/min/',
    paths:{
        'moment': 'moment.min'
    }
    */
});

var fnWrapper = function (fn, before, after) {
    var ctx = this;
    var opToString = Object.prototype.toString;
    var apSlice = Array.prototype.slice;
    return function () {
        var args = arguments,
            tempArgs;
        if ("function" === typeof before) {
            args = (tempArgs = before.apply(ctx, arguments)) ? tempArgs : args;
        }
        var res = fn.apply(ctx, args);
        if ("function" === typeof after) {
            if ("[object Array]" !== opToString.call(args)) {
                args = apSlice.call(args, 0);
            }
            res = after.apply(ctx, args.concat([res]));
        }
        return res;
    };
};

var logWrapper = function (fn) {
    return fnWrapper(fn, function () {
        console.log(arguments);
    });
};

require = fnWrapper(require, function () {
    var args;
    for (var i = 0; i < arguments.length; i++) {
        if ("../moment" === arguments[i]) {
            if (!args) {
                args = Array.prototype.slice.call(arguments, 0);
            }
            args[i] = "moment";
        }
    }
    if (args) {
        console.log(args);
    }
    return args;
});

require = logWrapper(require);
define = logWrapper(define);

define('mymodule', ['require', 'moment'], function (require, moment) {
    console.log(moment);
    require(['lang/de'], function (de) {
        console.log(moment, de);
        moment.lang('de');
    });
    return {};
});

require(['mymodule'], function (mymodule) {
    console.log(mymodule);
});