1.0.0 • Published 10 years ago

rjs_converter v1.0.0

Weekly downloads
6
License
-
Repository
github
Last release
10 years ago

rjs_converter

This package contains a function that takes in a require.js AMD module that uses the "CommonJS" style of requiring dependencies (an example below) and converts it into the regular AMD style.

This is handy if you perform any post-processing on built AMD modules (such as i18n extraction) and you want all the input to follow the same format.

Example CommonJS-style AMD module:

define(function(require) {
    var HelloWorld = require('hello_world');

    HelloWorld.greet();
});

Equivalent AMD module:

define([ 'hello_world' ], function(HelloWorld) {
    HelloWorld.greet();
});

Usage

var convert = require('rjs_converter');
var fs = require('fs');

var cjsLikeContents = fs.readFileSync('path/to/amd_script.js');
var amdLikeContents = convert(cjsLikeContents);

Using as a r.js optimizer processor

The script is perfect for use in the onBuildWrite hook that r.js provides you when running the optimizer.

var convert = require('rjs_converter');

requirejs.config({
    onBuildWrite: function (moduleName, path, contents) {
        return convert(contents);
    }
});

Notes

The function is a NO-OP on modules that do not use the CommonJS-style. E.g, it will not modify any of the following:

// 1
define([ 'hello_world' ], function(HelloWorld) {});

// 1.1
define('my_module', [ 'hello_world' ], function(HelloWorld) {});

// 1.2
define([ 'require', 'hello_world' ], function(require, HelloWorld) {});

// 2
require([ 'hello_world' ], function(HelloWorld) {});

Also, the function makes the following assumptions when it's supposed to work. If they're not met, behavior is undefined:

  • Dependencies are expected to be declared in the very beginning of the script block. Meaning, the var x = require('x'); lines should be the first thing you write. I believe this is done by r.js automatically before passing the contents to onBuilWrite but I didn't investigate much.
  • You map each dependency to a variable. Like, there should be no require('x'); statements that do not assign the return value of the module to a variable.

Checking the output

You can use the binary rjs_convert to test the function on a single file. The converted output will be logged to STDOUT.

npm run rjs_convert path/to/file.js

LICENSE

MIT