summaryrefslogtreecommitdiffstats
path: root/third_party/webkit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/depot/depot.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/webkit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/depot/depot.js249
1 files changed, 249 insertions, 0 deletions
diff --git a/third_party/webkit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/depot/depot.js b/third_party/webkit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/depot/depot.js
new file mode 100644
index 0000000000..5f8382bb0f
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/depot/depot.js
@@ -0,0 +1,249 @@
+// depot.js v0.1.6
+
+// (c) 2013 Michal Kuklis
+// Licensed under The MIT License
+// http://opensource.org/licenses/MIT
+
+(function (name, root, factory) {
+ if (typeof exports == 'object') {
+ module.exports = factory();
+ } else if (typeof define == 'function' && define.amd) {
+ define(factory);
+ } else {
+ root[name] = factory();
+ }
+}("depot", this, function () {
+
+ "use strict";
+
+ // depot api
+
+ var api = {
+
+ save: function (record) {
+ var id, ids;
+
+ this.refresh();
+
+ if (!record[this.idAttribute]) {
+ record[this.idAttribute] = guid();
+ }
+
+ id = record[this.idAttribute] + '';
+
+ if (this.ids.indexOf(id) < 0) {
+ this.ids.push(id);
+ ids = this.ids.join(",");
+ this.storageAdaptor.setItem(this.name, ids);
+ this.store = ids;
+ }
+
+ this.storageAdaptor.setItem(getKey(this.name, id), JSON.stringify(record));
+
+ return record;
+ },
+
+ update: function (id, data) {
+ if (typeof data == 'undefined') {
+ data = id;
+ id = data[this.idAttribute];
+ }
+
+ var record = this.get(id);
+
+ if (record) {
+ record = extend(record, data);
+ this.save(record);
+ }
+
+ return record;
+ },
+
+ updateAll: function (data) {
+ var records = this.all();
+
+ records.forEach(function (record) {
+ record = extend(record, data);
+ this.save(record);
+ }, this);
+
+ return records;
+ },
+
+ find: function (criteria) {
+ var key, match, record;
+ var name = this.name;
+ var self = this;
+
+ if (!criteria) return this.all();
+
+ this.refresh();
+
+ return this.ids.reduce(function (memo, id) {
+ record = jsonData(self.storageAdaptor.getItem(getKey(name, id)));
+ match = findMatch(criteria, record);
+
+ if (match) {
+ memo.push(record);
+ }
+
+ return memo;
+ }, []);
+ },
+
+ get: function (id) {
+ return jsonData(this.storageAdaptor.getItem(getKey(this.name, id)));
+ },
+
+ all: function () {
+ var record, self = this, name = this.name;
+
+ this.refresh();
+
+ return this.ids.reduce(function (memo, id) {
+ record = self.storageAdaptor.getItem(getKey(name, id));
+
+ if (record) {
+ memo.push(jsonData(record));
+ }
+
+ return memo;
+ }, []);
+ },
+
+ destroy: function (record) {
+ var index;
+ var id = (record[this.idAttribute]) ? record[this.idAttribute] : record;
+ var key = getKey(this.name, id);
+
+ record = jsonData(this.storageAdaptor.getItem(key));
+ this.storageAdaptor.removeItem(key);
+
+ index = this.ids.indexOf(id);
+ if (index != -1) this.ids.splice(index, 1);
+ this.storageAdaptor.setItem(this.name, this.ids.join(","));
+
+ return record;
+ },
+
+ destroyAll: function (criteria) {
+ var attr, id, match, record, key;
+
+ this.refresh();
+
+ for (var i = this.ids.length - 1; i >= 0; i--) {
+ id = this.ids[i];
+ key = getKey(this.name, id);
+
+ if (criteria) {
+
+ record = jsonData(this.storageAdaptor.getItem(key));
+ match = findMatch(criteria, record);
+
+ if (match) {
+ this.storageAdaptor.removeItem(key);
+ this.ids.splice(i, 1);
+ }
+
+ }
+ else {
+ this.storageAdaptor.removeItem(key);
+ }
+ }
+
+ if (criteria) {
+ this.storageAdaptor.setItem(this.name, this.ids.join(","));
+ }
+ else {
+ this.storageAdaptor.removeItem(this.name);
+ this.ids = [];
+ }
+ },
+
+ size: function () {
+ this.refresh();
+
+ return this.ids.length;
+ },
+
+ refresh: function () {
+ var store = this.storageAdaptor.getItem(this.name);
+
+ if (this.store && this.store === store) {
+ return;
+ }
+
+ this.ids = (store && store.split(",")) || [];
+ this.store = store;
+ }
+ };
+
+ // helpers
+
+ function jsonData(data) {
+ return data && JSON.parse(data);
+ }
+
+ function getKey(name, id) {
+ return name + "-" + id;
+ }
+
+ function findMatch(criteria, record) {
+ var match, attr;
+
+ if (typeof criteria == 'function') {
+ match = criteria(record);
+ }
+ else {
+ match = true;
+ for (attr in criteria) {
+ match &= (criteria[attr] === record[attr]);
+ }
+ }
+
+ return match;
+ }
+
+ function s4() {
+ return Math.floor((1 + Math.random()) * 0x10000)
+ .toString(16).substring(1);
+ }
+
+ function guid() {
+ return s4() + s4() + '-' + s4() + '-' + s4() +
+ '-' +s4() + '-' + s4() + s4() + s4();
+ }
+
+ function extend(dest, source) {
+ for (var key in source) {
+ if (source.hasOwnProperty(key)) {
+ dest[key] = source[key];
+ }
+ }
+
+ return dest;
+ }
+
+ function depot(name, options) {
+ var instance;
+
+ options = extend({
+ idAttribute: '_id',
+ storageAdaptor: localStorage
+ }, options);
+
+ if (!options.storageAdaptor) throw new Error("No storage adaptor was found");
+
+ instance = Object.create(api, {
+ name: { value: name },
+ idAttribute: { value: options.idAttribute },
+ storageAdaptor: { value: options.storageAdaptor }
+ });
+
+ instance.refresh();
+
+ return instance;
+ }
+
+ return depot;
+}));