diff --git a/node/server.js b/node/server.js index 422bbe120..c0d6ce6ad 100644 --- a/node/server.js +++ b/node/server.js @@ -114,7 +114,15 @@ async.waterfall([ gracefulShutdown(); }); + //serve minified files + app.get('/minified/:filename', minify.minifyJS); + //serve static files + app.get('/static/js/require-kernel.js', function (req, res, next) { + res.header("Content-Type","application/javascript; charset: utf-8"); + res.write(minify.requireDefinition()); + res.end(); + }); app.get('/static/*', function(req, res) { var filePath = path.normalize(__dirname + "/.." + diff --git a/node/utils/Minify.js b/node/utils/Minify.js index 016739b1a..348f25373 100644 --- a/node/utils/Minify.js +++ b/node/utils/Minify.js @@ -29,6 +29,7 @@ var pro = require("uglify-js").uglify; var path = require('path'); var Buffer = require('buffer').Buffer; var gzip = require('gzip'); +var RequireKernel = require('require-kernel'); var server = require('../server'); var os = require('os'); @@ -173,22 +174,31 @@ function _handle(req, res, jsFilename, jsFiles) { var type = item.match(/INCLUDE_[A-Z]+/g)[0].substr("INCLUDE_".length); //read the included file - fs.readFile(ROOT_DIR + filename, "utf-8", function(err, data) + var shortFilename = filename.replace(/^..\/static\/js\//, ''); + if (shortFilename == 'require-kernel.js') { + // the kernel isn’t actually on the file system. + handleEmbed(null, requireDefinition()); + } else { + fs.readFile(ROOT_DIR + filename, "utf-8", handleEmbed); + } + function handleEmbed(err, data) { if(ERR(err, callback)) return; if(type == "JS") { - var shortFilename = filename.replace(/^..\/static\/js\//, ''); - embeds[filename] = compressJS([isolateJS(data, shortFilename)]); + if (shortFilename == 'require-kernel.js') { + embeds[filename] = compressJS([data]); + } else { + embeds[filename] = compressJS([isolateJS(data, shortFilename)]); + } } else { embeds[filename] = compressCSS([data]); } - callback(); - }); + } }, function(err) { if(ERR(err, callback)) return; @@ -294,21 +304,35 @@ function _handle(req, res, jsFilename, jsFiles) { } } +exports.requireDefinition = requireDefinition; +function requireDefinition() { + return 'var require = ' + RequireKernel.kernelSource + ';\n'; +} + function tarCode(filesInOrder, files, write) { for(var i = 0, ii = filesInOrder.length; i < filesInOrder.length; i++) { var filename = filesInOrder[i]; write("\n\n\n/*** File: static/js/" + filename + " ***/\n\n\n"); write(isolateJS(files[filename], filename)); } + + for(var i = 0, ii = filesInOrder.length; i < filesInOrder.length; i++) { + var filename = filesInOrder[i]; + write('require(' + JSON.stringify('/' + filename.replace(/^\/+/, '')) + ');\n'); + } } // Wrap the following code in a self executing function and assign exports to // global. This is a first step towards removing symbols from the global scope. // exports is global and require is a function that returns global. function isolateJS(code, filename) { - return '(function (exports, require) {' - + code + '\n' - + '}(function () {return this}(), (function (path) {return (function () {return this}())})));\n'; + var srcPath = JSON.stringify('/' + filename); + var srcPathAbbv = JSON.stringify('/' + filename.replace(/\.js$/, '')); + return 'require.define({' + + srcPath + ': ' + + 'function (require, exports, module) {' + code + '}' + + (srcPath != srcPathAbbv ? '\n,' + srcPathAbbv + ': null' : '') + + '});\n'; } function compressJS(values) diff --git a/package.json b/package.json index efc89fd7a..6567e5324 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "name": "Robin Buse" } ], "dependencies" : { + "require-kernel" : "1.0.0", "socket.io" : "0.8.7", "ueberDB" : "0.1.3", "async" : "0.1.15", diff --git a/static/js/ace.js b/static/js/ace.js index 78a79d7ec..8ecfbc0cb 100644 --- a/static/js/ace.js +++ b/static/js/ace.js @@ -216,25 +216,41 @@ function Ace2Editor() return {embeded: embededFiles, remote: remoteFiles}; } + function pushRequireScriptTo(buffer) { + /* Folling is for packaging regular expression. */ + /* $$INCLUDE_JS("../static/js/require-kernel.js"); */ + var KERNEL_SOURCE = '../static/js/require-kernel.js'; + if (Ace2Editor.EMBEDED && Ace2Editor.EMBEDED[KERNEL_SOURCE]) { + buffer.push(' + -
diff --git a/static/timeslider.html b/static/timeslider.html index a416562e8..4e85047e3 100644 --- a/static/timeslider.html +++ b/static/timeslider.html @@ -9,6 +9,7 @@ + @@ -19,8 +20,6 @@ //