jquery-resource
Version:
A jQuery plugin that abstracts the process of consuming a REST endpoint.
1 lines • 3.11 kB
JavaScript
!function(root,factory){"function"==typeof define&&define.amd?define(["jquery"],factory):"object"==typeof module&&module.exports?module.exports=factory(require("jquery")):factory(root.jQuery)}("undefined"!=typeof self?self:this,(function($){"use strict";var Resource=function(options){if(!(this instanceof Resource))return new Resource(options);init(this,options)};return Resource.DEFAULTS={endpoint:"",ajaxSettings:{},actions:{get:{method:"GET",withID:!0},find:{method:"GET"},post:{method:"POST"},patch:{method:"PATCH",withID:!0},put:{method:"PUT",withID:!0},delete:{method:"DELETE",withID:!0}},customActions:{},aliases:{add:"post",create:"post",update:"patch",replace:"put"}},Resource.prototype.ajax=function(settings){return $.ajax(deepMerge(this.ajaxSettings,settings))},$.resource=Resource;function deepMerge(){return $.extend.apply(null,[!0,{}].concat($.makeArray(arguments)))}function isPendingRequest(request){return!!request&&4!==request.readyState}function hasProperty(object,key){return Object.prototype.hasOwnProperty.call(object,key)}function ajax(instance,id,data,action,settings){var ajaxSettings=action.ajaxSettings;return action.lastRequest=instance.ajax(deepMerge(ajaxSettings,{url:(ajaxSettings.url||instance.endpoint)+(id?"/"+id:""),data:data},settings))}function createAction(instance,ajaxSettings,useID){var action=useID?function(id,data,settings){return ajax(instance,id,data,action,settings)}:function(data,settings){return ajax(instance,"",data,action,settings)};return action.ajaxSettings=ajaxSettings,action.lastRequest=null,action.isPending=function(){return isPendingRequest(action.lastRequest)},action}function init(instance,options){instance.options=deepMerge(Resource.DEFAULTS,options),instance.endpoint=instance.options.endpoint,instance.ajaxSettings=instance.options.ajaxSettings,initActions(instance),initAliases(instance)}function initActions(instance){var options=instance.options,actions=$.extend({},options.actions,options.customActions);$.each(actions,(function(actionName,actionSettings){if(!actionSettings)return!0;if(actionName in instance)return console.error('[jquery-resource] The action "%s" conflicts with an existing resource instance property.',actionName),!0;var withID=actionSettings.withID||actionSettings.useID||!1,ajaxSettings=$.extend({},actionSettings);delete ajaxSettings.useID,delete ajaxSettings.withID,delete ajaxSettings.withFiles,actionSettings.withFiles&&(hasProperty(ajaxSettings,"contentType")||(ajaxSettings.contentType=!1),hasProperty(ajaxSettings,"processData")||(ajaxSettings.processData=!1)),instance[actionName]=createAction(instance,ajaxSettings,withID)}))}function initAliases(instance){var options=instance.options;options.aliases&&$.each(options.aliases,(function(aliasName,actionName){return!actionName||(aliasName in instance?(console.error('[jquery-resource] The alias name "%s" conflicts with an existing resource instance property.',aliasName),!0):actionName in instance?void(instance[aliasName]=instance[actionName]):(console.warn('[jquery-resource] The action name "%s" for the alias does not exist.',actionName),!0))}))}}));