forked from tastejs/todomvc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request tastejs#573 from stephenplusplus/bbm
backbone_marionette_require code style + spec comp.
- Loading branch information
Showing
29 changed files
with
4,611 additions
and
3,472 deletions.
There are no files selected for viewing
6 changes: 0 additions & 6 deletions
6
labs/dependency-examples/backbone_marionette_require/.jshintignore
This file was deleted.
Oops, something went wrong.
44 changes: 22 additions & 22 deletions
44
labs/dependency-examples/backbone_marionette_require/app.build.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,31 @@ | ||
({ | ||
baseUrl: "js/", | ||
mainConfigFile: 'js/main.js', | ||
out: "js/main.built.js", | ||
include : 'main', | ||
baseUrl: "js/", | ||
mainConfigFile: 'js/main.js', | ||
out: "js/main.built.js", | ||
include : 'main', | ||
|
||
optimize: 'uglify', | ||
optimize: 'uglify', | ||
|
||
uglify: { | ||
toplevel: true, | ||
ascii_only: true, | ||
beautify: false, | ||
max_line_length: 1000 | ||
}, | ||
uglify: { | ||
toplevel: true, | ||
ascii_only: true, | ||
beautify: false, | ||
max_line_length: 1000 | ||
}, | ||
|
||
inlineText: true, | ||
useStrict: false, | ||
inlineText: true, | ||
useStrict: false, | ||
|
||
skipPragmas: false, | ||
skipModuleInsertion: false, | ||
stubModules: ['text'], | ||
optimizeAllPluginResources: false, | ||
findNestedDependencies: false, | ||
removeCombined: false, | ||
skipPragmas: false, | ||
skipModuleInsertion: false, | ||
stubModules: ['text'], | ||
optimizeAllPluginResources: false, | ||
findNestedDependencies: false, | ||
removeCombined: false, | ||
|
||
fileExclusionRegExp: /^\./, | ||
fileExclusionRegExp: /^\./, | ||
|
||
preserveLicenseComments: true, | ||
preserveLicenseComments: true, | ||
|
||
logLevel: 0 | ||
logLevel: 0 | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
220 changes: 220 additions & 0 deletions
220
...ckbone_marionette_require/bower_components/backbone.localStorage/backbone.localStorage.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
/** | ||
* Backbone localStorage Adapter | ||
* Version 1.1.4 | ||
* | ||
* https://github.com/jeromegn/Backbone.localStorage | ||
*/ | ||
(function (root, factory) { | ||
if (typeof exports === 'object') { | ||
module.exports = factory(require("underscore"), require("backbone")); | ||
} else if (typeof define === "function" && define.amd) { | ||
// AMD. Register as an anonymous module. | ||
define(["underscore","backbone"], function(_, Backbone) { | ||
// Use global variables if the locals are undefined. | ||
return factory(_ || root._, Backbone || root.Backbone); | ||
}); | ||
} else { | ||
// RequireJS isn't being used. Assume underscore and backbone are loaded in <script> tags | ||
factory(_, Backbone); | ||
} | ||
}(this, function(_, Backbone) { | ||
// A simple module to replace `Backbone.sync` with *localStorage*-based | ||
// persistence. Models are given GUIDS, and saved into a JSON object. Simple | ||
// as that. | ||
|
||
// Hold reference to Underscore.js and Backbone.js in the closure in order | ||
// to make things work even if they are removed from the global namespace | ||
|
||
// Generate four random hex digits. | ||
function S4() { | ||
return (((1+Math.random())*0x10000)|0).toString(16).substring(1); | ||
}; | ||
|
||
// Generate a pseudo-GUID by concatenating random hexadecimal. | ||
function guid() { | ||
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); | ||
}; | ||
|
||
// Our Store is represented by a single JS object in *localStorage*. Create it | ||
// with a meaningful name, like the name you'd give a table. | ||
// window.Store is deprectated, use Backbone.LocalStorage instead | ||
Backbone.LocalStorage = window.Store = function(name) { | ||
if( !this.localStorage ) { | ||
throw "Backbone.localStorage: Environment does not support localStorage." | ||
} | ||
this.name = name; | ||
var store = this.localStorage().getItem(this.name); | ||
this.records = (store && store.split(",")) || []; | ||
}; | ||
|
||
_.extend(Backbone.LocalStorage.prototype, { | ||
|
||
// Save the current state of the **Store** to *localStorage*. | ||
save: function() { | ||
this.localStorage().setItem(this.name, this.records.join(",")); | ||
}, | ||
|
||
// Add a model, giving it a (hopefully)-unique GUID, if it doesn't already | ||
// have an id of it's own. | ||
create: function(model) { | ||
if (!model.id) { | ||
model.id = guid(); | ||
model.set(model.idAttribute, model.id); | ||
} | ||
this.localStorage().setItem(this.name+"-"+model.id, JSON.stringify(model)); | ||
this.records.push(model.id.toString()); | ||
this.save(); | ||
return this.find(model); | ||
}, | ||
|
||
// Update a model by replacing its copy in `this.data`. | ||
update: function(model) { | ||
this.localStorage().setItem(this.name+"-"+model.id, JSON.stringify(model)); | ||
if (!_.include(this.records, model.id.toString())) | ||
this.records.push(model.id.toString()); this.save(); | ||
return this.find(model); | ||
}, | ||
|
||
// Retrieve a model from `this.data` by id. | ||
find: function(model) { | ||
return this.jsonData(this.localStorage().getItem(this.name+"-"+model.id)); | ||
}, | ||
|
||
// Return the array of all models currently in storage. | ||
findAll: function() { | ||
// Lodash removed _#chain in v1.0.0-rc.1 | ||
return (_.chain || _)(this.records) | ||
.map(function(id){ | ||
return this.jsonData(this.localStorage().getItem(this.name+"-"+id)); | ||
}, this) | ||
.compact() | ||
.value(); | ||
}, | ||
|
||
// Delete a model from `this.data`, returning it. | ||
destroy: function(model) { | ||
if (model.isNew()) | ||
return false | ||
this.localStorage().removeItem(this.name+"-"+model.id); | ||
this.records = _.reject(this.records, function(id){ | ||
return id === model.id.toString(); | ||
}); | ||
this.save(); | ||
return model; | ||
}, | ||
|
||
localStorage: function() { | ||
return localStorage; | ||
}, | ||
|
||
// fix for "illegal access" error on Android when JSON.parse is passed null | ||
jsonData: function (data) { | ||
return data && JSON.parse(data); | ||
}, | ||
|
||
// Clear localStorage for specific collection. | ||
_clear: function() { | ||
var local = this.localStorage(), | ||
itemRe = new RegExp("^" + this.name + "-"); | ||
|
||
// Remove id-tracking item (e.g., "foo"). | ||
local.removeItem(this.name); | ||
|
||
// Lodash removed _#chain in v1.0.0-rc.1 | ||
// Match all data items (e.g., "foo-ID") and remove. | ||
(_.chain || _)(local).keys() | ||
.filter(function (k) { return itemRe.test(k); }) | ||
.each(function (k) { local.removeItem(k); }); | ||
}, | ||
|
||
// Size of localStorage. | ||
_storageSize: function() { | ||
return this.localStorage().length; | ||
} | ||
|
||
}); | ||
|
||
// localSync delegate to the model or collection's | ||
// *localStorage* property, which should be an instance of `Store`. | ||
// window.Store.sync and Backbone.localSync is deprecated, use Backbone.LocalStorage.sync instead | ||
Backbone.LocalStorage.sync = window.Store.sync = Backbone.localSync = function(method, model, options) { | ||
var store = model.localStorage || model.collection.localStorage; | ||
|
||
var resp, errorMessage, syncDfd = Backbone.$.Deferred && Backbone.$.Deferred(); //If $ is having Deferred - use it. | ||
|
||
try { | ||
|
||
switch (method) { | ||
case "read": | ||
resp = model.id != undefined ? store.find(model) : store.findAll(); | ||
break; | ||
case "create": | ||
resp = store.create(model); | ||
break; | ||
case "update": | ||
resp = store.update(model); | ||
break; | ||
case "delete": | ||
resp = store.destroy(model); | ||
break; | ||
} | ||
|
||
} catch(error) { | ||
if (error.code === DOMException.QUOTA_EXCEEDED_ERR && store._storageSize() === 0) | ||
errorMessage = "Private browsing is unsupported"; | ||
else | ||
errorMessage = error.message; | ||
} | ||
|
||
if (resp) { | ||
if (options && options.success) { | ||
if (Backbone.VERSION === "0.9.10") { | ||
options.success(model, resp, options); | ||
} else { | ||
options.success(resp); | ||
} | ||
} | ||
if (syncDfd) { | ||
syncDfd.resolve(resp); | ||
} | ||
|
||
} else { | ||
errorMessage = errorMessage ? errorMessage | ||
: "Record Not Found"; | ||
|
||
if (options && options.error) | ||
if (Backbone.VERSION === "0.9.10") { | ||
options.error(model, errorMessage, options); | ||
} else { | ||
options.error(errorMessage); | ||
} | ||
|
||
if (syncDfd) | ||
syncDfd.reject(errorMessage); | ||
} | ||
|
||
// add compatibility with $.ajax | ||
// always execute callback for success and error | ||
if (options && options.complete) options.complete(resp); | ||
|
||
return syncDfd && syncDfd.promise(); | ||
}; | ||
|
||
Backbone.ajaxSync = Backbone.sync; | ||
|
||
Backbone.getSyncMethod = function(model) { | ||
if(model.localStorage || (model.collection && model.collection.localStorage)) { | ||
return Backbone.localSync; | ||
} | ||
|
||
return Backbone.ajaxSync; | ||
}; | ||
|
||
// Override 'Backbone.sync' to default to localSync, | ||
// the original 'Backbone.sync' is still available in 'Backbone.ajaxSync' | ||
Backbone.sync = function(method, model, options) { | ||
return Backbone.getSyncMethod(model).apply(this, [method, model, options]); | ||
}; | ||
|
||
return Backbone.LocalStorage; | ||
})); |
Oops, something went wrong.