yawp
Version:
YAWP! Framework
518 lines (442 loc) • 16.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getOwnPropertyNames = require('babel-runtime/core-js/object/get-own-property-names');
var _getOwnPropertyNames2 = _interopRequireDefault(_getOwnPropertyNames);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _get2 = require('babel-runtime/helpers/get');
var _get3 = _interopRequireDefault(_get2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _baseUrl = '/api';
var _defaultFetchOptions = {};
var _before = undefined;
var _then = undefined;
var _catch2 = undefined;
function normalize(arg) {
if (!arg) {
return '';
}
if (arg instanceof Object) {
return extractId(arg);
}
return arg;
}
function hasId(object) {
return object.id;
}
function extractId(object) {
if (hasId(object)) {
return object.id;
}
throw 'use yawp(id) if your endpoint does not have a @Id field called id';
}
exports.default = function (request) {
function yawpFn(baseArg) {
var options = {};
var q = {};
var Yawp = function () {
function Yawp(props) {
(0, _classCallCheck3.default)(this, Yawp);
if (props) {
(0, _utils.extend)(this, props);
}
}
// request
(0, _createClass3.default)(Yawp, [{
key: 'save',
// instance method
value: function save(cb) {
var promise = this.createOrUpdate();
return cb ? promise.then(cb) : promise;
}
}, {
key: 'createOrUpdate',
value: function createOrUpdate() {
var _this = this;
var promise = void 0;
if (hasId(this)) {
options.url = this.id;
promise = this.constructor.update(this);
} else {
promise = this.constructor.create(this).then(function (object) {
_this.id = object.id;
return object;
});
}
return promise;
}
}, {
key: 'destroy',
value: function destroy(cb) {
var promise = this.constructor.destroy(this);
return cb ? promise.then(cb) : promise;
}
}, {
key: 'get',
value: function get(action) {
options.url = extractId(this);
return this.constructor.get(action);
}
}, {
key: 'put',
value: function put(action) {
options.url = extractId(this);
return this.constructor.put(action);
}
}, {
key: '_patch',
value: function _patch(action) {
options.url = extractId(this);
return this.constructor._patch(action);
}
}, {
key: 'post',
value: function post(action) {
options.url = extractId(this);
return this.constructor.post(action);
}
}, {
key: '_delete',
value: function _delete(action) {
options.url = extractId(this);
return this.constructor._delete(action);
}
}], [{
key: 'clear',
value: function clear() {
options = {
url: normalize(baseArg)
};
q = {};
}
}, {
key: 'prepareRequestOptions',
value: function prepareRequestOptions() {
var _options = (0, _utils.extend)({}, options);
this.clear();
return _options;
}
}, {
key: 'baseRequest',
value: function baseRequest(type) {
var options = this.prepareRequestOptions();
var url = _baseUrl + options.url;
delete options.url;
options.method = type;
options.json = true;
(0, _utils.extend)(options, _defaultFetchOptions);
var p = _promise2.default.resolve(_before ? _before(options) : options);
return p.then(function (opt) {
return opt || options;
}).then(function (options) {
var req = request(url, options);
if (_then) {
req = req.then(_then);
}
if (_catch2) {
req = req.catch(_catch2);
}
return req;
});
}
}, {
key: 'wrapInstance',
value: function wrapInstance(object) {
return new this(object);
}
}, {
key: 'wrapArray',
value: function wrapArray(objects) {
var _this2 = this;
return objects.map(function (object) {
return _this2.wrapInstance(object);
});
}
}, {
key: 'wrappedRequest',
value: function wrappedRequest(type) {
var _this3 = this;
return this.baseRequest(type).then(function (result) {
if (Array === result.constructor) {
return _this3.wrapArray(result);
}
return _this3.wrapInstance(result);
});
}
// query
}, {
key: 'from',
value: function from(parentBaseArg) {
var parentBase = normalize(parentBaseArg);
options.url = parentBase + options.url;
return this;
}
}, {
key: 'transform',
value: function transform(t) {
this.param('t', t);
return this;
}
}, {
key: 'where',
value: function where(data) {
if (arguments.length === 1) {
q.where = data;
} else {
q.where = [].slice.call(arguments);
}
return this;
}
}, {
key: 'order',
value: function order(data) {
q.order = data;
return this;
}
}, {
key: 'sort',
value: function sort(data) {
q.sort = data;
return this;
}
}, {
key: 'limit',
value: function limit(data) {
q.limit = data;
return this;
}
}, {
key: 'fetch',
value: function fetch(arg) {
var cb = typeof arg === 'function' ? arg : undefined;
if (arg && !cb) {
options.url += '/' + arg;
}
var promise = this.wrappedRequest('GET');
if (cb) {
return promise.then(cb);
}
return promise;
}
}, {
key: 'setupQuery',
value: function setupQuery() {
if ((0, _keys2.default)(q).length > 0) {
this.param('q', (0, _stringify2.default)(q));
}
}
}, {
key: 'list',
value: function list(cb) {
this.setupQuery();
var promise = this.wrappedRequest('GET');
if (cb) {
return promise.then(cb);
}
return promise;
}
}, {
key: 'first',
value: function first(cb) {
this.limit(1);
return this.list(function (objects) {
var object = objects.length === 0 ? null : objects[0];
return cb ? cb(object) : object;
});
}
}, {
key: 'only',
value: function only(cb) {
return this.list(function (objects) {
if (objects.length !== 1) {
throw 'called only but got ' + objects.length + ' results';
}
var object = objects[0];
return cb ? cb(object) : object;
});
}
// repository
}, {
key: 'create',
value: function create(object) {
options.body = (0, _stringify2.default)(object);
return this.wrappedRequest('POST');
}
}, {
key: 'update',
value: function update(object) {
options.url = object.id;
options.body = (0, _stringify2.default)(object);
return this.wrappedRequest('PUT');
}
}, {
key: 'patch',
value: function patch(object) {
options.url = object.id;
options.body = (0, _stringify2.default)(object);
return this.wrappedRequest('PATCH');
}
}, {
key: 'destroy',
value: function destroy(object) {
if (object) {
options.url = extractId(object);
}
return this.baseRequest('DELETE');
}
// actions
}, {
key: 'json',
value: function json(object) {
options.body = (0, _stringify2.default)(object);
return this;
}
}, {
key: 'params',
value: function params(_params) {
options.query = (0, _utils.extend)(options.query, _params);
return this;
}
}, {
key: 'param',
value: function param(key, value) {
if (!options.query) {
options.query = {};
}
options.query[key] = value;
}
}, {
key: 'action',
value: function action(verb, path) {
options.url += '/' + path;
return this.baseRequest(verb);
}
}, {
key: 'get',
value: function get(action) {
return this.action('GET', action);
}
}, {
key: 'put',
value: function put(action) {
return this.action('PUT', action);
}
}, {
key: '_patch',
value: function _patch(action) {
return this.action('PATCH', action);
}
}, {
key: 'post',
value: function post(action) {
return this.action('POST', action);
}
}, {
key: '_delete',
value: function _delete(action) {
return this.action('DELETE', action);
}
// es5 subclassing
}, {
key: 'subclass',
value: function subclass(constructorFn) {
var base = yawpFn(baseArg);
var _super = this;
var sub = function (_base) {
(0, _inherits3.default)(sub, _base);
function sub() {
(0, _classCallCheck3.default)(this, sub);
var _this4 = (0, _possibleConstructorReturn3.default)(this, (sub.__proto__ || (0, _getPrototypeOf2.default)(sub)).call(this));
_super.bindBaseMethods(_this4, base);
if (constructorFn) {
constructorFn.apply(_this4, arguments);
} else {
(0, _get3.default)(sub.prototype.__proto__ || (0, _getPrototypeOf2.default)(sub.prototype), 'constructor', _this4).apply(_this4, arguments);
}
return _this4;
}
return sub;
}(base);
sub.super = base;
return sub;
}
}, {
key: 'bindBaseMethods',
value: function bindBaseMethods(self, base) {
self.super = function () {};
var keys = (0, _getOwnPropertyNames2.default)(base.prototype);
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
self.super[key] = base.prototype[key].bind(self);
}
}
}]);
return Yawp;
}();
Yawp.clear();
return Yawp;
}
// base api
function customFetchOptions(fn) {
customFetchOptionsFn = fn;
}
function config(cb) {
var c = {
baseUrl: function baseUrl(url) {
_baseUrl = url;
},
defaultFetchOptions: function defaultFetchOptions(options) {
_defaultFetchOptions = options;
},
before: function before(fn) {
_before = fn;
},
then: function then(fn) {
_then = fn;
},
catch: function _catch(fn) {
_catch2 = fn;
}
};
cb(c);
}
function update(object) {
var id = extractId(object);
return yawpFn(id).update(object);
}
function patch(object) {
var id = extractId(object);
return yawpFn(id).patch(object);
}
function destroy(object) {
var id = extractId(object);
return yawpFn(id).destroy(object);
}
var baseApi = {
config: config,
customFetchOptions: customFetchOptions,
update: update,
patch: patch,
destroy: destroy
};
return (0, _utils.extend)(yawpFn, baseApi);
};
module.exports = exports['default'];
//# sourceMappingURL=yawp.js.map