Skip to content

Commit

Permalink
Try to follow the AMD and CommonJS Modules/1.1 specification more clo…
Browse files Browse the repository at this point in the history
…sely

- implement the define.amd property
- implement "require", "exports" and "module" dependencies from CommonJS Modules/1.1

- todo: search for require() functions in the factory function body and add those to the module dependencies for packaging.
  • Loading branch information
Arian committed Aug 8, 2011
1 parent 870e2c7 commit 8a079f9
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
7 changes: 6 additions & 1 deletion Packager.php
Expand Up @@ -8,6 +8,7 @@ class Packager {
protected $_alias = array();
protected $_modules = array();
protected $_files = array();
protected $_skip = array('require', 'exports', 'module');

public function __construct(){
$this->_baseurl = dirname(__FILE__);
Expand All @@ -24,7 +25,9 @@ public function addAlias($alias, $url){
}

public function req(array $ids, $relativeTo = null){
foreach ($ids as &$id) $this->_req($relativeTo ? Path::resolve($relativeTo, $id) : $id);
foreach ($ids as $id) if (!in_array($id, $this->_skip)){
$this->_req($relativeTo ? Path::resolve($relativeTo, $id) : $id);
}
return $this;
}

Expand Down Expand Up @@ -57,6 +60,8 @@ protected function _req($id){
'amd' => $amd
);

// TODO: analyze factory function body for require()

/*
define(function(){
define('ID', function(){
Expand Down
41 changes: 31 additions & 10 deletions loader.js
Expand Up @@ -4,7 +4,7 @@ var define, require;
(function(){//define + require, default basic implementation (subset) of the commonJS AMD spec

var slice = Array.prototype.slice;
var relToAbs = function(name, current){
var resolve = function(name, current){
if (name.indexOf('./') == 0) return current.slice(0, current.lastIndexOf('/') + 1) + name.slice(2);
if (name.indexOf('../') == 0){
var up = name.split('../').length,
Expand All @@ -16,21 +16,42 @@ var relToAbs = function(name, current){

var modules = {}, loaded = {};

if (!define) define = function(id, dependencies_, factory_){
var dependencies = (factory_) ? dependencies_ : [];
for (var i = dependencies.length; i--;) dependencies[i] = relToAbs(dependencies[i], id);
modules[id] = {dependencies: dependencies, factory: factory_ || dependencies_};
};
if (!define){
define = function(id, dependencies_, factory_){
var factory = factory_ || dependencies_;
var deps = (factory_) ? dependencies_ : ['require', 'exports', 'module'].slice(0, factory.length);
for (var i = deps.length; i--;) deps[i] = resolve(deps[i], id);
modules[id] = {
id: id,
deps: deps,
factory: factory,
exports: {},
require: function(ids, callback){
return require(ids, callback, id);
}
};
};
define.amd = {};
}

if (!require) require = function(ids, callback_){
if (!require) require = function(ids, callback_, _relativeTo){
if (typeof ids == 'string') ids = [ids];
if (_relativeTo) for (var k = ids.length; k--;) ids[k] = resolve(ids[k], _relativeTo);
var modules_ = [];
for (var i = 0; i < ids.length; i++){
var id = ids[i], module = modules[id];
if (module && loaded[id] == null){
var factory = module.factory, ideps = module.dependencies, dependencies = [];
for (var j = 0; j < ideps.length; j++) dependencies.push(require(ideps[j]));
loaded[id] = (typeof factory == 'function') ? factory.apply(this, dependencies) : factory;
var factory = module.factory, ideps = module.deps, deps = [], exports;
for (var j = 0; j < ideps.length; j++){
var idep = ideps[j], dep;
if (idep == 'require') dep = module.require;
else if (idep == 'exports') dep = exports = module.exports;
else if (idep == 'module') dep = module;
else dep = require(ideps[j]);
deps.push(dep);
}
loaded[id] = (typeof factory == 'function') ? factory.apply(this, deps) : factory;
if (loaded[id] == null) loaded[id] = exports;
}
modules_.push(loaded[id]);
}
Expand Down

0 comments on commit 8a079f9

Please sign in to comment.