more support for relative module ids

This commit is contained in:
Fabian Jakobs 2011-11-09 16:48:35 +01:00
commit 0b69b42ade
4 changed files with 60 additions and 44 deletions

View file

@ -7,8 +7,29 @@ var window = {
console: console
};
var require = function(id) {
console.log("require " + id)
var normalizeModule = function(parentId, moduleName) {
// normalize plugin requires
if (moduleName.indexOf("!") !== -1) {
var chunks = moduleName.split("!");
return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);
}
// normalize relative requires
if (moduleName.charAt(0) == ".") {
var base = parentId.split("/").slice(0, -1).join("/");
var moduleName = base + "/" + moduleName;
while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
var previous = moduleName;
var moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
}
}
return moduleName;
};
var require = function(parentId, id) {
var id = normalizeModule(parentId, id);
var module = require.modules[id];
if (module) {
if (!module.initialized) {
@ -23,9 +44,8 @@ var require = function(id) {
path = chunks.join("/") + ".js";
require.id = id;
// console.log("require " + path + " " + id)
importScripts(path);
return require(id);
return require(parentId, id);
};
require.modules = {};
@ -38,7 +58,7 @@ var define = function(id, deps, factory) {
factory = id;
id = require.id;
}
if (id.indexOf("text!") === 0)
return;
@ -47,7 +67,7 @@ var define = function(id, deps, factory) {
var module = {
exports: {}
};
var returnExports = factory(require, module.exports, module);
var returnExports = factory(require.bind(null, id), module.exports, module);
if (returnExports)
module.exports = returnExports;
return module;
@ -61,8 +81,8 @@ function initBaseUrls(topLevelNamespaces) {
function initSender() {
var EventEmitter = require("ace/lib/event_emitter").EventEmitter;
var oop = require("ace/lib/oop");
var EventEmitter = require(null, "ace/lib/event_emitter").EventEmitter;
var oop = require(null, "ace/lib/oop");
var Sender = function() {};
@ -101,9 +121,9 @@ onmessage = function(e) {
}
else if (msg.init) {
initBaseUrls(msg.tlns);
require("ace/lib/fixoldbrowsers");
require(null, "ace/lib/fixoldbrowsers");
sender = initSender();
var clazz = require(msg.module)[msg.classname];
var clazz = require(null, msg.module)[msg.classname];
main = new clazz(sender);
}
else if (msg.event && sender) {

View file

@ -44,7 +44,7 @@ var WorkerClient = function(topLevelNamespaces, packagedJs, module, classname) {
this.changeListener = this.changeListener.bind(this);
if (require.packaged) {
if (window.require.packaged) {
var base = this.$guessBasePath();
var worker = this.$worker = new Worker(base + packagedJs);
}