backbone.lovefield
Version:
lovefield backend for backbone
463 lines (392 loc) • 15.6 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("backbone"), require("lodash"), require("lovefield"));
else if(typeof define === 'function' && define.amd)
define(["backbone", "lodash", "lovefield"], factory);
else if(typeof exports === 'object')
exports["Backbone.LoveField"] = factory(require("backbone"), require("lodash"), require("lovefield"));
else
root["Backbone.LoveField"] = factory(root["Backbone"], root["_"], root["lf"]);
})(window, function(__WEBPACK_EXTERNAL_MODULE_backbone__, __WEBPACK_EXTERNAL_MODULE_lodash__, __WEBPACK_EXTERNAL_MODULE_lovefield__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({
/***/ "./src/driver.coffee":
/*!***************************!*\
!*** ./src/driver.coffee ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LoveStore = undefined;
var _backbone = __webpack_require__(/*! backbone */ "backbone");
var _backbone2 = _interopRequireDefault(_backbone);
var _sync = __webpack_require__(/*! ./sync */ "./src/sync.coffee");
var _store = __webpack_require__(/*! ./store */ "./src/store.coffee");
var _utils = __webpack_require__(/*! ./utils */ "./src/utils.coffee");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/** Get the local or ajax sync call
* @param {Model} model - Model to sync
* @param {object} options - Options to pass, takes ajaxSync
* @returns {function} The sync method that will be called
*/
var ajaxSync, getSyncMethod;
_backbone2.default.LoveStore = _store.LoveStore;
ajaxSync = _backbone2.default.sync;
getSyncMethod = function getSyncMethod(model) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var forceAjaxSync, hasLoveStore;
forceAjaxSync = options.ajaxSync;
hasLoveStore = (0, _utils.getLoveStore)(model);
if (!forceAjaxSync && hasLoveStore) {
return _sync.sync;
} else {
return ajaxSync;
}
};
_backbone2.default.sync = function (method, model, options) {
return getSyncMethod(model, options).apply(this, [method, model, options]);
};
exports.LoveStore = _store.LoveStore;
/***/ }),
/***/ "./src/store.coffee":
/*!**************************!*\
!*** ./src/store.coffee ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LoveStore = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _backbone = __webpack_require__(/*! backbone */ "backbone");
var _lodash = __webpack_require__(/*! lodash */ "lodash");
var _lovefield = __webpack_require__(/*! lovefield */ "lovefield");
var _lovefield2 = _interopRequireDefault(_lovefield);
var _utils = __webpack_require__(/*! ./utils */ "./src/utils.coffee");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var LoveStore = exports.LoveStore = function () {
function LoveStore(conn) {
var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
_classCallCheck(this, LoveStore);
this.conn = conn;
this.name = name;
return;
}
_createClass(LoveStore, [{
key: 'getTable',
value: function getTable() {
return this.conn.getSchema().table(this.name);
}
}, {
key: 'create',
value: function create(model) {
var data, row, table;
table = this.getTable();
if (!model.id && model.id !== 0) {
model.id = (0, _utils.guid)();
model.set(model.idAttribute, model.id);
}
data = model.toJSON();
row = table.createRow(data);
return this.conn.insert().into(table).values([row]).exec();
}
}, {
key: 'update',
value: function update(model) {
var data, q, table;
table = this.getTable();
data = model.toJSON();
q = this.conn.update(table);
Object.keys(data).forEach(function (key) {
return q = q.set(table[key], data[key]);
});
q = q.where(table.id.eq(data.id));
return q.exec();
}
}, {
key: 'find',
value: function find(model, options) {
var id, idAttribute, q, table;
table = this.getTable();
idAttribute = (0, _lodash.result)(model, 'idAttribute');
id = (0, _lodash.result)(model, idAttribute);
return q = this.conn.select().from(table).where(table.id.eq(id)).exec().then(function (results) {
model.set(results[0]);
return model;
});
}
}, {
key: 'findAll',
value: function findAll(model, options) {
var filters, q, table;
table = this.getTable();
q = this.conn.select().from(table);
if (options.data) {
filters = [];
Object.keys(options.data).forEach(function (key) {
var clause;
clause = table[key].eq(options.data[key]);
return filters.push(clause);
});
if (filters.length > 1) {
q = q.where(_lovefield2.default.op.and(filters));
} else {
q = q.where(filters[0]);
}
}
return q.exec().then(function (results) {
if (model instanceof _backbone.Collection) {
return model.set(results);
} else {
// FIXME throw error if more
// than one result for model
return model.set(results[0]);
}
});
}
}, {
key: 'destroy',
value: function destroy(model, options) {
var table;
table = this.getTable();
return this.conn.delete().from(table).where(table.id.eq(model.id)).exec();
}
}]);
return LoveStore;
}();
/***/ }),
/***/ "./src/sync.coffee":
/*!*************************!*\
!*** ./src/sync.coffee ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.sync = undefined;
var _lodash = __webpack_require__(/*! lodash */ "lodash");
var _utils = __webpack_require__(/*! ./utils */ "./src/utils.coffee");
/** Override Backbone's `sync` method to run against localStorage
* @param {string} method - One of read/create/update/delete
* @param {Model} model - Backbone model to sync
* @param {Object} options - Options object, use `ajaxSync: true` to run the
* operation against the server in which case, options will also be passed into
* `jQuery.ajax`
* @returns {undefined}
*/
var sync = exports.sync = function sync(method, model) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var error, errorMessage, id, idAttribute, resp, store;
store = (0, _utils.getLoveStore)(model);
resp = void 0;
try {
switch (method) {
case 'read':
idAttribute = (0, _lodash.result)(model, 'idAttribute');
id = (0, _lodash.result)(model, idAttribute);
resp = id ? store.find(model, options) : store.findAll(model, options); //noqa
break;
case 'create':
resp = store.create(model, options);
break;
case 'patch':
case 'update':
resp = store.update(model, options);
break;
case 'delete':
resp = store.destroy(model, options);
}
} catch (error1) {
error = error1;
if (error.code === 22) {
errorMessage = 'Private browsing is unsupported';
} else {
errorMessage = error.message;
}
}
if (resp) {
// compatibility with $.ajax
resp.done = resp.then;
resp.fail = resp.catch;
if (options.success) {
options.success.call(model, resp, options);
}
} else {
errorMessage = errorMessage ? errorMessage : "Record Not Found";
if (options.error) {
options.error.call(model, errorMessage, options);
}
}
// add compatibility with $.ajax
// always execute callback for success and error
if (options.complete) {
options.complete.call(model, resp);
}
return resp;
};
/***/ }),
/***/ "./src/utils.coffee":
/*!**************************!*\
!*** ./src/utils.coffee ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getLoveStore = exports.getTableName = exports.getLoveConnection = exports.guid = undefined;
var _lodash = __webpack_require__(/*! lodash */ "lodash");
var s4;
s4 = function s4() {
var rand;
rand = (1 + Math.random()) * 0x10000;
return (rand | 0).toString(16).substring(1);
};
var guid = exports.guid = function guid() {
return '' + s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
};
var getLoveConnection = exports.getLoveConnection = function getLoveConnection(model) {
var conn;
conn = (0, _lodash.result)(model, 'loveConnection');
return conn || (0, _lodash.result)(model.collection, 'loveConnection');
};
var getTableName = exports.getTableName = function getTableName(model) {
var tableName;
tableName = (0, _lodash.result)(model, 'tableName');
return tableName || (0, _lodash.result)(model.collection, 'tableName');
};
var getLoveStore = exports.getLoveStore = function getLoveStore(model) {
var store;
store = (0, _lodash.result)(model, 'loveStore');
return store || (0, _lodash.result)(model.collection, 'loveStore');
};
/***/ }),
/***/ 0:
/*!*********************************!*\
!*** multi ./src/driver.coffee ***!
\*********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! ./src/driver.coffee */"./src/driver.coffee");
/***/ }),
/***/ "backbone":
/*!**************************************************************************************************!*\
!*** external {"amd":"backbone","commonjs":"backbone","commonjs2":"backbone","root":"Backbone"} ***!
\**************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_backbone__;
/***/ }),
/***/ "lodash":
/*!*************************************************************************************!*\
!*** external {"amd":"lodash","commonjs":"lodash","commonjs2":"lodash","root":"_"} ***!
\*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_lodash__;
/***/ }),
/***/ "lovefield":
/*!***********************************************************************************************!*\
!*** external {"amd":"lovefield","commonjs":"lovefield","commonjs2":"lovefield","root":"lf"} ***!
\***********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_lovefield__;
/***/ })
/******/ });
});
//# sourceMappingURL=backbone.lovefield.js.map