zetan v0.0.37
Zeta Negroni: My greatest hits (In progress)
Start
var zetan = require('zetan');
var port = process.env.PORT || 5690;
var options = {
debug:true
};
zetan.serve(port,options);
Or
just plug the middleware
var express = require('express');
var app = express();
var zetan = require('zetan');
var port = 5678;
app.use(zetan({
debug:true
}));
app.listen(port,function () {
// c global object is a tracer logger
c.log('api running on http://localhost:' + port);
});
APPs
an app is a module in the "apps" directory. it handle server and client side javascript. templating and css (less).
http://localhost:5678/
# will load the app in the apps/index directory
http://localhost:5678/friends
# will load the app in the apps/friends directory
Example structure:
- index.js
- apps - index - index.js - template.html - friends - index.js - template.html - aboutus - template.html
apps have to export a "render" method, a "middleware" method or both.
// file: apps/index/index.js
var q = require('q');
// first param is data setted by zetan
// the promise reponse will be render in the "template.html" if this exists
// if not it just repond the object as plain json
exports.render = function(data,zetan){
// data is sent by the middleware (custom or default zetan middleware)
// data.req and data.res are sent
var deferred = q.defer();
deferred.resolve({a:'hola'});
return deferred.promise;
// it has to respond a promise
}
// if middleware method exists it's used to set data to be passed to render method
exports.middleware = function(req,res,render){
var data = {
text:'this is passed to the render method',
params:req.query
}
render(data);
}
template.html
template.html file is a Mustache template. it receive data sent by the render method. it used triple curly braces notation: {{{var}}}
if template exists alone inside the app module, zetan will return the static html as response.
partial loader
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<!-- partial function can be used within templates -->
{{{#partial}}}partials/header.html{{{/partial}}}
</body>
</html>
client.js
a client.js can be included in the app directory
apps/index/client.js
and call it from the template like this:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="{{{appName}}}}/client.js"></script>
...
it is browserified by zetan before response
client.less
a styles.less can be included in the app directory
apps/index/styles.less
and called it from the template like this:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="{{{appName}}}}/styles.css">
...
this will be automatically parsde by less process before response
C logger
// c global object added by zetan
c.log('use this instead console.log');
Development mode
--dev argument enables development mode. This avoid minify and and cache some things. Also enable livereload for less, templates and client.js
node index.js --dev
for nodemon
nodemon index.js --dev --ignore client.js
API
in order to create an API resource create a directory inside an api directory.
// File: api/user/index.js
var q = require('q');
var db = require('db');
exports.alias = {
me:{
get:function(data){
// receive data formatted by zetan
// it can be overriten using a middleware method
// it has to return a promise
return db.find('users',{id:data.auth.id});
}
}
}
exports.get = function(data){
if(data.id){
return db.find('users',{ id:data.id });
}else{
// when is not and "id" zetan has an automatic pagination behaviour
// the promise has to return an array
return db.find('users');
}
}
// override default zetan behaviour including pagination
// exports.middleware = function(req,res,method){
// method({
// ... data to be passed to method or alias
// })
// }
Static Files
just create a "public" directory.
Browser
zetan client for browserify
var zetan = require('zetan/browser');
or you can use the preconfigured api client including the script from:
<script src="http://localhost:5678/api/v1/client.js"></script>
Helpers
helpers are attached to "req" object, "zetan" object and can be loaded as modules
from any module:
var emailHelper = require('zetan/helpers/email');
emailHelper.send({...})
from an app
exports.render = function(data,zetan){
zetan.helpers.email.send({...})
}
or
exports.middleware = function(req,res,render){
req.zetan.helpers.email.send({...})
// or
req.helpers.email.send({...})
}
Mandrill
var mandrilAdapter = require('zetan/adapters/mandrill');
var emailHelper = require('zetan/helpers/email');
emailHelper.default(mandrilAdapter({
apiKey:'o-Opoeml5Jl62sKlr8dxsg'
}));
emailHelper.send({
"html": '<strong>Hi</strong>',
"from_name":"Marcelo Zapaia",
"subject": "Hi there",
"from_email": "noreply@zapaia.com",
"to": [{ "email": "friend@email.com" }]
}).then(function(response){
c.log('email sent');
}).catch(function(){
c.log(':(');
})
Gulp
Browserify
// gulpfile.js
var gulpHelper = require('zetan/helpers/gulp');
gulp.task('js',function(){
return gulpHelper.browserify({
watch:true, // use watchify
src:'./src/index.js', // it can be a glob pattern like './src/*.js'
cb:function(bundle){
bundle.pipe(gulp.dest('./js/dist'))
}
})
});
LESS
// process files those names end with "*.public.less"
// in the "apps" directory and place these in "public/dist/apps/{APPNAME}/{FILENAME}.css"
gulp.task('css',gulpHelper.less());
Nodemon
// run index.js with nodemon and add an "--dev" argument
gulp.task('serve',gulpHelper.serve());
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago