Snippets

Steven Berlan jq-resource - A vue-resource replacement that only depends on jQuery

Created by Steven Berlan last modified
/* jshint esversion:6, unused:true */
/* global $ */

const methods = {create: 'POST', delete: 'DELETE', get: 'GET', query: 'GET', patch: 'PATCH', remove: 'DELETE', save: 'POST', update: 'put'};
let exports = {
    options: {contentType: 'application/json', dataType: 'json'},
    addMethod(method, httpMethod) {
        exports[method] = (url, data, options) => {
            url = url.replace(/\{([^\w]*)(.+?)([^\w]*)\}/g, (match, before, prop, after) => data[prop] ? before + data[prop] + after : '');
            if (httpMethod !== 'GET') data = JSON.stringify(data);
            return $.ajax($.extend(true, {}, exports.options, {method: httpMethod}, options, {url: url, data: data}));
        };
    },
    resource(url, actions, baseOptions) {
        let ret = {};
        $.each($.extend({}, methods, actions), (meth) => {
            ret[meth] = (data, options) => (exports[meth] || exports.save)(url, data, $.extend(true, {}, baseOptions, actions[meth], options));
        });
        return ret;
    }
};

$.each(methods, exports.addMethod);

export default exports;

Comments (1)

  1. Steven Berlan

    Example usage:

    import {jqresource} from './jq-resource';
    
    var obj = {foo: 'bar'};
    var res = jqresource.resource('that/resource{/id/}', {create: {url:'that/resource/create/'}});
    res.create(obj).then((data) => {
        // assuming data contains an id property so you can invoke a save immediately on it.
        console.log("ok create", data);
        $.extend(obj, data);
        obj.foo = 'baz';
    
        res.save(obj).then(console.log.bind(console, "ok save"), console.log.bind(console, "fail save"));
    }, console.log.bind(console, "fail create"));
    
    var obj2 = jqresource.create('that/resource/create/', {foo: 'biz'});
    
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.