Skip to content

Commit

Permalink
Added express-js
Browse files Browse the repository at this point in the history
  • Loading branch information
masylum committed Dec 16, 2010
1 parent c1c6835 commit 3acf084
Show file tree
Hide file tree
Showing 12 changed files with 216 additions and 30 deletions.
6 changes: 4 additions & 2 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Transsiberian is really opinionated but it includes all you need to start a node

* MongoDB models using [Mongolia](https://github.com/masylum/mongolia)
* Basic user creation and authentification
* Translations with [express-dialect](https://github.com/masylum/express-dialect) _on port 3001 by default_
* CSS useful mixins, reset, and basic styles
* Basic helpers
* Flash messages
Expand All @@ -26,15 +27,16 @@ Copy and paste:
npm install mongodb
npm install connect-auth
npm install express
npm install express-dialect
npm install log4js
npm install mail
npm install mongolia

## TODO (coming soon!)

I'm working on some of these features:
I'm working to add some of these features:

* Translations with [express-dialect](https://github.com/masylum/express-dialect)
* Publish to npm so its easy to install and mantain
* Web sockets with [Socket.IO-node](https://github.com/LearnBoost/Socket.IO-node)
* File uploader
* Asset manager
30 changes: 15 additions & 15 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
require.paths.unshift(__dirname + '/vendor/');

var Db = require('mongodb/db').Db,
Server = require('mongodb/connection').Server,
express_dialect = require('express-dialect'),
express = require('express');

require('ext');
Expand All @@ -20,6 +19,20 @@ db.open(function () {
return require('./models/mongo/' + thing)(db, app);
};

// express-dialect
(function () {
express_dialect({
app: app,
path: __dirname + '/locales',
title: 'Transsiberian',
store: 'mongodb',
database: 'translations'
}, function (error, dialect) {
app.dynamicViewHelpers.t = dialect.dynamic_helpers.t;
dialect.app.listen(3001);
});
}());

// Configuration
require('./config/config')(app, express);
require('./config/environments')(app, express);
Expand All @@ -34,17 +47,4 @@ db.open(function () {
require('./controllers/users')(app);

app.listen(3000);

// express-dialect
//(function (app) {
// require('express-dialect')({
// app: app,
// path: __dirname + '/locales',
// title: 'Transsiberian',
// store: 'mongodb',
// database: 'translations'
// }, function (error, dialect) {
// dialect.app.listen(3001);
// });
//}(app));
});
4 changes: 3 additions & 1 deletion config/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ module.exports = function (app, express) {
}));

app.use(express.methodOverride());
app.use(express.compiler({src: 'public/stylesheets', dest: 'public', enable: ['less'], autocompile: true}));

// Get rid of that if one day they merge my pull request to "autocompile"
app.use(require('../ext/connect/compiler.js')({src: 'public/stylesheets', dest: 'public', enable: ['less'], autocompile: true}));
app.use(express.staticProvider('public'));

app.use(auth([require('../models/auth')(app).formStrategy()]));
Expand Down
8 changes: 5 additions & 3 deletions controllers/public.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
module.exports = function (app) {
var render = function (options) {
return Object.merge({
title: GLOBAL.APP_NAME,
return {
locals: Object.merge({
title: GLOBAL.APP_NAME
}),
layout: 'public'
}, options);
};
};

app.get('', function (req, res) {
Expand Down
8 changes: 5 additions & 3 deletions controllers/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ module.exports = function (app) {
},

render = function (options) {
return Object.merge({
title: GLOBAL.APP_NAME,
return {
locals: Object.merge({
title: GLOBAL.APP_NAME
}, options),
layout: 'private'
}, options);
};
};

app.get('/users/welcome', authenticate, function (req, res) {
Expand Down
182 changes: 182 additions & 0 deletions ext/connect/compiler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
/*!
* Ext JS Connect
* Copyright(c) 2010 Sencha Inc.
* MIT Licensed
*/

/**
* Module dependencies.
*/

var fs = require('fs'),
path = require('path'),
url = require('url');

/**
* Require cache.
*
* @type Object
*/

var cache = {};

/**
* Setup compiler.
*
* Options:
*
* - `src` Source directory, defaults to **CWD**.
* - `dest` Destination directory, defaults `src`.
* - `enable` Array of enabled compilers.
* - `autocompile` Autocompile the files every request. Ideal for development.
* - `compress` Get rid of the white spaces and comments.
*
* Compilers:
*
* - `sass` Compiles cass to css
* - `less` Compiles less to css
* - `coffeescript` Compiles coffee to js
*
* @param {Object} options
* @api public
*/

exports = module.exports = function compiler(options){
options = options || {};

var srcDir = process.connectEnv.compilerSrc || options.src || process.cwd(),
destDir = process.connectEnv.compilerDest || options.dest || srcDir,
autocompile = options.autocompile || false,
will_compress = options.compress || false,
enable = options.enable;

if (!enable || enable.length === 0) {
throw new Error('compiler\'s "enable" option is not set, nothing will be compiled.');
}

return function compiler(req, res, next){
if (req.method !== 'GET') return next();
var pathname = url.parse(req.url).pathname;
for (var i = 0, len = enable.length; i < len; ++i) {
var name = enable[i],
compiler = compilers[name];
if (compiler.match.test(pathname)) {
var src = (srcDir + pathname).replace(compiler.match, compiler.ext),
dest = destDir + pathname;

// Compare mtimes
fs.stat(src, function(err, srcStats){
if (err) {
if (err.errno === process.ENOENT) {
next();
} else {
next(err);
}
} else {
fs.stat(dest, function(err, destStats){
if (err) {
// Oh snap! it does not exist, compile it
if (err.errno === process.ENOENT) {
compile();
} else {
next(err);
}
} else {
// Source has changed, compile it
if (srcStats.mtime > destStats.mtime || autocompile) {
compile();
} else {
// Defer file serving
next();
}
}
});
}
});

// Compile to the destination
function compile() {
fs.readFile(src, 'utf8', function(err, str){
if (err) {
next(err);
} else {
compiler.compile(str, function(err, str){
if (err) {
next(err);
} else {
if(will_compress) {
str = compress(str);
}
fs.writeFile(dest, str, 'utf8', function(err){
next(err);
});
}
});
}
});
}

// Compress str
function compress(str) {
str = str.replace(/[\n\r]*/mg,''); // blank lines
str = str.replace(/\/\*.*?\*\//g,' '); // comments
str = str.replace(/ +/g,' '); // more than one blank space
str = str.replace(/: /g,':'); // usual spaces
str = str.replace(/; /g,';'); // usual spaces
str = str.replace(/ ?{ ?/g,'{'); // usual spaces
return str;
}

return;
}
}
next();
};
};

/**
* Bundled compilers:
*
* - [sass](http://github.com/visionmedia/sass.js) to _css_
* - [less](http://github.com/cloudhead/less.js) to _css_
* - [coffee](http://github.com/jashkenas/coffee-script) to _js_
*/

var compilers = exports.compilers = {
sass: {
match: /\.css$/,
ext: '.sass',
compile: function(str, fn){
var sass = cache.sass || (cache.sass = require('sass'));
try {
fn(null, sass.render(str));
} catch (err) {
fn(err);
}
}
},
less: {
match: /\.css$/,
ext: '.less',
compile: function(str, fn){
var less = cache.less || (cache.less = require('less'));
try {
less.render(str, fn);
} catch (err) {
fn(err);
}
}
},
coffeescript: {
match: /\.js$/,
ext: '.coffee',
compile: function(str, fn){
var coffee = cache.coffee || (cache.coffee = require('coffee-script'));
try {
fn(null, coffee.compile(str));
} catch (err) {
fn(err);
}
}
}
};
2 changes: 1 addition & 1 deletion helpers/dynamic.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module.exports = {
return function () {
var messages = req.flash();

return res.partial('partials/flash_messages', {
return res.partial('flash_messages', {
object: messages,
as: 'types',
locals: {hasFlashMessages: Object.keys(messages).length},
Expand Down
1 change: 0 additions & 1 deletion locales/en.js

This file was deleted.

1 change: 0 additions & 1 deletion locales/es.js

This file was deleted.

1 change: 0 additions & 1 deletion vendor/connect
Submodule connect deleted from ae018a
1 change: 0 additions & 1 deletion vendor/express
Submodule express deleted from a5a016
2 changes: 1 addition & 1 deletion views/public/index.jade
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
h2 Welcome to the nodejs boilerplate!

a(href: '/public/users/new') Create a new user
a(href: '/public/users/new')= t("Create a new user")

0 comments on commit 3acf084

Please sign in to comment.