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
JavaScript
(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