raptor
Version:
RaptorJS provides an AMD module loader that works in Node, Rhino and the web browser. It also includes various sub-modules to support building optimized web applications.
259 lines (209 loc) • 7.87 kB
JavaScript
var NODE = 'node',
RHINO = 'rhino';
exports.load = function(raptorEnv) {
"use strict";
var raptor = require('./raptor.js');
var oldExists = raptor.exists,
oldRequire = raptor.require,
nonExistent = {},
resolvers = [],
DEFINE_PROPS = 1,
moduleSearchPathMappings = {};
var _resolve = function(id) {
for (var i=0, len=resolvers.length; i<len; i++) {
var resolver = resolvers[i];
resolver(id);
if (oldExists(id)) {
break;
}
}
};
raptor.resolvers = resolvers;
raptor.require = function(id) {
if (raptor.exists(id)) {
return oldRequire(id);
}
else {
throw new Error('Module not found with ID "' + id + '"');
}
};
raptor.exists = function(id) {
if (nonExistent[id]) {
return false;
}
var exists = oldExists(id);
if (!exists) {
_resolve(id);
exists = oldExists(id);
}
if (!exists) {
nonExistent[id] = true;
}
return exists;
};
var createReq = function(module) {
return function(id, baseName) {
var raptorId = raptor.normalize(id, baseName);
if (raptorId !== '' && raptor.exists(raptorId)) {
return raptor.require(raptorId);
}
else {
return module.require(id);
}
};
};
raptor.createDefine = function(module) {
var require = createReq(module);
var define = function() {
return raptor._define(arguments, createReq(module));
};
define.require = require;
return raptor.extend(define, raptor.props[DEFINE_PROPS]);
};
raptor._extendDefine = function(define, module) {
var require = createReq(module);
define.require = require;
return raptor.extend(define, raptor.props[DEFINE_PROPS]);
};
raptor.setModuleSearchPath = function(moduleName, searchPathEntry) {
moduleSearchPathMappings[moduleName] = searchPathEntry;
};
raptor.getModuleSearchPath = function(moduleName) {
return moduleSearchPathMappings[moduleName];
};
function _require(path, env) {
if (env && env !== raptorEnv) {
return;
}
var m = require(path);
if (m.load) {
m.load(raptor);
}
}
function _raptorRequire(moduleId, env) {
if (env && env !== raptorEnv) {
return;
}
raptor.require(moduleId);
}
_require('./ecma/es6/es6.js');
_require('./raptor_node.js', NODE);
_require('./raptor_rhino.js', RHINO);
_require('./objects/objects.js');
_require('./arrays/arrays.js');
_require('./strings/strings.js');
_require('./strings/StringBuilder.js');
_require('./regexp/regexp.js');
_require('./json/parse/parse.js');
_require('./json/stringify/stringify.js');
_require('./debug/debug.js');
_require('./listeners/listeners.js');
_require('./config/config.js');
_require('./ecma/JSON/JSON.js', RHINO); //Patch older versions of Rhino that don't include the JSON object
_require('./java/java_rhino.js', RHINO);
_require('./console/console_node.js', NODE);
_require('./console/console_rhino.js', RHINO);
_require('./stacktraces/stacktraces_node.js', NODE);
_require('./stacktraces/stacktraces_rhino.js', RHINO);
_require('./logging/logging_stubs.js');
_require('./logging/Logger.js');
_require('./logging/ConsoleAppender.js');
_require('./logging/logging.js');
_require('./files/FileMixins.js');
_require('./files/File_node.js', NODE);
_require('./files/File_rhino.js', RHINO);
_require('./files/files.js');
_require('./files/files_node.js', NODE);
_require('./files/files_rhino.js', RHINO);
// JavaScript runtime module
_require('./runtime/runtime.js');
_require('./runtime/runtime_node.js', NODE);
_require('./runtime/runtime_rhino.js', RHINO);
//Packaging module
_require('./packaging/ExtensionCollection.js');
_require('./packaging/PackageManifest.js');
_require('./packaging/PackageLoader.js');
_require('./packaging/packaging_server.js');
_require('./packaging/packaging_rhino.js', RHINO);
//Resources module
_require('./resources/DirSearchPathEntry.js');
_require('./resources/FileResource.js');
_require('./resources/MissingResource.js');
_require('./resources/Resource.js');
_require('./resources/SearchPathEntry.js');
_require('./resources/SearchPath.js');
_require('./resources/resources.js');
_require('./resources/resources_server.js');
_require('./resources/RhinoResourceAdapter.js', RHINO);
_require('./resources/RhinoSearchPathEntryAdapter.js', RHINO);
_require('./resources/RhinoResMgrSearchPathEntryAdapter.js', RHINO);
/*
Preload all of the modules.
NOTE: This must be done before custom resolvers are added since the
custom resolvers depend on many of the bootstrap modules
*/
_raptorRequire('raptor/objects');
_raptorRequire('raptor/arrays');
_raptorRequire('raptor/strings');
_raptorRequire('raptor/regexp');
_raptorRequire('raptor/json/parse');
_raptorRequire('raptor/json/stringify');
_raptorRequire('raptor/debug');
_raptorRequire('raptor/listeners');
_raptorRequire('raptor/config');
_raptorRequire('raptor/java', RHINO);
_raptorRequire('raptor/stacktraces');
_raptorRequire('raptor/logging');
_raptorRequire('raptor/files');
_raptorRequire('raptor/runtime');
_raptorRequire('raptor/packaging');
_raptorRequire('raptor/resources');
var packaging = raptor.require('raptor/packaging');
packaging.enableExtension(raptorEnv);
packaging.enableExtension('server');
var resources = raptor.require('raptor/resources');
function isUpperCase(c) {
return c.toLowerCase() !== c;
}
/*
* Add a module resource resolver. That looks for a module
* with a corresponding JavaScript resource:
*
*/
resolvers.push(function(id) {
var firstPartEnd = id.indexOf('/');
var moduleName = firstPartEnd === -1 ? id : id.substring(0, firstPartEnd);
var searchPath = raptor.getModuleSearchPath(moduleName);
var lastSlash = id.lastIndexOf('/');
if (lastSlash !== -1 && isUpperCase(id.charAt(lastSlash+1))) {
// See if the the parent module has a package.json that we should load first
var parentManifest = packaging.getModuleManifest(id.substring(0, lastSlash));
if (parentManifest) {
var serverLoad = parentManifest.getRaptorProp('serverLoad');
if (serverLoad) {
packaging.load(parentManifest);
if (oldExists(id)) {
// Loading the package resulted in the class being found...
// our work here is done
return;
}
}
}
}
var resourcePath = '/' + id.replace(/\./g, '/') + '.js';
var resource = resources.findResourcePreferredSearchPath(resourcePath, searchPath);
if (resource && resource.exists()) {
raptor.require('raptor/runtime').evaluateResource(resource);
}
});
/*
* Add a module package resolver
*/
resolvers.push(function(id) {
var manifest = packaging.getModuleManifest(id);
if (manifest) {
packaging.load(manifest);
}
});
return raptor;
};