node-barefoot
Advanced tools
Comparing version 0.0.7 to 0.0.8
# Changes | ||
## 0.0.8 | ||
* Introduction of [Debug](https://github.com/visionmedia/debug) for code flow analysis. Thx @mweibel :) | ||
## 0.0.7 | ||
@@ -3,0 +6,0 @@ * Introduced promises for rendering `Views` using [Q](https://github.com/kriskowal/q) |
@@ -14,10 +14,10 @@ /** Class: Barefoot.APIAdapter | ||
* | ||
* Thats the point where APIAdapter joins the game: It binds a bunch of API | ||
* resources (actually just independant callback functions, each identified with | ||
* Thats the point where APIAdapter joins the game: It binds a bunch of API | ||
* resources (actually just independent callback functions, each identified with | ||
* a unique URI) and wraps them into Express.JS routes to make them available to | ||
* the clients. During startup (<Barefoot.Start.Server>), backbones sync | ||
* function is automatically replaced with barefoots one to ensure that local | ||
* API calls on the server are routed directly to the callbacks instead going | ||
* a detour via HTTP/AJAX. For further details, have a look into APIAdapters | ||
* server mixin: <Barefoot.APIAdapter.Server>. | ||
* the clients. During startup (<Barefoot.Start.Server>), Backbone's sync | ||
* function is automatically replaced with the one of Barefoot to ensure that | ||
* local API calls on the server are routed directly to the callbacks instead | ||
* going a detour via HTTP/AJAX. For further details, have a look into | ||
* APIAdapters server mixin: <Barefoot.APIAdapter.Server>. | ||
* | ||
@@ -24,0 +24,0 @@ * You will probably touch the APIAdapter consciously only once: In your app |
@@ -5,3 +5,3 @@ /** Mixin: Barefoot.CookieAdapter.Client | ||
* | ||
* Thie client <CookieAdapter> reads and writes the cookies directly from the | ||
* The client <CookieAdapter> reads and writes the cookies directly from the | ||
* browsers memory. | ||
@@ -8,0 +8,0 @@ * |
/** Mixin: Barefoot.Router.Client | ||
* Client specific code for the <Barefoot.Router>. The complete view object | ||
* restoration when receiving prerendered UI's from the server is handled in the | ||
* <start> method. | ||
* restoration when receiving pre-rendered UI's from the server is handled in | ||
* the <start> method. | ||
* | ||
@@ -29,10 +29,10 @@ * See also: | ||
* | ||
* It handles mainly the restoration of the view objects after receiving an | ||
* It handles mainly the restoration of the view objects after receiving an | ||
* already rendered UI from the server. This process consists of the following | ||
* steps: | ||
* | ||
* * If present, an instance of the main view is created and all events are | ||
* * If present, an instance of the main view is created and all events are | ||
* bound to the DOM elements. | ||
* * The Barefoot.Router.Client.render method gets replaced temporarly to avoid | ||
* rerendering already available content to the DOM. The replacement method | ||
* * The Barefoot.Router.Client.render method gets replaced temporarily to avoid | ||
* re-rendering already available content to the DOM. The replacement method | ||
* only ensures that the necessary events get bound to the DOM. | ||
@@ -80,3 +80,3 @@ * | ||
// Temporarly replace the normal render function to allow restoring the | ||
// Temporarily replace the normal render function to allow restoring the | ||
// necessary view object. In case any router function calls navigate, that | ||
@@ -105,3 +105,3 @@ // one gets replaced to. | ||
* | ||
* Paramteres: | ||
* Parameters: | ||
* (Barefoot.View) view - <Barefoot.View> to render into the DOM. | ||
@@ -108,0 +108,0 @@ * |
@@ -16,7 +16,7 @@ /** Mixin: Barefoot.Start.Client | ||
* (Barefoot.Router) Router - A <Barefoot.Router> object. Important: This is | ||
* is not an instance of the router, it is the | ||
* is not an instance of the router, it is the | ||
* "plain" object which can be used for running | ||
* "new Router(...)". | ||
* (Object) startOptions - This object literal is passed to the router when | ||
* initalizing it. | ||
* initializing it. | ||
*/ | ||
@@ -23,0 +23,0 @@ function start(Router, APIAdapter, startOptions) { |
@@ -14,5 +14,5 @@ /** Mixin: Barefoot.View.Client | ||
* Binds all defined events of this view. In addition, all present subviews | ||
* are iterated and a recusive call on delegateEventsOnSubviews is done. | ||
* are iterated and a recursive call on delegateEventsOnSubviews is done. | ||
* | ||
* This method is a core part of the view object restoration when receiving | ||
* This method is a core part of the view object restoration when receiving | ||
* an already rendered UI from the server. | ||
@@ -19,0 +19,0 @@ */ |
/** Class: Barefoot.Collection | ||
* For the moment, barefoots collection does not introduce any new | ||
* For the moment, the Barefoot collection does not introduce any new | ||
* functionalities to Backbones collection. But to keep things straight when | ||
* buildung your application with barefoot, <Barefoot.Collection> is also | ||
* building your application with barefoot, <Barefoot.Collection> is also | ||
* available :) | ||
@@ -6,0 +6,0 @@ * |
@@ -28,3 +28,3 @@ /** Class: Barefoot.DataStore | ||
* In Depth: | ||
* You may wonder how the DataStore accomplishs the data transfer from the | ||
* You may wonder how the DataStore accomplishes the data transfer from the | ||
* server to the client. | ||
@@ -52,6 +52,6 @@ * | ||
* with the given identifier. This information is needed when serializing the | ||
* DataStore for transfering data to the client. | ||
* DataStore for transferring data to the client. | ||
* | ||
* You will not be able to serialize a store containing models which were not | ||
* registrered before! | ||
* registered before! | ||
* | ||
@@ -58,0 +58,0 @@ * Important: |
/** Class: Barefoot.Model | ||
* For the moment, barefoots model does not introduce any new | ||
* For the moment, the Barefoot model does not introduce any new | ||
* functionalities to Backbones model. But to keep things straight when | ||
* buildung your application with barefoot, <Barefoot.Model> is also | ||
* building your application with barefoot, <Barefoot.Model> is also | ||
* available :) | ||
@@ -6,0 +6,0 @@ * |
/** Class: Barefoot.Router | ||
* The barefoot router extends the default backbone router by applying | ||
* environment specific mixins to it | ||
* The barefoot router extends the default backbone router by applying | ||
* environment specific mixins to it | ||
* | ||
@@ -32,9 +32,9 @@ * For further information, please refer to the regarding environment specific | ||
* > }); | ||
* The following sections discuss specific aspects/differences of this code | ||
* The following sections discuss specific aspects / differences of this code | ||
* snippet in comparison to a common Backbone application. | ||
* | ||
* Introduction of Barefoot.Router.render: | ||
* If you want barefoot to render a view for you, do *never* call the | ||
* If you want barefoot to render a view for you, do *never* call the | ||
* <Barefoot.View> render function on yourself. Make sure you use the render | ||
* function which is provided from <Barefoot.Router> (In the example: | ||
* function which is provided from <Barefoot.Router> (In the example: | ||
* "this.render(new HomeView());"). | ||
@@ -45,3 +45,3 @@ * This way ensures that the view is rendered properly on the server but also | ||
* The Main View: | ||
* You have the option to define a "main view". Understand this as a | ||
* You have the option to define a "main view". Understand this as a | ||
* <Barefoot.View> object which contains all common view objects like | ||
@@ -48,0 +48,0 @@ * navigation bars, footer etc. |
@@ -7,3 +7,3 @@ /** Mixin: Barefoot.APIAdapter.Server | ||
* | ||
* The creation of the Express.JS routes is done on initalization. The mapping | ||
* The creation of the Express.JS routes is done on initialization. The mapping | ||
* of server-side API calls is executed during runtime. | ||
@@ -37,3 +37,4 @@ * | ||
, 'read': 'get' | ||
}; | ||
} | ||
, debug = require('debug')('barefoot:server:apiadapter'); | ||
@@ -78,2 +79,4 @@ | ||
, errorHandler, callbacks) { | ||
debug('processing callbacks (url: `%s`, namedRouteParameters: `%s`,' + | ||
' data: `%j`)', req.url, namedRouteParameters, data); | ||
@@ -156,3 +159,7 @@ var callbackScope = { | ||
function createExpressJsCallback(successHandler, errorHandler, callbacks) { | ||
debug('creating express.js callback'); | ||
return function handler(req, res) { | ||
debug('express.js callback called for url `%s`', req.url); | ||
processCallbacks( | ||
@@ -207,2 +214,4 @@ _.values(req.params) | ||
function createExpressJsRoute(url, callbacks, expressJsMethod, app) { | ||
debug('creating express.js route for url `%s`', url); | ||
var self = this | ||
@@ -316,3 +325,3 @@ , expressJsHandler = createExpressJsCallback( | ||
* contained in apiRoutes. If a route is found, the routes regex is used to | ||
* extract any parameters from the url. These parameters are contained in the | ||
* extract any parameters from the URL. These parameters are contained in the | ||
* params argument afterwards. | ||
@@ -338,2 +347,4 @@ * | ||
function matchRoute(method, url, apiRoutes, params) { | ||
debug('matching route method %s with url %s', method, url); | ||
var routes = apiRoutes[method] | ||
@@ -353,2 +364,3 @@ , matchedRoute; | ||
} | ||
debug('matched route `%j`', matchedRoute); | ||
@@ -375,2 +387,4 @@ return matchedRoute; | ||
function addRoute(method, url, callbacks) { | ||
debug('adding route (method: `%s`, url: `%s`)', method, url); | ||
var urlParamKeys = [] | ||
@@ -421,7 +435,7 @@ , regexp = urlRegexp(url, urlParamKeys, true, true); | ||
* | ||
* It tries to match the given url with a registered route for the given | ||
* It tries to match the given URL with a registered route for the given | ||
* httpMethod. If found, the route callback(s) is/are invoked using | ||
* <processCallbacks>. | ||
* | ||
* If the data argument contains any information, that stuf gets passed to the | ||
* If the data argument contains any information, that stuff gets passed to the | ||
* callback. If the options argument contains a success or error element, these | ||
@@ -446,2 +460,5 @@ * functions are called by the callback in case of success or failure. | ||
function dispatchLocalApiCall(httpMethod, url, data, options) { | ||
debug('dispatching local api call (httpMethod: `%s`, url: `%s`)' | ||
, httpMethod, url); | ||
var self = this | ||
@@ -514,3 +531,3 @@ , params = {} | ||
* Instead going the detour over an AJAX request, this implementation of sync | ||
* calls the API callback directly by resolving the models url with the present | ||
* calls the API callback directly by resolving the models URL with the present | ||
* apiRoutes. | ||
@@ -523,3 +540,3 @@ * | ||
* (String) method - A method (create, update, patch, delete or read) which | ||
* will be used to resolve the models url properly. | ||
* will be used to resolve the models URL properly. | ||
* (Backbone.Model) model - The model which wants to be synced. Can also be | ||
@@ -536,2 +553,5 @@ * an instance of Backbone.Collection. | ||
debug('syncing (method: `%s`, httpMethod: `%s`, url: `%s`, model: `%j`)' | ||
, method, httpMethod, url, model); | ||
if(_.isUndefined(url)) { | ||
@@ -538,0 +558,0 @@ throw new Error('No url present for syncing!', model, options); |
@@ -17,3 +17,4 @@ /** Mixin: Barefoot.CookieAdapter.Server | ||
*/ | ||
var _ = require('underscore'); | ||
var _ = require('underscore') | ||
, debug = require('debug')('barefoot:server:cookieadapter'); | ||
@@ -31,2 +32,4 @@ | ||
function get(key) { | ||
debug('getting `%s`', key); | ||
var value; | ||
@@ -48,2 +51,4 @@ if(this.cookies && _.has(this.cookies, key)) { | ||
function set(key, value) { | ||
debug('setting `%s` to `%j`', key, value); | ||
if(_.isUndefined(this.cookies)) { | ||
@@ -50,0 +55,0 @@ this.cookies = {}; |
@@ -11,3 +11,4 @@ /** Mixin: Barefoot.DataStore.Server | ||
*/ | ||
var _ = require('underscore'); | ||
var _ = require('underscore') | ||
, debug = require('debug')('barefoot:server:datastore'); | ||
@@ -19,4 +20,4 @@ /** Function: toJSON | ||
* Beside the actual data, this object contains meta information to accomplish | ||
* a proper deserialisation with <Barefoot.DataStore.Client.parse>. This means, | ||
* the DataStore can completly restore its content from a given serialized | ||
* a proper deserialization with <Barefoot.DataStore.Client.parse>. This means, | ||
* the DataStore can completely restore its content from a given serialized | ||
* version of itself, including correct model and collection types. | ||
@@ -56,2 +57,4 @@ * | ||
debug('to json `%j`', serializedStore); | ||
return serializedStore; | ||
@@ -58,0 +61,0 @@ } |
@@ -8,3 +8,5 @@ /** Mixin: Barefoot.Router.Server | ||
var _ = require('underscore') | ||
, debug = require('debug')('barefoot:server:router') | ||
, cheerio = require('cheerio') | ||
, winston = require('winston') | ||
, Q = require('q') | ||
@@ -14,4 +16,11 @@ , CookieAdapter | ||
/** Function: toString | ||
* String representation of this module. | ||
*/ | ||
function toString() { | ||
return 'Router.Server'; | ||
} | ||
/** Function: preInitialize | ||
* This function is called before any intialization or constructor of the | ||
* This function is called before any initialization or constructor of the | ||
* <Barefoot.Router> is executed. It expects that the passed options object | ||
@@ -21,3 +30,3 @@ * contains the following elements: | ||
* app - An Express.JS app | ||
* layoutTemplate - The minimal HTML skeleton to render the applictation into. | ||
* layoutTemplate - The minimal HTML skeleton to render the application into. | ||
* Example: "<html><head></head><body></body></html>" | ||
@@ -34,2 +43,4 @@ * startExpressApp - A callback function which initiates the actual startup of | ||
function preInitialize(options) { | ||
debug('pre initialize'); | ||
this.app = options.app; | ||
@@ -43,3 +54,3 @@ this.layoutTemplate = options.layoutTemplate; | ||
/** Function: route | ||
* This replacemente for the route function of Backbone.Router ensures that each | ||
* This replacements for the route function of Backbone.Router ensures that each | ||
* route defined in the router is added to the Express.JS app. | ||
@@ -60,2 +71,4 @@ * | ||
function route(routeUri) { | ||
debug('route `%s`', routeUri); | ||
var self = this | ||
@@ -70,2 +83,4 @@ , Barefoot = require('../')(); | ||
return self.app.get('/' + routeUri, function(req, res) { | ||
debug('request to `/%s`', routeUri); | ||
var callback = self[self.routes[routeUri]] | ||
@@ -114,2 +129,4 @@ , cookieAdapter = new CookieAdapter({ cookies: req.cookies }) | ||
function navigate(routeUri) { | ||
debug('redirecting to `%s`', routeUri); | ||
this.res.redirect(routeUri); | ||
@@ -128,3 +145,3 @@ } | ||
* <Barefoot.DataStore> is checked. If present, its content gets serialized into | ||
* a script DOM element so the client can proberly deserialize its state | ||
* a script DOM element so the client can properly deserialize its state | ||
* afterwards. See <Barefoot.Router.Client.start> for the deserialization code. | ||
@@ -142,2 +159,4 @@ * | ||
function render(view) { | ||
debug('render'); | ||
var self = this | ||
@@ -147,2 +166,4 @@ , $; | ||
function initDOM() { | ||
debug('init DOM'); | ||
$ = cheerio.load(self.layoutTemplate); | ||
@@ -152,2 +173,4 @@ } | ||
function renderMainView() { | ||
debug('render main view'); | ||
var promise; | ||
@@ -166,2 +189,4 @@ | ||
function renderView() { | ||
debug('render view'); | ||
view.$ = $; | ||
@@ -174,2 +199,4 @@ view.$el = view.selectDOMElement($); | ||
function serializeDataStore() { | ||
debug('serialize data store'); | ||
if(!_.isUndefined(self.dataStore) && | ||
@@ -186,6 +213,15 @@ _.keys(self.dataStore.registeredModels).length > 0) { | ||
function writeHTTPResponse() { | ||
debug('write http response'); | ||
self.res.send($.html()); | ||
} | ||
function writeHTTPError() { | ||
function writeHTTPError(err) { | ||
winston.log('error', 'Uncatched HTTP Error', { | ||
source: toString() | ||
, err: err.toString() || err | ||
, stack: err.stack || undefined | ||
}); | ||
debug('write http error'); | ||
self.res.send(500); | ||
@@ -205,2 +241,4 @@ } | ||
function start() { | ||
debug('start'); | ||
this.startExpressApp(this.app); | ||
@@ -207,0 +245,0 @@ } |
@@ -9,7 +9,8 @@ /** Mixin: Barefoot.Start.Server | ||
, fs = require('fs') | ||
, browserify = require('browserify-middleware'); | ||
, browserify = require('browserify-middleware') | ||
, debug = require('debug')('barefoot:server:start'); | ||
/** PrivateFunction: getServerOnlyFiles | ||
* Returns an array with absolute paths to the files contianed in the server | ||
* subfolder. | ||
* Returns an array with absolute paths to the files contained in the server | ||
* sub folder. | ||
* | ||
@@ -30,3 +31,3 @@ * Returns: | ||
/** PrivateFunction: prepareBrowserify | ||
* Adds the browserify middleware the the given express.js app. | ||
* Adds the Browserify middleware the the given express.js app. | ||
* | ||
@@ -62,3 +63,3 @@ * Parameters: | ||
* On start on the server, this function creates an <APIAdapter> if apiRoutes | ||
* are present in the startOptions. Further the actual <Barefoot.Router> is | ||
* are present in the startOptions. Further the actual <Barefoot.Router> is | ||
* created an started using <Barefoot.Router.Server.start>. | ||
@@ -71,9 +72,11 @@ * | ||
* (Barefoot.Router) Router - A <Barefoot.Router> object. Important: This is | ||
* is not an instance of the router, it is the | ||
* is not an instance of the router, it is the | ||
* "plain" object which can be used for running | ||
* "new Router(...)". | ||
* (Object) startOptions - This object literal is passed to the router when | ||
* initalizing it. | ||
* initializing it. | ||
*/ | ||
function start(Router, APIAdapter, startOptions) { | ||
debug('Starting server'); | ||
if(!_.has(startOptions, 'app')) { | ||
@@ -80,0 +83,0 @@ throw new Error('Missing "app" property in "startOptions"! Please ' + |
/** Mixin: Barefoot.View.Server | ||
* Enhances the <Barefoot.View> class with server specific code fragmends. | ||
* Enhances the <Barefoot.View> class with server specific code fragments. | ||
* "Enhancing" is quite exaggerate: Actually it ensures that a few Backbone | ||
* methods are replaced with an empty implementation since barefoot do not want | ||
* them to query any DOM elements when rendering a view on the server. Following | ||
* methods are overwridden: | ||
* methods are overridden: | ||
* | ||
@@ -8,0 +8,0 @@ * * setElement(element) |
@@ -43,3 +43,3 @@ /** Class: Barefoot.Util | ||
/** Function: loadMixins | ||
* Since Barefoot is runnable on server and client, this function returns | ||
* Since Barefoot is runnable on server and client, this function returns | ||
* environment specific code read from the "server" and "client" folder and | ||
@@ -46,0 +46,0 @@ * returns the needed code fragments. |
@@ -31,3 +31,3 @@ /** Class: Barefoot.View | ||
* > }); | ||
* The following sections discuss specific aspects/differences of this code | ||
* The following sections discuss specific aspects / differences of this code | ||
* snippet in comparison to a common Backbone application. | ||
@@ -44,3 +44,3 @@ * | ||
* Subviews/Nested Views: | ||
* You may be used to create your views subviews directly in the render | ||
* You may be used to create the subviews of your views directly in the render | ||
* function and call their render function there. | ||
@@ -53,3 +53,3 @@ * | ||
* * Barefoot can render views on its own on the server and the browser client | ||
* * You do not take care of destroying your view hiearchy when rendering a new | ||
* * You do not take care of destroying your view hierarchy when rendering a new | ||
* view. Barefoot will handle this for you. (No more Zombies) | ||
@@ -60,3 +60,3 @@ * | ||
* Barefoot looks for a beforeRender or afterRender function and executes them | ||
* before/after rendering your view automatically. | ||
* before / after rendering your view automatically. | ||
* | ||
@@ -87,4 +87,4 @@ * If beforeRender or afterRender is invoked, a "resolve" and "rejected" | ||
* | ||
* These technique is widley known as "Promises". Barefoot uses the popular | ||
* implementaion <Q at https://github.com/kriskowal/q> implementation of the | ||
* These technique is widely known as "Promises". Barefoot uses the popular | ||
* implementation <Q at https://github.com/kriskowal/q> implementation of the | ||
* <Promises/A+ at http://promises-aplus.github.io/promises-spec/> spec. | ||
@@ -95,10 +95,17 @@ * | ||
* Please be aware you are not overwriting the <renderSubviews> and <render> | ||
* method. This would break barefoots rendering mechanisms on the server and | ||
* client. | ||
* method. This would break the rendering mechanisms of Barefoot on the server | ||
* and client. | ||
*/ | ||
var _ = require('underscore') | ||
, Backbone = require('backbone') | ||
, Q = require('q'); | ||
, Q = require('q') | ||
, util = require('./util'); | ||
if(util.getEnvironment() === 'server') { | ||
var debug = require('debug')('barefoot:view'); | ||
} else { | ||
var debug = function() {}; | ||
} | ||
/** Function: addSubview | ||
@@ -112,2 +119,3 @@ * Adds a Barefoot.View as subview of this view. Sets the parentView property | ||
function addSubview(subview) { | ||
debug('add subview `%s`', this.toString()); | ||
if(_.isUndefined(this.subviews)) { | ||
@@ -126,6 +134,7 @@ this.subviews = []; | ||
* Parameters: | ||
* (Barefoot.View) subview - A <Barefoot.View> sbuview to remove from this | ||
* (Barefoot.View) subview - A <Barefoot.View> subview to remove from this | ||
* view | ||
*/ | ||
function removeSubview(subview) { | ||
debug('remove subview `%s`', this.toString()); | ||
subview.close(); | ||
@@ -149,2 +158,3 @@ | ||
function renderSubviews() { | ||
debug('render subviews `%s`', this.toString()); | ||
var self = this | ||
@@ -167,4 +177,4 @@ , $ = self.$; | ||
* If you define a beforeRender or afterRender function in your <View> | ||
* implementation, that function will be called before/after the actual | ||
* rendering takes/took place. | ||
* implementation, that function will be called before / after the actual | ||
* rendering takes / took place. | ||
* | ||
@@ -181,5 +191,7 @@ * Attention: | ||
function render() { | ||
debug('render `%s`', this.toString()); | ||
var self = this; | ||
function invokeBeforeRender() { | ||
debug('invoke before render `%s`', self.toString()); | ||
var deferBeforeRender = Q.defer() | ||
@@ -199,2 +211,3 @@ , resolve = deferBeforeRender.resolve | ||
function invokeRender() { | ||
debug('invoke render `%s`', self.toString()); | ||
if(!_.isUndefined(self.renderView)) { | ||
@@ -206,2 +219,3 @@ self.renderView(); | ||
function invokeAfterRender() { | ||
debug('invoke after render `%s`', self.toString()); | ||
var deferAfterRender = Q.defer() | ||
@@ -237,2 +251,3 @@ , resolve = deferAfterRender.resolve | ||
function selectDOMElement($) { | ||
debug('select dom element `%s`', this.toString()); | ||
var domElement; | ||
@@ -239,0 +254,0 @@ |
{ | ||
"name": "node-barefoot" | ||
, "version": "0.0.7" | ||
, "version": "0.0.8" | ||
, "description": "Barefoot makes code sharing between browser and server reality. Write your application once and run it on both ends of the wire." | ||
@@ -24,2 +24,3 @@ , "keywords": [ | ||
, "q": "~0.9.3" | ||
, "debug": "~0.7.2" | ||
} | ||
@@ -26,0 +27,0 @@ , "devDependencies": { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
733224
5533
9
+ Addeddebug@~0.7.2
+ Addeddebug@0.7.4(transitive)