UNPKG

superdata

Version:

A lightweight data layer module motivated by extjs' data layer. It can be used with any client-side framework.

2,115 lines (1,773 loc) 76.4 kB
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.superdata = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/component-emitter/index.js":[function(require,module,exports){ /** * Expose `Emitter`. */ if (typeof module !== 'undefined') { module.exports = Emitter; } /** * Initialize a new `Emitter`. * * @api public */ function Emitter(obj) { if (obj) return mixin(obj); }; /** * Mixin the emitter properties. * * @param {Object} obj * @return {Object} * @api private */ function mixin(obj) { for (var key in Emitter.prototype) { obj[key] = Emitter.prototype[key]; } return obj; } /** * Listen on the given `event` with `fn`. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.on = Emitter.prototype.addEventListener = function(event, fn){ this._callbacks = this._callbacks || {}; (this._callbacks['$' + event] = this._callbacks['$' + event] || []) .push(fn); return this; }; /** * Adds an `event` listener that will be invoked a single * time then automatically removed. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.once = function(event, fn){ function on() { this.off(event, on); fn.apply(this, arguments); } on.fn = fn; this.on(event, on); return this; }; /** * Remove the given callback for `event` or all * registered callbacks. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function(event, fn){ this._callbacks = this._callbacks || {}; // all if (0 == arguments.length) { this._callbacks = {}; return this; } // specific event var callbacks = this._callbacks['$' + event]; if (!callbacks) return this; // remove all handlers if (1 == arguments.length) { delete this._callbacks['$' + event]; return this; } // remove specific handler var cb; for (var i = 0; i < callbacks.length; i++) { cb = callbacks[i]; if (cb === fn || cb.fn === fn) { callbacks.splice(i, 1); break; } } return this; }; /** * Emit `event` with the given args. * * @param {String} event * @param {Mixed} ... * @return {Emitter} */ Emitter.prototype.emit = function(event){ this._callbacks = this._callbacks || {}; var args = [].slice.call(arguments, 1) , callbacks = this._callbacks['$' + event]; if (callbacks) { callbacks = callbacks.slice(0); for (var i = 0, len = callbacks.length; i < len; ++i) { callbacks[i].apply(this, args); } } return this; }; /** * Return array of callbacks for `event`. * * @param {String} event * @return {Array} * @api public */ Emitter.prototype.listeners = function(event){ this._callbacks = this._callbacks || {}; return this._callbacks['$' + event] || []; }; /** * Check if this emitter has `event` handlers. * * @param {String} event * @return {Boolean} * @api public */ Emitter.prototype.hasListeners = function(event){ return !! this.listeners(event).length; }; },{}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/form-data/lib/browser.js":[function(require,module,exports){ /* eslint-env browser */ module.exports = FormData; },{}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/reduce-component/index.js":[function(require,module,exports){ /** * Reduce `arr` with `fn`. * * @param {Array} arr * @param {Function} fn * @param {Mixed} initial * * TODO: combatible error handling? */ module.exports = function(arr, fn, initial){ var idx = 0; var len = arr.length; var curr = arguments.length == 3 ? initial : arr[idx++]; while (idx < len) { curr = fn.call(null, curr, arr[idx], ++idx, arr); } return curr; }; },{}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/superagent/lib/client.js":[function(require,module,exports){ /** * Module dependencies. */ var Emitter = require('emitter'); var reduce = require('reduce'); /** * Root reference for iframes. */ var root; if (typeof window !== 'undefined') { // Browser window root = window; } else if (typeof self !== 'undefined') { // Web Worker root = self; } else { // Other environments root = this; } /** * Noop. */ function noop(){}; /** * Check if `obj` is a host object, * we don't want to serialize these :) * * TODO: future proof, move to compoent land * * @param {Object} obj * @return {Boolean} * @api private */ function isHost(obj) { var str = {}.toString.call(obj); switch (str) { case '[object File]': case '[object Blob]': case '[object FormData]': return true; default: return false; } } /** * Determine XHR. */ request.getXHR = function () { if (root.XMLHttpRequest && (!root.location || 'file:' != root.location.protocol || !root.ActiveXObject)) { return new XMLHttpRequest; } else { try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {} try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {} try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {} try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {} } return false; }; /** * Removes leading and trailing whitespace, added to support IE. * * @param {String} s * @return {String} * @api private */ var trim = ''.trim ? function(s) { return s.trim(); } : function(s) { return s.replace(/(^\s*|\s*$)/g, ''); }; /** * Check if `obj` is an object. * * @param {Object} obj * @return {Boolean} * @api private */ function isObject(obj) { return obj === Object(obj); } /** * Serialize the given `obj`. * * @param {Object} obj * @return {String} * @api private */ function serialize(obj) { if (!isObject(obj)) return obj; var pairs = []; for (var key in obj) { if (null != obj[key]) { pushEncodedKeyValuePair(pairs, key, obj[key]); } } return pairs.join('&'); } /** * Helps 'serialize' with serializing arrays. * Mutates the pairs array. * * @param {Array} pairs * @param {String} key * @param {Mixed} val */ function pushEncodedKeyValuePair(pairs, key, val) { if (Array.isArray(val)) { return val.forEach(function(v) { pushEncodedKeyValuePair(pairs, key, v); }); } pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(val)); } /** * Expose serialization method. */ request.serializeObject = serialize; /** * Parse the given x-www-form-urlencoded `str`. * * @param {String} str * @return {Object} * @api private */ function parseString(str) { var obj = {}; var pairs = str.split('&'); var parts; var pair; for (var i = 0, len = pairs.length; i < len; ++i) { pair = pairs[i]; parts = pair.split('='); obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); } return obj; } /** * Expose parser. */ request.parseString = parseString; /** * Default MIME type map. * * superagent.types.xml = 'application/xml'; * */ request.types = { html: 'text/html', json: 'application/json', xml: 'application/xml', urlencoded: 'application/x-www-form-urlencoded', 'form': 'application/x-www-form-urlencoded', 'form-data': 'application/x-www-form-urlencoded' }; /** * Default serialization map. * * superagent.serialize['application/xml'] = function(obj){ * return 'generated xml here'; * }; * */ request.serialize = { 'application/x-www-form-urlencoded': serialize, 'application/json': JSON.stringify }; /** * Default parsers. * * superagent.parse['application/xml'] = function(str){ * return { object parsed from str }; * }; * */ request.parse = { 'application/x-www-form-urlencoded': parseString, 'application/json': JSON.parse }; /** * Parse the given header `str` into * an object containing the mapped fields. * * @param {String} str * @return {Object} * @api private */ function parseHeader(str) { var lines = str.split(/\r?\n/); var fields = {}; var index; var line; var field; var val; lines.pop(); // trailing CRLF for (var i = 0, len = lines.length; i < len; ++i) { line = lines[i]; index = line.indexOf(':'); field = line.slice(0, index).toLowerCase(); val = trim(line.slice(index + 1)); fields[field] = val; } return fields; } /** * Check if `mime` is json or has +json structured syntax suffix. * * @param {String} mime * @return {Boolean} * @api private */ function isJSON(mime) { return /[\/+]json\b/.test(mime); } /** * Return the mime type for the given `str`. * * @param {String} str * @return {String} * @api private */ function type(str){ return str.split(/ *; */).shift(); }; /** * Return header field parameters. * * @param {String} str * @return {Object} * @api private */ function params(str){ return reduce(str.split(/ *; */), function(obj, str){ var parts = str.split(/ *= */) , key = parts.shift() , val = parts.shift(); if (key && val) obj[key] = val; return obj; }, {}); }; /** * Initialize a new `Response` with the given `xhr`. * * - set flags (.ok, .error, etc) * - parse header * * Examples: * * Aliasing `superagent` as `request` is nice: * * request = superagent; * * We can use the promise-like API, or pass callbacks: * * request.get('/').end(function(res){}); * request.get('/', function(res){}); * * Sending data can be chained: * * request * .post('/user') * .send({ name: 'tj' }) * .end(function(res){}); * * Or passed to `.send()`: * * request * .post('/user') * .send({ name: 'tj' }, function(res){}); * * Or passed to `.post()`: * * request * .post('/user', { name: 'tj' }) * .end(function(res){}); * * Or further reduced to a single call for simple cases: * * request * .post('/user', { name: 'tj' }, function(res){}); * * @param {XMLHTTPRequest} xhr * @param {Object} options * @api private */ function Response(req, options) { options = options || {}; this.req = req; this.xhr = this.req.xhr; // responseText is accessible only if responseType is '' or 'text' and on older browsers this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined') ? this.xhr.responseText : null; this.statusText = this.req.xhr.statusText; this.setStatusProperties(this.xhr.status); this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders()); // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but // getResponseHeader still works. so we get content-type even if getting // other headers fails. this.header['content-type'] = this.xhr.getResponseHeader('content-type'); this.setHeaderProperties(this.header); this.body = this.req.method != 'HEAD' ? this.parseBody(this.text ? this.text : this.xhr.response) : null; } /** * Get case-insensitive `field` value. * * @param {String} field * @return {String} * @api public */ Response.prototype.get = function(field){ return this.header[field.toLowerCase()]; }; /** * Set header related properties: * * - `.type` the content type without params * * A response of "Content-Type: text/plain; charset=utf-8" * will provide you with a `.type` of "text/plain". * * @param {Object} header * @api private */ Response.prototype.setHeaderProperties = function(header){ // content-type var ct = this.header['content-type'] || ''; this.type = type(ct); // params var obj = params(ct); for (var key in obj) this[key] = obj[key]; }; /** * Parse the given body `str`. * * Used for auto-parsing of bodies. Parsers * are defined on the `superagent.parse` object. * * @param {String} str * @return {Mixed} * @api private */ Response.prototype.parseBody = function(str){ var parse = request.parse[this.type]; return parse && str && (str.length || str instanceof Object) ? parse(str) : null; }; /** * Set flags such as `.ok` based on `status`. * * For example a 2xx response will give you a `.ok` of __true__ * whereas 5xx will be __false__ and `.error` will be __true__. The * `.clientError` and `.serverError` are also available to be more * specific, and `.statusType` is the class of error ranging from 1..5 * sometimes useful for mapping respond colors etc. * * "sugar" properties are also defined for common cases. Currently providing: * * - .noContent * - .badRequest * - .unauthorized * - .notAcceptable * - .notFound * * @param {Number} status * @api private */ Response.prototype.setStatusProperties = function(status){ // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request if (status === 1223) { status = 204; } var type = status / 100 | 0; // status / class this.status = this.statusCode = status; this.statusType = type; // basics this.info = 1 == type; this.ok = 2 == type; this.clientError = 4 == type; this.serverError = 5 == type; this.error = (4 == type || 5 == type) ? this.toError() : false; // sugar this.accepted = 202 == status; this.noContent = 204 == status; this.badRequest = 400 == status; this.unauthorized = 401 == status; this.notAcceptable = 406 == status; this.notFound = 404 == status; this.forbidden = 403 == status; }; /** * Return an `Error` representative of this response. * * @return {Error} * @api public */ Response.prototype.toError = function(){ var req = this.req; var method = req.method; var url = req.url; var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')'; var err = new Error(msg); err.status = this.status; err.method = method; err.url = url; return err; }; /** * Expose `Response`. */ request.Response = Response; /** * Initialize a new `Request` with the given `method` and `url`. * * @param {String} method * @param {String} url * @api public */ function Request(method, url) { var self = this; Emitter.call(this); this._query = this._query || []; this.method = method; this.url = url; this.header = {}; this._header = {}; this.on('end', function(){ var err = null; var res = null; try { res = new Response(self); } catch(e) { err = new Error('Parser is unable to parse the response'); err.parse = true; err.original = e; // issue #675: return the raw response if the response parsing fails err.rawResponse = self.xhr && self.xhr.responseText ? self.xhr.responseText : null; return self.callback(err); } self.emit('response', res); if (err) { return self.callback(err, res); } if (res.status >= 200 && res.status < 300) { return self.callback(err, res); } var new_err = new Error(res.statusText || 'Unsuccessful HTTP response'); new_err.original = err; new_err.response = res; new_err.status = res.status; self.callback(new_err, res); }); } /** * Mixin `Emitter`. */ Emitter(Request.prototype); /** * Allow for extension */ Request.prototype.use = function(fn) { fn(this); return this; } /** * Set timeout to `ms`. * * @param {Number} ms * @return {Request} for chaining * @api public */ Request.prototype.timeout = function(ms){ this._timeout = ms; return this; }; /** * Clear previous timeout. * * @return {Request} for chaining * @api public */ Request.prototype.clearTimeout = function(){ this._timeout = 0; clearTimeout(this._timer); return this; }; /** * Abort the request, and clear potential timeout. * * @return {Request} * @api public */ Request.prototype.abort = function(){ if (this.aborted) return; this.aborted = true; this.xhr.abort(); this.clearTimeout(); this.emit('abort'); return this; }; /** * Set header `field` to `val`, or multiple fields with one object. * * Examples: * * req.get('/') * .set('Accept', 'application/json') * .set('X-API-Key', 'foobar') * .end(callback); * * req.get('/') * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' }) * .end(callback); * * @param {String|Object} field * @param {String} val * @return {Request} for chaining * @api public */ Request.prototype.set = function(field, val){ if (isObject(field)) { for (var key in field) { this.set(key, field[key]); } return this; } this._header[field.toLowerCase()] = val; this.header[field] = val; return this; }; /** * Remove header `field`. * * Example: * * req.get('/') * .unset('User-Agent') * .end(callback); * * @param {String} field * @return {Request} for chaining * @api public */ Request.prototype.unset = function(field){ delete this._header[field.toLowerCase()]; delete this.header[field]; return this; }; /** * Get case-insensitive header `field` value. * * @param {String} field * @return {String} * @api private */ Request.prototype.getHeader = function(field){ return this._header[field.toLowerCase()]; }; /** * Set Content-Type to `type`, mapping values from `request.types`. * * Examples: * * superagent.types.xml = 'application/xml'; * * request.post('/') * .type('xml') * .send(xmlstring) * .end(callback); * * request.post('/') * .type('application/xml') * .send(xmlstring) * .end(callback); * * @param {String} type * @return {Request} for chaining * @api public */ Request.prototype.type = function(type){ this.set('Content-Type', request.types[type] || type); return this; }; /** * Force given parser * * Sets the body parser no matter type. * * @param {Function} * @api public */ Request.prototype.parse = function(fn){ this._parser = fn; return this; }; /** * Set Accept to `type`, mapping values from `request.types`. * * Examples: * * superagent.types.json = 'application/json'; * * request.get('/agent') * .accept('json') * .end(callback); * * request.get('/agent') * .accept('application/json') * .end(callback); * * @param {String} accept * @return {Request} for chaining * @api public */ Request.prototype.accept = function(type){ this.set('Accept', request.types[type] || type); return this; }; /** * Set Authorization field value with `user` and `pass`. * * @param {String} user * @param {String} pass * @return {Request} for chaining * @api public */ Request.prototype.auth = function(user, pass){ var str = btoa(user + ':' + pass); this.set('Authorization', 'Basic ' + str); return this; }; /** * Add query-string `val`. * * Examples: * * request.get('/shoes') * .query('size=10') * .query({ color: 'blue' }) * * @param {Object|String} val * @return {Request} for chaining * @api public */ Request.prototype.query = function(val){ if ('string' != typeof val) val = serialize(val); if (val) this._query.push(val); return this; }; /** * Write the field `name` and `val` for "multipart/form-data" * request bodies. * * ``` js * request.post('/upload') * .field('foo', 'bar') * .end(callback); * ``` * * @param {String} name * @param {String|Blob|File} val * @return {Request} for chaining * @api public */ Request.prototype.field = function(name, val){ if (!this._formData) this._formData = new root.FormData(); this._formData.append(name, val); return this; }; /** * Queue the given `file` as an attachment to the specified `field`, * with optional `filename`. * * ``` js * request.post('/upload') * .attach(new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"})) * .end(callback); * ``` * * @param {String} field * @param {Blob|File} file * @param {String} filename * @return {Request} for chaining * @api public */ Request.prototype.attach = function(field, file, filename){ if (!this._formData) this._formData = new root.FormData(); this._formData.append(field, file, filename || file.name); return this; }; /** * Send `data` as the request body, defaulting the `.type()` to "json" when * an object is given. * * Examples: * * // manual json * request.post('/user') * .type('json') * .send('{"name":"tj"}') * .end(callback) * * // auto json * request.post('/user') * .send({ name: 'tj' }) * .end(callback) * * // manual x-www-form-urlencoded * request.post('/user') * .type('form') * .send('name=tj') * .end(callback) * * // auto x-www-form-urlencoded * request.post('/user') * .type('form') * .send({ name: 'tj' }) * .end(callback) * * // defaults to x-www-form-urlencoded * request.post('/user') * .send('name=tobi') * .send('species=ferret') * .end(callback) * * @param {String|Object} data * @return {Request} for chaining * @api public */ Request.prototype.send = function(data){ var obj = isObject(data); var type = this.getHeader('Content-Type'); // merge if (obj && isObject(this._data)) { for (var key in data) { this._data[key] = data[key]; } } else if ('string' == typeof data) { if (!type) this.type('form'); type = this.getHeader('Content-Type'); if ('application/x-www-form-urlencoded' == type) { this._data = this._data ? this._data + '&' + data : data; } else { this._data = (this._data || '') + data; } } else { this._data = data; } if (!obj || isHost(data)) return this; if (!type) this.type('json'); return this; }; /** * Invoke the callback with `err` and `res` * and handle arity check. * * @param {Error} err * @param {Response} res * @api private */ Request.prototype.callback = function(err, res){ var fn = this._callback; this.clearTimeout(); fn(err, res); }; /** * Invoke callback with x-domain error. * * @api private */ Request.prototype.crossDomainError = function(){ var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.'); err.crossDomain = true; err.status = this.status; err.method = this.method; err.url = this.url; this.callback(err); }; /** * Invoke callback with timeout error. * * @api private */ Request.prototype.timeoutError = function(){ var timeout = this._timeout; var err = new Error('timeout of ' + timeout + 'ms exceeded'); err.timeout = timeout; this.callback(err); }; /** * Enable transmission of cookies with x-domain requests. * * Note that for this to work the origin must not be * using "Access-Control-Allow-Origin" with a wildcard, * and also must set "Access-Control-Allow-Credentials" * to "true". * * @api public */ Request.prototype.withCredentials = function(){ this._withCredentials = true; return this; }; /** * Initiate request, invoking callback `fn(res)` * with an instanceof `Response`. * * @param {Function} fn * @return {Request} for chaining * @api public */ Request.prototype.end = function(fn){ var self = this; var xhr = this.xhr = request.getXHR(); var query = this._query.join('&'); var timeout = this._timeout; var data = this._formData || this._data; // store callback this._callback = fn || noop; // state change xhr.onreadystatechange = function(){ if (4 != xhr.readyState) return; // In IE9, reads to any property (e.g. status) off of an aborted XHR will // result in the error "Could not complete the operation due to error c00c023f" var status; try { status = xhr.status } catch(e) { status = 0; } if (0 == status) { if (self.timedout) return self.timeoutError(); if (self.aborted) return; return self.crossDomainError(); } self.emit('end'); }; // progress var handleProgress = function(e){ if (e.total > 0) { e.percent = e.loaded / e.total * 100; } e.direction = 'download'; self.emit('progress', e); }; if (this.hasListeners('progress')) { xhr.onprogress = handleProgress; } try { if (xhr.upload && this.hasListeners('progress')) { xhr.upload.onprogress = handleProgress; } } catch(e) { // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist. // Reported here: // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context } // timeout if (timeout && !this._timer) { this._timer = setTimeout(function(){ self.timedout = true; self.abort(); }, timeout); } // querystring if (query) { query = request.serializeObject(query); this.url += ~this.url.indexOf('?') ? '&' + query : '?' + query; } // initiate request xhr.open(this.method, this.url, true); // CORS if (this._withCredentials) xhr.withCredentials = true; // body if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) { // serialize stuff var contentType = this.getHeader('Content-Type'); var serialize = this._parser || request.serialize[contentType ? contentType.split(';')[0] : '']; if (!serialize && isJSON(contentType)) serialize = request.serialize['application/json']; if (serialize) data = serialize(data); } // set header fields for (var field in this.header) { if (null == this.header[field]) continue; xhr.setRequestHeader(field, this.header[field]); } // send stuff this.emit('request', this); // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing) // We need null here if data is undefined xhr.send(typeof data !== 'undefined' ? data : null); return this; }; /** * Faux promise support * * @param {Function} fulfill * @param {Function} reject * @return {Request} */ Request.prototype.then = function (fulfill, reject) { return this.end(function(err, res) { err ? reject(err) : fulfill(res); }); } /** * Expose `Request`. */ request.Request = Request; /** * Issue a request: * * Examples: * * request('GET', '/users').end(callback) * request('/users').end(callback) * request('/users', callback) * * @param {String} method * @param {String|Function} url or callback * @return {Request} * @api public */ function request(method, url) { // callback if ('function' == typeof url) { return new Request('GET', method).end(url); } // url first if (1 == arguments.length) { return new Request('GET', method); } return new Request(method, url); } /** * GET `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} data or fn * @param {Function} fn * @return {Request} * @api public */ request.get = function(url, data, fn){ var req = request('GET', url); if ('function' == typeof data) fn = data, data = null; if (data) req.query(data); if (fn) req.end(fn); return req; }; /** * HEAD `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} data or fn * @param {Function} fn * @return {Request} * @api public */ request.head = function(url, data, fn){ var req = request('HEAD', url); if ('function' == typeof data) fn = data, data = null; if (data) req.send(data); if (fn) req.end(fn); return req; }; /** * DELETE `url` with optional callback `fn(res)`. * * @param {String} url * @param {Function} fn * @return {Request} * @api public */ function del(url, fn){ var req = request('DELETE', url); if (fn) req.end(fn); return req; }; request['del'] = del; request['delete'] = del; /** * PATCH `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} data * @param {Function} fn * @return {Request} * @api public */ request.patch = function(url, data, fn){ var req = request('PATCH', url); if ('function' == typeof data) fn = data, data = null; if (data) req.send(data); if (fn) req.end(fn); return req; }; /** * POST `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} data * @param {Function} fn * @return {Request} * @api public */ request.post = function(url, data, fn){ var req = request('POST', url); if ('function' == typeof data) fn = data, data = null; if (data) req.send(data); if (fn) req.end(fn); return req; }; /** * PUT `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} data or fn * @param {Function} fn * @return {Request} * @api public */ request.put = function(url, data, fn){ var req = request('PUT', url); if ('function' == typeof data) fn = data, data = null; if (data) req.send(data); if (fn) req.end(fn); return req; }; /** * Expose `request`. */ module.exports = request; },{"emitter":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/component-emitter/index.js","reduce":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/reduce-component/index.js"}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/errorMessages.js":[function(require,module,exports){ /*jslint node: true */ "use strict"; module.exports = { errorMessages: { NOT_FOUND: "NOT_FOUND", DUPLICATE_KEY: "DUPLICATE_KEY" }, exceptionMessages: { NOT_A_FUNCTION: "NOT_A_FUNCTION" } }; },{}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/model/model.js":[function(require,module,exports){ /*jslint node: true */ "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var createModelObject = require("./modelObject"); module.exports = function createModel(options) { if (!options) { options = {}; } if (!options.idField) { throw new Error("options.idField is mandatory!"); } if (!options.fields) { throw new Error("options.fields is mandatory!"); } if (!options.proxy) { throw new Error("options.proxy is mandatory!"); } if (options.belongsTo && !Array.isArray(options.belongsTo)) { throw new Error("options.belongsTo has to be an array!"); } if (Array.isArray(options.belongsTo)) { for (var i = 0; i < options.belongsTo.length; i += 1) { if (!options.fields[options.belongsTo[i]]) { throw new Error("options.belongsTo has to contain field names!"); } } } var idField = options.idField; var fields = options.fields; var proxy = options.proxy; var belongsTo = options.belongsTo || []; //options.fields should be an array of objects //the objects should describe the fields: // - name // - type // - validators // - mapping // - defaultValue // - beforeChange // - afterChange function checkReferences(belongsToValues) { for (var i = 0; i < belongsTo.length; i += 1) { if (!belongsToValues[belongsTo[i]]) { return false; } } return true; } function checkReferenceTypes(belongsToValues) { for (var i = 0; i < belongsTo.length; i += 1) { if (_typeof(belongsToValues[belongsTo[i]]) !== fields[belongsTo[i]].type) { return false; } } return true; } function list(options, belongsToValues, callback) { if (!callback) { callback = belongsToValues; belongsToValues = undefined; } if (!checkReferences(belongsToValues)) { return callback("belongsToValues has to have properties for references given in belongsTo"); } if (!checkReferenceTypes(belongsToValues)) { return callback("Each property of belongsToValues has to match type with corresponding property of options.fields"); } var filters = {}; for (var i = 0; i < belongsTo.length; i += 1) { filters[belongsTo[i]] = belongsToValues[belongsTo[i]]; } proxy.read(options, filters, function (err, result) { if (err) { return callback(err); } var data = []; result.items.forEach(function (item) { data.push(createModelObject({ model: model, data: item })); }); var resultObj = { items: data, count: result.count }; callback(null, resultObj); }); } function load(id, belongsToValues, callback) { if (!callback) { callback = belongsToValues; belongsToValues = undefined; } if (!checkReferences(belongsToValues)) { return callback("belongsToValues has to have properties for references given in belongsTo"); } if (!checkReferenceTypes(belongsToValues)) { return callback("Each property of belongsToValues has to match type with corresponding property of options.fields"); } var filters = {}; for (var i = 0; i < belongsTo.length; i += 1) { filters[belongsTo[i]] = belongsToValues[belongsTo[i]]; } proxy.readOneById(id, filters, function (err, result) { if (err) { return callback(err); } var modelObject = createModelObject({ model: model, data: result }); callback(null, modelObject); }); } function create(modelValues, callback) { if (!checkReferences(modelValues)) { return callback("modelValues has to have properties for references given in belongsTo"); } if (!checkReferenceTypes(modelValues)) { return callback("Each property of modelValues contained by belongsTo has to match type with corresponding property of options.fields"); } var filters = {}; for (var i = 0; i < belongsTo.length; i += 1) { filters[belongsTo[i]] = modelValues[belongsTo[i]]; } proxy.createOne(modelValues, filters, function (err, result) { if (err) { return callback(err); } callback(null, createModelObject({ model: model, data: result })); }); } var model = Object.freeze({ fields: fields, proxy: proxy, idField: idField, belongsTo: belongsTo, list: list, load: load, create: create }); return model; }; },{"./modelObject":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/model/modelObject.js"}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/model/modelObject.js":[function(require,module,exports){ /*jslint node: true */ "use strict"; var createProp = require("./prop"); module.exports = function createModelObject(options) { if (!options) { options = {}; } if (!options.data) { throw new Error("options.data is mandatory!"); } if (!options.model) { throw new Error("options.model is mandatory!"); } if (!options.model.fields) { throw new Error("options.model.fields is mandatory!"); } if (!options.model.idField) { throw new Error("options.model.idField is mandatory!"); } if (typeof options.data[options.model.idField] === "undefined") { throw new Error("options.data has to have a property with same name as value of options.model.idField!"); } if (!options.model.proxy) { throw new Error("options.model.proxy is mandatory!"); } if (options.model.belongsTo && !Array.isArray(options.model.belongsTo)) { throw new Error("options.model.belongsTo has to be an array!"); } if (Array.isArray(options.model.belongsTo)) { for (var i = 0; i < options.model.belongsTo.length; i += 1) { if (!options.model.fields[options.model.belongsTo[i]]) { throw new Error("options.model.belongsTo has to contain field names!"); } } } var model = options.model; var fields = options.model.fields; var idField = options.model.idField; var proxy = options.model.proxy; var belongsTo = options.model.belongsTo || []; var writeOutput = writeData(options.data); var belongsToValues = writeOutput.belongsToValues; var obj = { data: writeOutput.data, model: model, save: save, patch: patch, destroy: destroy }; for (var i = 0; i < belongsTo.length; i += 1) { if (!obj.data[belongsTo[i]]) { throw new Error("data has to have properties for references given in belongsTo"); } } var lastDataValue = JSON.parse(JSON.stringify(obj.data)); function writeData(dataToWrite) { var data = {}; var belongsToValues = {}; for (var prop in fields) { var actField = fields[prop]; var actValue = dataToWrite.hasOwnProperty(prop) ? dataToWrite[prop] : actField.defaultValue; createProp(data, prop, { value: actValue, beforeChange: createBeforeChangeFunction(prop), afterChange: createAfterChangeFunction(prop) }); } for (var i = 0; i < belongsTo.length; i += 1) { belongsToValues[belongsTo[i]] = data[belongsTo[i]]; } return { data: data, belongsToValues: belongsToValues }; } function createBeforeChangeFunction(propName) { return function beforeChange(values) { validate(propName, values); //var field = fields[propName]; /* if (field.beforeChange) { if (typeof field.beforeChange === "function") { } } */ }; } function createAfterChangeFunction() { return function afterChange() {}; } function validate(propName) { var field = fields[propName]; if (!field) { return; } if (!field.validators) { return; } } function createDiff() { var diff = {}; for (var prop in obj.data) { if (obj.data.hasOwnProperty(prop)) { if (JSON.stringify(obj.data[prop]) !== JSON.stringify(lastDataValue[prop])) { diff[prop] = obj.data[prop]; } } } return diff; } function save(callback) { var diff = createDiff(); if (Object.keys(diff).length === 0) { return callback(null, obj); } var id = obj.data[idField]; proxy.updateOneById(id, obj.data, belongsToValues, function (err, result) { if (err) { return callback(err); } var writeOutput = writeData(result); belongsToValues = writeOutput.belongsToValues; obj.data = writeOutput.data; lastDataValue = JSON.parse(JSON.stringify(writeOutput.data)); callback(null, obj); }); } function patch(callback) { var diff = createDiff(); if (Object.keys(diff).length === 0) { return callback(null, obj); } var id = obj.data[idField]; proxy.patchOneById(id, diff, belongsToValues, function (err, result) { if (err) { return callback(err); } var writeOutput = writeData(result); belongsToValues = writeOutput.belongsToValues; obj.data = writeOutput.data; lastDataValue = JSON.parse(JSON.stringify(writeOutput.data)); callback(null, obj); }); } //deleted flag? function destroy(callback) { var id = obj.data[idField]; proxy.destroyOneById(id, belongsToValues, function (err) { if (err) { return callback(err); } callback(null, obj); }); } return obj; }; },{"./prop":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/model/prop.js"}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/model/prop.js":[function(require,module,exports){ /*jslint node: true */ "use strict"; module.exports = function createProp(obj, name, config) { //should be called field config = config || {}; var initialValue = config.value; var value = initialValue; var lastValue = value; Object.defineProperty(obj, name, { enumerable: true, configurable: false, set: set, get: get }); function set(newVal) { if (newVal === value) { return; } if (typeof config.beforeChange === "function") { config.beforeChange({ lastValue: lastValue, value: value, newValue: newVal, initialValue: initialValue }); } lastValue = value; value = newVal; if (typeof config.afterChange === "function") { config.afterChange({ lastValue: lastValue, value: value, newValue: newVal, initialValue: initialValue }); } } function get() { return value; } return obj; }; },{}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/proxy/ajax.js":[function(require,module,exports){ (function (global){ /* * Ajax proxy shell */ /*jslint node: true */ "use strict"; var createReader = require("../reader/json"); var ajaxCore = require("./ajaxCore"); var request = require("superagent"); // var isNode = new Function("try {return this===global;}catch(e){return false;}"); var environment; try { environment = window ? window : global; } catch (e) { environment = global; } var formData = environment.FormData; if (!formData) { formData = require("form-data"); } var ajaxHelpers = require("./ajaxHelpers")({ request: request, createReader: createReader }); module.exports = ajaxCore({ ajaxHelpers: ajaxHelpers, FormData: formData }); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../reader/json":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/reader/json.js","./ajaxCore":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/proxy/ajaxCore.js","./ajaxHelpers":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/proxy/ajaxHelpers.js","form-data":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/form-data/lib/browser.js","superagent":"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/node_modules/superagent/lib/client.js"}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/proxy/ajaxCore.js":[function(require,module,exports){ /* * Ajax proxy core */ /*jslint node: true */ "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var defaultTimeout = 3000; module.exports = function (dependencies) { if (!dependencies) { throw new Error("dependencies is mandatory!"); } if (!dependencies.ajaxHelpers) { throw new Error("dependencies.ajaxHelpers is mandatory!"); } if (!dependencies.FormData) { throw new Error("dependencies.FormData is mandatory!"); } var ajaxHelpers = dependencies.ajaxHelpers; var createOperationConfig = ajaxHelpers.createOperationConfig; var dispatchAjax = ajaxHelpers.dispatchAjax; var prepareOperationsConfig = ajaxHelpers.prepareOperationsConfig; var assert = ajaxHelpers.assert; var FormData = dependencies.FormData; return function createAjaxProxy(config) { if (!config) { config = {}; } if (!config.idProperty) { throw new Error("config.idProperty is mandatory!"); } if (!config.operations) { throw new Error("config.operations is mandatory!"); } if (config.fieldsToBeExcluded) { if (!Array.isArray(config.fieldsToBeExcluded)) { throw Error("config.fieldsToBeExcluded should be an array!"); } } var idProperty = config.idProperty; var timeout = config.timeout || defaultTimeout; var generateId = config.generateId || function () { var nextId = 0; return function () { return nextId += 1; }; }(); var queryMapping = config.queryMapping; var fieldsToBeExcluded = config.fieldsToBeExcluded; function removeFields(object, fields) { if (!fields) { return; } for (var i = 0; i < fields.length; i += 1) { for (var prop in object) { if (fields[i] === prop) { delete object[prop]; } } } } prepareOperationsConfig(config.operations); function createOne(data, filters, callback) { if (!callback) { callback = filters; filters = undefined; } removeFields(data, fieldsToBeExcluded); checkCallback(callback); var actConfig = createOperationConfig(config.operations.createOne, timeout, null, data); if (data.constructor === FormData) { actConfig.formData = true; } actConfig.idProperty = idProperty; dispatchAjax(actConfig, filters, callback); } function read(options, filters, callback) { if (!callback) { callback = filters; filters = undefined; } checkCallback(callback); if (typeof queryMapping === "function") { options = queryMapping(options); } var actConfig = createOperationConfig(config.operations.read, timeout); for (var prop in options) { actConfig.queries[prop] = _typeof(options[prop]) === "object" ? JSON.stringify(options[prop]) : options[prop]; // actConfig.queries[prop] = options[prop]; } actConfig.method = actConfig.method.toLowerCase(); dispatchAjax(actConfig, filters, callback); } function readOneById(id, filters, callback) { if (!callback) { callback = filters; filters = undefined; } checkCallback(callback); var actConfig = createOperationConfig(config.operations.readOneById, timeout, id); dispatchAjax(actConfig, filters, callback); } function updateOneById(id, newData, filters, callback) { if (!callback) { callback = filters; filters = undefined; } removeFields(newData, fieldsToBeExcluded); checkCallback(callback); var actConfig = createOperationConfig(config.operations.updateOneById, timeout, id, newData); dispatchAjax(actConfig, filters, callback); } function patchOneById(id, newData, filters, callback) { if (!callback) { callback = filters; filters = undefined; } removeFields(newData, fieldsToBeExcluded); checkCallback(callback); var actConfig = createOperationConfig(config.operations.patchOneById, timeout, id, newData); dispatchAjax(actConfig, filters, callback); } function destroyOneById(id, filters, callback) { if (!callback) { callback = filters; filters = undefined; } checkCallback(callback); var actConfig = createOperationConfig(config.operations.destroyOneById, timeout, id); dispatchAjax(actConfig, filters, callback); } function checkCallback(callback) { assert(typeof callback === "function", "callback should be a function"); } return Object.freeze({ idProperty: idProperty, generateId: generateId, read: read, createOne: createOne, readOneById: readOneById, patchOneById: patchOneById, updateOneById: updateOneById, destroyOneById: destroyOneById }); }; }; },{}],"/var/lib/jenkins/workspace/DMdesigner_superdata_master-FIZMR43IRA6LJDHEA4SITDEYPVZI5NQ5UJMVH6MHSS4DIJV56ZIQ/src/proxy/ajaxHelpers.js":[function(require,module,exports){ /* * AjaxHelper core */ /*jslint node: true */ "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var defaultTimeout = 3000; module.exports = function (dependencies) { if (!dependencies.request) { throw new Error("dependencies.request is mandatory!"); } if (!dependencies.createReader) { throw new Error("dependencies.createReader is mandatory!"); } var request = dependencies.request; var createReader = dependencies.createReader; function createOperationConfig(config, timeout, id, data) { var newConfig = {}; for (var prop in config) { newConfig[prop] = config[prop]; } if (data) { newConfig.data = data; } else { newConfig.data = {}; } newConfig.id = id; newConfig.timeout = newConfig.timeout || timeout || defaultTimeout; return newConfig; } function dispatchAjax(actConfig, filters, callback) { if (typeof actConfig.route === "string") { actConfig.route = [actConfig.route]; } if (!callback) { callback = filters; filters = undefined; } var timeout = actConfig.timeout || defaultTimeout; var idProperty = actConfig.idProperty; var actRouteIdx = 0; var actRoute = actConfig.route[actRouteIdx]; function dispatch(retries) { if (filters) { for (var filter in filters) { var regex = new Reg