Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1c0a74d
Use middleware to specify Server name in header.
cweider Jan 17, 2012
c3acdbe
Minify uses the stardard middleware interface.
cweider Jan 17, 2012
53549b7
Use constants and CWD-independent paths for resource directories.
cweider Jan 17, 2012
b175ad5
Use uncompressed jQuery.
cweider Jan 16, 2012
548c527
Move exposure of `Ace2Editor` closer to the code that requires it.
cweider Jan 16, 2012
50d3040
Change calculation of `userAgent`.
cweider Jan 16, 2012
0f7e6fe
Remove individual settings in `pad2.js` from global.
cweider Jan 16, 2012
6bbc32a
Default plugin should not fail if clientVars is not defined.
cweider Jan 18, 2012
003c2a5
Remove dependency on a global socket and address `pad.socket` instead.
cweider Jan 17, 2012
2b5d7a0
All files export their public interface if `exports` is available.
cweider Jan 16, 2012
9e16b9a
Always use the JS assets processed by Minify.
cweider Jan 17, 2012
ab02135
Factor out taring process.
cweider Jan 17, 2012
fc68a25
Isolate all files in a closure.
cweider Jan 16, 2012
da95016
Add a fake `require` to go with the fake `exports`.
cweider Jan 16, 2012
8a0d6c6
Add missing dependency for `timeslider.js`.
cweider Jan 16, 2012
72d29b1
Inject the pad dependency into chat.
cweider Jan 16, 2012
7f98116
Implement `require` for most modules.
cweider Jan 16, 2012
fa2a6e9
Implement `require` of dependencies for all `pad_*` modules.
cweider Jan 16, 2012
86f31c7
Implement `require` for for plugin module.
cweider Jan 16, 2012
1b89e7e
Implement `require` in HTML pages.
cweider Jan 16, 2012
8bf0e7c
Allow dashes in included file names.
cweider Jan 16, 2012
71dfced
Provide filename to isolation function.
cweider Jan 16, 2012
62e0a8f
Use require-kernel for require functionality.
cweider Jan 16, 2012
9253f99
Remove guards surrounding export steps.
cweider Jan 16, 2012
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
node_modules
settings.json
static/js/jquery.min.js
static/js/jquery.js
APIKEY.txt
bin/abiword.exe
bin/node.exe
Expand Down
6 changes: 3 additions & 3 deletions bin/installDeps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,16 @@ npm install || {
echo "Ensure jQuery is downloaded and up to date..."
DOWNLOAD_JQUERY="true"
NEEDED_VERSION="1.7"
if [ -f "static/js/jquery.min.js" ]; then
VERSION=$(cat static/js/jquery.min.js | head -n 3 | grep -o "v[0-9].[0-9]");
if [ -f "static/js/jquery.js" ]; then
VERSION=$(cat static/js/jquery.js | head -n 3 | grep -o "v[0-9].[0-9]");

if [ ${VERSION#v} = $NEEDED_VERSION ]; then
DOWNLOAD_JQUERY="false"
fi
fi

if [ $DOWNLOAD_JQUERY = "true" ]; then
curl -lo static/js/jquery.min.js http://code.jquery.com/jquery-$NEEDED_VERSION.min.js || exit 1
curl -lo static/js/jquery.js http://code.jquery.com/jquery-$NEEDED_VERSION.js || exit 1
fi

#Remove all minified data to force node creating it new
Expand Down
43 changes: 15 additions & 28 deletions node/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,12 @@ async.waterfall([
{
//create server
var app = express.createServer();


app.use(function (req, res, next) {
res.header("Server", serverName);
next();
});

//load modules that needs a initalized db
readOnlyManager = require("./db/ReadOnlyManager");
exporthtml = require("./utils/ExportHtml");
Expand Down Expand Up @@ -109,31 +114,24 @@ 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)
{
res.header("Server", serverName);
var filePath = path.normalize(__dirname + "/.." +
req.url.replace(/\.\./g, '').split("?")[0]);
res.sendfile(filePath, { maxAge: exports.maxAge });
});

//serve minified files
app.get('/minified/:id', function(req, res, next)
{
res.header("Server", serverName);

var id = req.params.id;

if(id == "pad.js" || id == "timeslider.js")
{
minify.minifyJS(req,res,id);
}
else
{
next();
}
});
app.get('/minified/:filename', minify.minifyJS);

//checks for padAccess
function hasPadAccess(req, res, callback)
Expand Down Expand Up @@ -178,8 +176,6 @@ async.waterfall([
//serve read only pad
app.get('/ro/:id', function(req, res)
{
res.header("Server", serverName);

var html;
var padId;
var pad;
Expand Down Expand Up @@ -264,7 +260,6 @@ async.waterfall([
app.get('/p/:pad', function(req, res, next)
{
goToPad(req, res, function() {
res.header("Server", serverName);
var filePath = path.normalize(__dirname + "/../static/pad.html");
res.sendfile(filePath, { maxAge: exports.maxAge });
});
Expand All @@ -274,7 +269,6 @@ async.waterfall([
app.get('/p/:pad/timeslider', function(req, res, next)
{
goToPad(req, res, function() {
res.header("Server", serverName);
var filePath = path.normalize(__dirname + "/../static/timeslider.html");
res.sendfile(filePath, { maxAge: exports.maxAge });
});
Expand All @@ -301,7 +295,6 @@ async.waterfall([
}

res.header("Access-Control-Allow-Origin", "*");
res.header("Server", serverName);

hasPadAccess(req, res, function()
{
Expand All @@ -321,8 +314,6 @@ async.waterfall([
return;
}

res.header("Server", serverName);

hasPadAccess(req, res, function()
{
importHandler.doImport(req, res, req.params.pad);
Expand All @@ -335,7 +326,6 @@ async.waterfall([
//This is for making an api call, collecting all post information and passing it to the apiHandler
var apiCaller = function(req, res, fields)
{
res.header("Server", serverName);
res.header("Content-Type", "application/json; charset=utf-8");

apiLogger.info("REQUEST, " + req.params.func + ", " + JSON.stringify(fields));
Expand Down Expand Up @@ -396,23 +386,20 @@ async.waterfall([
//serve index.html under /
app.get('/', function(req, res)
{
res.header("Server", serverName);
var filePath = path.normalize(__dirname + "/../static/index.html");
res.sendfile(filePath, { maxAge: exports.maxAge });
});

//serve robots.txt
app.get('/robots.txt', function(req, res)
{
res.header("Server", serverName);
var filePath = path.normalize(__dirname + "/../static/robots.txt");
res.sendfile(filePath, { maxAge: exports.maxAge });
});

//serve favicon.ico
app.get('/favicon.ico', function(req, res)
{
res.header("Server", serverName);
var filePath = path.normalize(__dirname + "/../static/custom/favicon.ico");
res.sendfile(filePath, { maxAge: exports.maxAge }, function(err)
{
Expand Down
109 changes: 78 additions & 31 deletions node/utils/Minify.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,14 @@ 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');

var ROOT_DIR = path.normalize(__dirname + "/../" );
var JS_DIR = ROOT_DIR + '../static/js/';
var CSS_DIR = ROOT_DIR + '../static/css/';
var CACHE_DIR = ROOT_DIR + '../var/';
var TAR_PATH = path.join(__dirname, 'tar.json');
var tar = JSON.parse(fs.readFileSync(TAR_PATH, 'utf8'));

Expand All @@ -40,20 +45,31 @@ var tar = JSON.parse(fs.readFileSync(TAR_PATH, 'utf8'));
* @param req the Express request
* @param res the Express response
*/
exports.minifyJS = function(req, res, jsFilename)
exports.minifyJS = function(req, res, next)
{
res.header("Content-Type","text/javascript");
var jsFilename = req.params['filename'];

//choose the js files we need
var jsFiles = undefined;
if (Object.prototype.hasOwnProperty.call(tar, jsFilename)) {
jsFiles = tar[jsFilename];
_handle(req, res, jsFilename, jsFiles)
} else {
throw new Error("there is no profile for creating " + name);
// Not in tar list, but try anyways, if it fails, pass to `next`.
jsFiles = [jsFilename];
fs.stat(JS_DIR + jsFilename, function (error, stats) {
if (error || !stats.isFile()) {
next();
} else {
_handle(req, res, jsFilename, jsFiles);
}
});
}
}

var rootPath = path.normalize(__dirname + "/../../" );

function _handle(req, res, jsFilename, jsFiles) {
res.header("Content-Type","text/javascript");

//minifying is enabled
if(settings.minify)
{
Expand All @@ -65,7 +81,7 @@ exports.minifyJS = function(req, res, jsFilename)
//find out the highest modification date
function(callback)
{
var folders2check = [rootPath + "static/css", rootPath + "static/js"];
var folders2check = [CSS_DIR, JS_DIR];

//go trough this two folders
async.forEach(folders2check, function(path, callback)
Expand Down Expand Up @@ -104,7 +120,7 @@ exports.minifyJS = function(req, res, jsFilename)
function(callback)
{
//check the modification time of the minified js
fs.stat(rootPath + "var/minified_" + jsFilename, function(err, stats)
fs.stat(CACHE_DIR + "/minified_" + jsFilename, function(err, stats)
{
if(err && err.code != "ENOENT")
{
Expand All @@ -129,7 +145,7 @@ exports.minifyJS = function(req, res, jsFilename)
{
async.forEach(jsFiles, function (item, callback)
{
fs.readFile(rootPath + "static/js/" + item, "utf-8", function(err, data)
fs.readFile(JS_DIR + item, "utf-8", function(err, data)
{
if(ERR(err, callback)) return;
fileValues[item] = data;
Expand All @@ -147,7 +163,7 @@ exports.minifyJS = function(req, res, jsFilename)
return;
}

var founds = fileValues["ace.js"].match(/\$\$INCLUDE_[a-zA-Z_]+\([a-zA-Z0-9.\/_"]+\)/gi);
var founds = fileValues["ace.js"].match(/\$\$INCLUDE_[a-zA-Z_]+\([a-zA-Z0-9.\/_"-]+\)/gi);

//go trough all includes
async.forEach(founds, function (item, callback)
Expand All @@ -158,21 +174,31 @@ exports.minifyJS = function(req, res, jsFilename)
var type = item.match(/INCLUDE_[A-Z]+/g)[0].substr("INCLUDE_".length);

//read the included file
fs.readFile(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")
{
embeds[filename] = compressJS([data]);
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;
Expand All @@ -193,21 +219,16 @@ exports.minifyJS = function(req, res, jsFilename)
//put all together and write it into a file
function(callback)
{
//put all javascript files in an array
var values = [];
for(var i in jsFiles)
{
values.push(fileValues[jsFiles[i]]);
}

//minify all javascript files to one
var values = [];
tarCode(jsFiles, fileValues, function (content) {values.push(content)});
var result = compressJS(values);

async.parallel([
//write the results plain in a file
function(callback)
{
fs.writeFile(rootPath + "var/minified_" + jsFilename, result, "utf8", callback);
fs.writeFile(CACHE_DIR + "minified_" + jsFilename, result, "utf8", callback);
},
//write the results compressed in a file
function(callback)
Expand All @@ -221,7 +242,7 @@ exports.minifyJS = function(req, res, jsFilename)

if(ERR(err, callback)) return;

fs.writeFile(rootPath + "var/minified_" + jsFilename + ".gz", compressedResult, callback);
fs.writeFile(CACHE_DIR + "minified_" + jsFilename + ".gz", compressedResult, callback);
});
}
//skip this step on windows
Expand All @@ -245,12 +266,12 @@ exports.minifyJS = function(req, res, jsFilename)
var pathStr;
if(gzipSupport && os.type().indexOf("Windows") == -1)
{
pathStr = path.normalize(rootPath + "var/minified_" + jsFilename + ".gz");
pathStr = path.normalize(CACHE_DIR + "minified_" + jsFilename + ".gz");
res.header('Content-Encoding', 'gzip');
}
else
{
pathStr = path.normalize(rootPath + "var/minified_" + jsFilename );
pathStr = path.normalize(CACHE_DIR + "minified_" + jsFilename );
}

res.sendfile(pathStr, { maxAge: server.maxAge });
Expand All @@ -264,7 +285,7 @@ exports.minifyJS = function(req, res, jsFilename)
//read all js files
async.forEach(jsFiles, function (item, callback)
{
fs.readFile(rootPath + "static/js/" + item, "utf-8", function(err, data)
fs.readFile(JS_DIR + item, "utf-8", function(err, data)
{
if(ERR(err, callback)) return;
fileValues[item] = data;
Expand All @@ -276,18 +297,44 @@ exports.minifyJS = function(req, res, jsFilename)
{
if(ERR(err)) return;

for(var i=0;i<jsFiles.length;i++)
{
var fileName = jsFiles[i];
res.write("\n\n\n/*** File: static/js/" + fileName + " ***/\n\n\n");
res.write(fileValues[fileName]);
}
tarCode(jsFiles, fileValues, function (content) {res.write(content)});

res.end();
});
}
}

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) {
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)
{
var complete = values.join("\n");
Expand Down
Loading