Skip to content

Commit

Permalink
📃 CommonJS support
Browse files Browse the repository at this point in the history
  • Loading branch information
just-boris committed Mar 25, 2015
1 parent be8f7a9 commit d4977c3
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 1 deletion.
43 changes: 42 additions & 1 deletion src/core.js
Expand Up @@ -85,6 +85,39 @@ function loadWithPlugin(dependency, path) {
});
}, null, path);
}

var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g;
function wrapCommonJS(name, factory) {
var deps = [];
factory.toString()
.replace(commentRegExp, '')
.replace(cjsRequireRegExp, function (match, dep) {
deps.push(dep);
});
return {
deps: deps,
factory: function() {
var args = arguments,
modules = deps.reduce(function(modules, name, index) {
modules[name] = args[index];
return modules;
}, {});
return factory(
function localRequire(name) {
if(!modules[name]) {
throw new Error('Module "' + deps + '" has not been loaded yet');
}
return modules[name];
},
locals.module(name),
locals.exports(name)
);
}
};
}


function _require(deps, factory, errback, path) {
var currentModule = path.slice(-1)[0];
return new Promise(function(resolve, reject) {
Expand Down Expand Up @@ -217,7 +250,15 @@ function define(name, deps, factory) {
var deferred = pendingModule;
if(name === null && !deferred) {
throw new Error('Unexpected define!');
} else if (name === null || deferred && deferred.name === name) {
}

if(deps.length === 0 && factory.length > 0) {
var wrapped = wrapCommonJS(name || deferred.name, factory);
deps = wrapped.deps;
factory = wrapped.factory;
}

if (name === null || deferred && deferred.name === name) {
var module = _require(deps, factory, deferred.reject, deferred.path);
deferred.resolve(module);
} else {
Expand Down
22 changes: 22 additions & 0 deletions test/require.spec.js
Expand Up @@ -134,6 +134,28 @@ describe("module locals", function () {
done();
});
});

it("CommonJS support", function(done) {
require.config({
config: {
'A-cjs': 'A',
'B-cjs': 'B'
}
});
define('A-cjs', function(require, module, exports) {
exports.a = module.config();
exports.b = require('B-cjs');
});

define('B-cjs', function(require, module) {
module.exports = module.config();
});

require(['A-cjs'], function(A) {
expect(A).toEqual({a: 'A', b: 'B'});
done();
});
});
});

describe("plugin support", function () {
Expand Down

0 comments on commit d4977c3

Please sign in to comment.