(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.coreapi = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, BasicAuthentication); var username = options.username; var password = options.password; var hash = window.btoa(username + ':' + password); this.auth = 'Basic ' + hash; } _createClass(BasicAuthentication, [{ key: 'authenticate', value: function authenticate(options) { options.headers['Authorization'] = this.auth; return options; } }]); return BasicAuthentication; }(); module.exports = { BasicAuthentication: BasicAuthentication }; },{}],2:[function(require,module,exports){ 'use strict'; var basic = require('./basic'); var session = require('./session'); var token = require('./token'); module.exports = { BasicAuthentication: basic.BasicAuthentication, SessionAuthentication: session.SessionAuthentication, TokenAuthentication: token.TokenAuthentication }; },{"./basic":1,"./session":3,"./token":4}],3:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var utils = require('../utils'); function trim(str) { return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } function getCookie(cookieName, cookieString) { cookieString = cookieString || window.document.cookie; if (cookieString && cookieString !== '') { var cookies = cookieString.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, cookieName.length + 1) === cookieName + '=') { return decodeURIComponent(cookie.substring(cookieName.length + 1)); } } } return null; } var SessionAuthentication = function () { function SessionAuthentication() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, SessionAuthentication); this.csrfToken = getCookie(options.csrfCookieName, options.cookieString); this.csrfHeaderName = options.csrfHeaderName; } _createClass(SessionAuthentication, [{ key: 'authenticate', value: function authenticate(options) { options.credentials = 'same-origin'; if (this.csrfToken && !utils.csrfSafeMethod(options.method)) { options.headers[this.csrfHeaderName] = this.csrfToken; } return options; } }]); return SessionAuthentication; }(); module.exports = { SessionAuthentication: SessionAuthentication }; },{"../utils":15}],4:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var TokenAuthentication = function () { function TokenAuthentication() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, TokenAuthentication); this.token = options.token; this.scheme = options.scheme || 'Bearer'; } _createClass(TokenAuthentication, [{ key: 'authenticate', value: function authenticate(options) { options.headers['Authorization'] = this.scheme + ' ' + this.token; return options; } }]); return TokenAuthentication; }(); module.exports = { TokenAuthentication: TokenAuthentication }; },{}],5:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var document = require('./document'); var codecs = require('./codecs'); var errors = require('./errors'); var transports = require('./transports'); var utils = require('./utils'); function lookupLink(node, keys) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; if (node instanceof document.Document) { node = node.content[key]; } else { node = node[key]; } if (node === undefined) { throw new errors.LinkLookupError('Invalid link lookup: ' + JSON.stringify(keys)); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } if (!(node instanceof document.Link)) { throw new errors.LinkLookupError('Invalid link lookup: ' + JSON.stringify(keys)); } return node; } var Client = function () { function Client() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Client); var transportOptions = { auth: options.auth || null, headers: options.headers || {}, requestCallback: options.requestCallback, responseCallback: options.responseCallback }; this.decoders = options.decoders || [new codecs.CoreJSONCodec(), new codecs.JSONCodec(), new codecs.TextCodec()]; this.transports = options.transports || [new transports.HTTPTransport(transportOptions)]; } _createClass(Client, [{ key: 'action', value: function action(document, keys) { var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var link = lookupLink(document, keys); var transport = utils.determineTransport(this.transports, link.url); return transport.action(link, this.decoders, params); } }, { key: 'get', value: function get(url) { var link = new document.Link(url, 'get'); var transport = utils.determineTransport(this.transports, url); return transport.action(link, this.decoders); } }]); return Client; }(); module.exports = { Client: Client }; },{"./codecs":7,"./document":10,"./errors":11,"./transports":14,"./utils":15}],6:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 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; }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var document = require('../document'); var URL = require('url-parse'); function unescapeKey(key) { if (key.match(/__(type|meta)$/)) { return key.substring(1); } return key; } function getString(obj, key) { var value = obj[key]; if (typeof value === 'string') { return value; } return ''; } function getBoolean(obj, key) { var value = obj[key]; if (typeof value === 'boolean') { return value; } return false; } function getObject(obj, key) { var value = obj[key]; if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') { return value; } return {}; } function getArray(obj, key) { var value = obj[key]; if (value instanceof Array) { return value; } return []; } function getContent(data, baseUrl) { var excluded = ['_type', '_meta']; var content = {}; for (var property in data) { if (data.hasOwnProperty(property) && !excluded.includes(property)) { var key = unescapeKey(property); var value = primitiveToNode(data[property], baseUrl); content[key] = value; } } return content; } function primitiveToNode(data, baseUrl) { var isObject = data instanceof Object && !(data instanceof Array); if (isObject && data._type === 'document') { // Document var meta = getObject(data, '_meta'); var relativeUrl = getString(meta, 'url'); var url = relativeUrl ? URL(relativeUrl, baseUrl).toString() : ''; var title = getString(meta, 'title'); var description = getString(meta, 'description'); var content = getContent(data, url); return new document.Document(url, title, description, content); } else if (isObject && data._type === 'link') { // Link var _relativeUrl = getString(data, 'url'); var _url = _relativeUrl ? URL(_relativeUrl, baseUrl).toString() : ''; var method = getString(data, 'action') || 'get'; var _title = getString(data, 'title'); var _description = getString(data, 'description'); var fieldsData = getArray(data, 'fields'); var fields = []; for (var idx = 0, len = fieldsData.length; idx < len; idx++) { var value = fieldsData[idx]; var name = getString(value, 'name'); var required = getBoolean(value, 'required'); var location = getString(value, 'location'); var fieldDescription = getString(value, 'fieldDescription'); var field = new document.Field(name, required, location, fieldDescription); fields.push(field); } return new document.Link(_url, method, 'application/json', fields, _title, _description); } else if (isObject) { // Object var _content = {}; for (var key in data) { if (data.hasOwnProperty(key)) { _content[key] = primitiveToNode(data[key], baseUrl); } } return _content; } else if (data instanceof Array) { // Object var _content2 = []; for (var _idx = 0, _len = data.length; _idx < _len; _idx++) { _content2.push(primitiveToNode(data[_idx], baseUrl)); } return _content2; } // Primitive return data; } var CoreJSONCodec = function () { function CoreJSONCodec() { _classCallCheck(this, CoreJSONCodec); this.mediaType = 'application/coreapi+json'; } _createClass(CoreJSONCodec, [{ key: 'decode', value: function decode(text) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var data = text; if (options.preloaded === undefined || !options.preloaded) { data = JSON.parse(text); } return primitiveToNode(data, options.url); } }]); return CoreJSONCodec; }(); module.exports = { CoreJSONCodec: CoreJSONCodec }; },{"../document":10,"url-parse":19}],7:[function(require,module,exports){ 'use strict'; var corejson = require('./corejson'); var json = require('./json'); var text = require('./text'); module.exports = { CoreJSONCodec: corejson.CoreJSONCodec, JSONCodec: json.JSONCodec, TextCodec: text.TextCodec }; },{"./corejson":6,"./json":8,"./text":9}],8:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var JSONCodec = function () { function JSONCodec() { _classCallCheck(this, JSONCodec); this.mediaType = 'application/json'; } _createClass(JSONCodec, [{ key: 'decode', value: function decode(text) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return JSON.parse(text); } }]); return JSONCodec; }(); module.exports = { JSONCodec: JSONCodec }; },{}],9:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var TextCodec = function () { function TextCodec() { _classCallCheck(this, TextCodec); this.mediaType = 'text/*'; } _createClass(TextCodec, [{ key: 'decode', value: function decode(text) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return text; } }]); return TextCodec; }(); module.exports = { TextCodec: TextCodec }; },{}],10:[function(require,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Document = function Document() { var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var description = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var content = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; _classCallCheck(this, Document); this.url = url; this.title = title; this.description = description; this.content = content; }; var Link = function Link(url, method) { var encoding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'application/json'; var fields = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var title = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; var description = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : ''; _classCallCheck(this, Link); if (url === undefined) { throw new Error('url argument is required'); } if (method === undefined) { throw new Error('method argument is required'); } this.url = url; this.method = method; this.encoding = encoding; this.fields = fields; this.title = title; this.description = description; }; var Field = function Field(name) { var required = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var location = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var description = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; _classCallCheck(this, Field); if (name === undefined) { throw new Error('name argument is required'); } this.name = name; this.required = required; this.location = location; this.description = description; }; module.exports = { Document: Document, Link: Link, Field: Field }; },{}],11:[function(require,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ParameterError = function (_Error) { _inherits(ParameterError, _Error); function ParameterError(message) { _classCallCheck(this, ParameterError); var _this = _possibleConstructorReturn(this, (ParameterError.__proto__ || Object.getPrototypeOf(ParameterError)).call(this, message)); _this.message = message; _this.name = 'ParameterError'; return _this; } return ParameterError; }(Error); var LinkLookupError = function (_Error2) { _inherits(LinkLookupError, _Error2); function LinkLookupError(message) { _classCallCheck(this, LinkLookupError); var _this2 = _possibleConstructorReturn(this, (LinkLookupError.__proto__ || Object.getPrototypeOf(LinkLookupError)).call(this, message)); _this2.message = message; _this2.name = 'LinkLookupError'; return _this2; } return LinkLookupError; }(Error); var ErrorMessage = function (_Error3) { _inherits(ErrorMessage, _Error3); function ErrorMessage(message, content) { _classCallCheck(this, ErrorMessage); var _this3 = _possibleConstructorReturn(this, (ErrorMessage.__proto__ || Object.getPrototypeOf(ErrorMessage)).call(this, message)); _this3.message = message; _this3.content = content; _this3.name = 'ErrorMessage'; return _this3; } return ErrorMessage; }(Error); module.exports = { ParameterError: ParameterError, LinkLookupError: LinkLookupError, ErrorMessage: ErrorMessage }; },{}],12:[function(require,module,exports){ 'use strict'; var auth = require('./auth'); var client = require('./client'); var codecs = require('./codecs'); var document = require('./document'); var errors = require('./errors'); var transports = require('./transports'); var utils = require('./utils'); var coreapi = { Client: client.Client, Document: document.Document, Link: document.Link, auth: auth, codecs: codecs, errors: errors, transports: transports, utils: utils }; module.exports = coreapi; },{"./auth":2,"./client":5,"./codecs":7,"./document":10,"./errors":11,"./transports":14,"./utils":15}],13:[function(require,module,exports){ 'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var fetch = require('isomorphic-fetch'); var errors = require('../errors'); var utils = require('../utils'); var URL = require('url-parse'); var urlTemplate = require('url-template'); var parseResponse = function parseResponse(response, decoders, responseCallback) { return response.text().then(function (text) { if (responseCallback) { responseCallback(response, text); } var contentType = response.headers.get('Content-Type'); var decoder = utils.negotiateDecoder(decoders, contentType); var options = { url: response.url }; return decoder.decode(text, options); }); }; var HTTPTransport = function () { function HTTPTransport() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, HTTPTransport); this.schemes = ['http', 'https']; this.auth = options.auth || null; this.headers = options.headers || {}; this.fetch = options.fetch || fetch; this.FormData = options.FormData || window.FormData; this.requestCallback = options.requestCallback; this.responseCallback = options.responseCallback; } _createClass(HTTPTransport, [{ key: 'buildRequest', value: function buildRequest(link, decoders) { var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var fields = link.fields; var method = link.method.toUpperCase(); var queryParams = {}; var pathParams = {}; var formParams = {}; var fieldNames = []; var hasBody = false; for (var idx = 0, len = fields.length; idx < len; idx++) { var field = fields[idx]; // Ensure any required fields are included if (!params.hasOwnProperty(field.name)) { if (field.required) { throw new errors.ParameterError('Missing required field: "' + field.name + '"'); } else { continue; } } fieldNames.push(field.name); if (field.location === 'query') { queryParams[field.name] = params[field.name]; } else if (field.location === 'path') { pathParams[field.name] = params[field.name]; } else if (field.location === 'form') { formParams[field.name] = params[field.name]; hasBody = true; } else if (field.location === 'body') { formParams = params[field.name]; hasBody = true; } } // Check for any parameters that did not have a matching field for (var property in params) { if (params.hasOwnProperty(property) && !fieldNames.includes(property)) { throw new errors.ParameterError('Unknown parameter: "' + property + '"'); } } var requestOptions = { method: method, headers: {} }; Object.assign(requestOptions.headers, this.headers); if (hasBody) { if (link.encoding === 'application/json') { requestOptions.body = JSON.stringify(formParams); requestOptions.headers['Content-Type'] = 'application/json'; } else if (link.encoding === 'multipart/form-data') { var form = new this.FormData(); for (var paramKey in formParams) { form.append(paramKey, formParams[paramKey]); } requestOptions.body = form; } else if (link.encoding === 'application/x-www-form-urlencoded') { var formBody = []; for (var _paramKey in formParams) { var encodedKey = encodeURIComponent(_paramKey); var encodedValue = encodeURIComponent(formParams[_paramKey]); formBody.push(encodedKey + '=' + encodedValue); } formBody = formBody.join('&'); requestOptions.body = formBody; requestOptions.headers['Content-Type'] = 'application/x-www-form-urlencoded'; } } if (this.auth) { requestOptions = this.auth.authenticate(requestOptions); } var parsedUrl = urlTemplate.parse(link.url); parsedUrl = parsedUrl.expand(pathParams); parsedUrl = new URL(parsedUrl); parsedUrl.set('query', queryParams); return { url: parsedUrl.toString(), options: requestOptions }; } }, { key: 'action', value: function action(link, decoders) { var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var responseCallback = this.responseCallback; var request = this.buildRequest(link, decoders, params); if (this.requestCallback) { this.requestCallback(request); } return this.fetch(request.url, request.options).then(function (response) { if (response.status === 204) { return; } return parseResponse(response, decoders, responseCallback).then(function (data) { if (response.ok) { return data; } else { var title = response.status + ' ' + response.statusText; var error = new errors.ErrorMessage(title, data); return Promise.reject(error); } }); }); } }]); return HTTPTransport; }(); module.exports = { HTTPTransport: HTTPTransport }; },{"../errors":11,"../utils":15,"isomorphic-fetch":16,"url-parse":19,"url-template":21}],14:[function(require,module,exports){ 'use strict'; var http = require('./http'); module.exports = { HTTPTransport: http.HTTPTransport }; },{"./http":13}],15:[function(require,module,exports){ 'use strict'; var URL = require('url-parse'); var determineTransport = function determineTransport(transports, url) { var parsedUrl = new URL(url); var scheme = parsedUrl.protocol.replace(':', ''); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = transports[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var transport = _step.value; if (transport.schemes.includes(scheme)) { return transport; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } throw Error('Unsupported scheme in URL: ' + url); }; var negotiateDecoder = function negotiateDecoder(decoders, contentType) { if (contentType === undefined || contentType === null) { return decoders[0]; } var fullType = contentType.toLowerCase().split(';')[0].trim(); var mainType = fullType.split('/')[0] + '/*'; var wildcardType = '*/*'; var acceptableTypes = [fullType, mainType, wildcardType]; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = decoders[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var decoder = _step2.value; if (acceptableTypes.includes(decoder.mediaType)) { return decoder; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } throw Error('Unsupported media in Content-Type header: ' + contentType); }; var csrfSafeMethod = function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method) ); }; module.exports = { determineTransport: determineTransport, negotiateDecoder: negotiateDecoder, csrfSafeMethod: csrfSafeMethod }; },{"url-parse":19}],16:[function(require,module,exports){ // the whatwg-fetch polyfill installs the fetch() function // on the global object (window or self) // // Return that as the export for use in Webpack, Browserify etc. require('whatwg-fetch'); module.exports = self.fetch.bind(self); },{"whatwg-fetch":22}],17:[function(require,module,exports){ 'use strict'; var has = Object.prototype.hasOwnProperty; /** * Simple query string parser. * * @param {String} query The query string that needs to be parsed. * @returns {Object} * @api public */ function querystring(query) { var parser = /([^=?&]+)=?([^&]*)/g , result = {} , part; // // Little nifty parsing hack, leverage the fact that RegExp.exec increments // the lastIndex property so we can continue executing this loop until we've // parsed all results. // for (; part = parser.exec(query); result[decodeURIComponent(part[1])] = decodeURIComponent(part[2]) ); return result; } /** * Transform a query string to an object. * * @param {Object} obj Object that should be transformed. * @param {String} prefix Optional prefix. * @returns {String} * @api public */ function querystringify(obj, prefix) { prefix = prefix || ''; var pairs = []; // // Optionally prefix with a '?' if needed // if ('string' !== typeof prefix) prefix = '?'; for (var key in obj) { if (has.call(obj, key)) { pairs.push(encodeURIComponent(key) +'='+ encodeURIComponent(obj[key])); } } return pairs.length ? prefix + pairs.join('&') : ''; } // // Expose the module. // exports.stringify = querystringify; exports.parse = querystring; },{}],18:[function(require,module,exports){ 'use strict'; /** * Check if we're required to add a port number. * * @see https://url.spec.whatwg.org/#default-port * @param {Number|String} port Port number we need to check * @param {String} protocol Protocol we need to check against. * @returns {Boolean} Is it a default port for the given protocol * @api private */ module.exports = function required(port, protocol) { protocol = protocol.split(':')[0]; port = +port; if (!port) return false; switch (protocol) { case 'http': case 'ws': return port !== 80; case 'https': case 'wss': return port !== 443; case 'ftp': return port !== 21; case 'gopher': return port !== 70; case 'file': return false; } return port !== 0; }; },{}],19:[function(require,module,exports){ 'use strict'; var required = require('requires-port') , lolcation = require('./lolcation') , qs = require('querystringify') , protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i; /** * These are the parse rules for the URL parser, it informs the parser * about: * * 0. The char it Needs to parse, if it's a string it should be done using * indexOf, RegExp using exec and NaN means set as current value. * 1. The property we should set when parsing this value. * 2. Indication if it's backwards or forward parsing, when set as number it's * the value of extra chars that should be split off. * 3. Inherit from location if non existing in the parser. * 4. `toLowerCase` the resulting value. */ var rules = [ ['#', 'hash'], // Extract from the back. ['?', 'query'], // Extract from the back. ['/', 'pathname'], // Extract from the back. ['@', 'auth', 1], // Extract from the front. [NaN, 'host', undefined, 1, 1], // Set left over value. [/:(\d+)$/, 'port', undefined, 1], // RegExp the back. [NaN, 'hostname', undefined, 1, 1] // Set left over. ]; /** * @typedef ProtocolExtract * @type Object * @property {String} protocol Protocol matched in the URL, in lowercase. * @property {Boolean} slashes `true` if protocol is followed by "//", else `false`. * @property {String} rest Rest of the URL that is not part of the protocol. */ /** * Extract protocol information from a URL with/without double slash ("//"). * * @param {String} address URL we want to extract from. * @return {ProtocolExtract} Extracted information. * @api private */ function extractProtocol(address) { var match = protocolre.exec(address); return { protocol: match[1] ? match[1].toLowerCase() : '', slashes: !!match[2], rest: match[3] }; } /** * Resolve a relative URL pathname against a base URL pathname. * * @param {String} relative Pathname of the relative URL. * @param {String} base Pathname of the base URL. * @return {String} Resolved pathname. * @api private */ function resolve(relative, base) { var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/')) , i = path.length , last = path[i - 1] , unshift = false , up = 0; while (i--) { if (path[i] === '.') { path.splice(i, 1); } else if (path[i] === '..') { path.splice(i, 1); up++; } else if (up) { if (i === 0) unshift = true; path.splice(i, 1); up--; } } if (unshift) path.unshift(''); if (last === '.' || last === '..') path.push(''); return path.join('/'); } /** * The actual URL instance. Instead of returning an object we've opted-in to * create an actual constructor as it's much more memory efficient and * faster and it pleases my OCD. * * @constructor * @param {String} address URL we want to parse. * @param {Object|String} location Location defaults for relative paths. * @param {Boolean|Function} parser Parser for the query string. * @api public */ function URL(address, location, parser) { if (!(this instanceof URL)) { return new URL(address, location, parser); } var relative, extracted, parse, instruction, index, key , instructions = rules.slice() , type = typeof location , url = this , i = 0; // // The following if statements allows this module two have compatibility with // 2 different API: // // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments // where the boolean indicates that the query string should also be parsed. // // 2. The `URL` interface of the browser which accepts a URL, object as // arguments. The supplied object will be used as default values / fall-back // for relative paths. // if ('object' !== type && 'string' !== type) { parser = location; location = null; } if (parser && 'function' !== typeof parser) parser = qs.parse; location = lolcation(location); // // Extract protocol information before running the instructions. // extracted = extractProtocol(address || ''); relative = !extracted.protocol && !extracted.slashes; url.slashes = extracted.slashes || relative && location.slashes; url.protocol = extracted.protocol || location.protocol || ''; address = extracted.rest; // // When the authority component is absent the URL starts with a path // component. // if (!extracted.slashes) instructions[2] = [/(.*)/, 'pathname']; for (; i < instructions.length; i++) { instruction = instructions[i]; parse = instruction[0]; key = instruction[1]; if (parse !== parse) { url[key] = address; } else if ('string' === typeof parse) { if (~(index = address.indexOf(parse))) { if ('number' === typeof instruction[2]) { url[key] = address.slice(0, index); address = address.slice(index + instruction[2]); } else { url[key] = address.slice(index); address = address.slice(0, index); } } } else if (index = parse.exec(address)) { url[key] = index[1]; address = address.slice(0, index.index); } url[key] = url[key] || ( relative && instruction[3] ? location[key] || '' : '' ); // // Hostname, host and protocol should be lowercased so they can be used to // create a proper `origin`. // if (instruction[4]) url[key] = url[key].toLowerCase(); } // // Also parse the supplied query string in to an object. If we're supplied // with a custom parser as function use that instead of the default build-in // parser. // if (parser) url.query = parser(url.query); // // If the URL is relative, resolve the pathname against the base URL. // if ( relative && location.slashes && url.pathname.charAt(0) !== '/' && (url.pathname !== '' || location.pathname !== '') ) { url.pathname = resolve(url.pathname, location.pathname); } // // We should not add port numbers if they are already the default port number // for a given protocol. As the host also contains the port number we're going // override it with the hostname which contains no port number. // if (!required(url.port, url.protocol)) { url.host = url.hostname; url.port = ''; } // // Parse down the `auth` for the username and password. // url.username = url.password = ''; if (url.auth) { instruction = url.auth.split(':'); url.username = instruction[0] || ''; url.password = instruction[1] || ''; } url.origin = url.protocol && url.host && url.protocol !== 'file:' ? url.protocol +'//'+ url.host : 'null'; // // The href is just the compiled result. // url.href = url.toString(); } /** * This is convenience method for changing properties in the URL instance to * insure that they all propagate correctly. * * @param {String} part Property we need to adjust. * @param {Mixed} value The newly assigned value. * @param {Boolean|Function} fn When setting the query, it will be the function * used to parse the query. * When setting the protocol, double slash will be * removed from the final url if it is true. * @returns {URL} * @api public */ URL.prototype.set = function set(part, value, fn) { var url = this; switch (part) { case 'query': if ('string' === typeof value && value.length) { value = (fn || qs.parse)(value); } url[part] = value; break; case 'port': url[part] = value; if (!required(value, url.protocol)) { url.host = url.hostname; url[part] = ''; } else if (value) { url.host = url.hostname +':'+ value; } break; case 'hostname': url[part] = value; if (url.port) value += ':'+ url.port; url.host = value; break; case 'host': url[part] = value; if (/:\d+$/.test(value)) { value = value.split(':'); url.port = value.pop(); url.hostname = value.join(':'); } else { url.hostname = value; url.port = ''; } break; case 'protocol': url.protocol = value.toLowerCase(); url.slashes = !fn; break; case 'pathname': url.pathname = value.length && value.charAt(0) !== '/' ? '/' + value : value; break; default: url[part] = value; } for (var i = 0; i < rules.length; i++) { var ins = rules[i]; if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase(); } url.origin = url.protocol && url.host && url.protocol !== 'file:' ? url.protocol +'//'+ url.host : 'null'; url.href = url.toString(); return url; }; /** * Transform the properties back in to a valid and full URL string. * * @param {Function} stringify Optional query stringify function. * @returns {String} * @api public */ URL.prototype.toString = function toString(stringify) { if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify; var query , url = this , protocol = url.protocol; if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':'; var result = protocol + (url.slashes ? '//' : ''); if (url.username) { result += url.username; if (url.password) result += ':'+ url.password; result += '@'; } result += url.host + url.pathname; query = 'object' === typeof url.query ? stringify(url.query) : url.query; if (query) result += '?' !== query.charAt(0) ? '?'+ query : query; if (url.hash) result += url.hash; return result; }; // // Expose the URL parser and some additional properties that might be useful for // others or testing. // URL.extractProtocol = extractProtocol; URL.location = lolcation; URL.qs = qs; module.exports = URL; },{"./lolcation":20,"querystringify":17,"requires-port":18}],20:[function(require,module,exports){ (function (global){ 'use strict'; var slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//; /** * These properties should not be copied or inherited from. This is only needed * for all non blob URL's as a blob URL does not include a hash, only the * origin. * * @type {Object} * @private */ var ignore = { hash: 1, query: 1 } , URL; /** * The location object differs when your code is loaded through a normal page, * Worker or through a worker using a blob. And with the blobble begins the * trouble as the location object will contain the URL of the blob, not the * location of the page where our code is loaded in. The actual origin is * encoded in the `pathname` so we can thankfully generate a good "default" * location from it so we can generate proper relative URL's again. * * @param {Object|String} loc Optional default location object. * @returns {Object} lolcation object. * @api public */ module.exports = function lolcation(loc) { loc = loc || global.location || {}; URL = URL || require('./'); var finaldestination = {} , type = typeof loc , key; if ('blob:' === loc.protocol) { finaldestination = new URL(unescape(loc.pathname), {}); } else if ('string' === type) { finaldestination = new URL(loc, {}); for (key in ignore) delete finaldestination[key]; } else if ('object' === type) { for (key in loc) { if (key in ignore) continue; finaldestination[key] = loc[key]; } if (finaldestination.slashes === undefined) { finaldestination.slashes = slashes.test(loc.href); } } return finaldestination; }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./":19}],21:[function(require,module,exports){ (function (root, factory) { if (typeof exports === 'object') { module.exports = factory(); } else if (typeof define === 'function' && define.amd) { define([], factory); } else { root.urltemplate = factory(); } }(this, function () { /** * @constructor */ function UrlTemplate() { } /** * @private * @param {string} str * @return {string} */ UrlTemplate.prototype.encodeReserved = function (str) { return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { if (!/%[0-9A-Fa-f]/.test(part)) { part = encodeURI(part).replace(/%5B/g, '[').replace(/%5D/g, ']'); } return part; }).join(''); }; /** * @private * @param {string} str * @return {string} */ UrlTemplate.prototype.encodeUnreserved = function (str) { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { return '%' + c.charCodeAt(0).toString(16).toUpperCase(); }); } /** * @private * @param {string} operator * @param {string} value * @param {string} key * @return {string} */ UrlTemplate.prototype.encodeValue = function (operator, value, key) { value = (operator === '+' || operator === '#') ? this.encodeReserved(value) : this.encodeUnreserved(value); if (key) { return this.encodeUnreserved(key) + '=' + value; } else { return value; } }; /** * @private * @param {*} value * @return {boolean} */ UrlTemplate.prototype.isDefined = function (value) { return value !== undefined && value !== null; }; /** * @private * @param {string} * @return {boolean} */ UrlTemplate.prototype.isKeyOperator = function (operator) { return operator === ';' || operator === '&' || operator === '?'; }; /** * @private * @param {Object} context * @param {string} operator * @param {string} key * @param {string} modifier */ UrlTemplate.prototype.getValues = function (context, operator, key, modifier) { var value = context[key], result = []; if (this.isDefined(value) && value !== '') { if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { value = value.toString(); if (modifier && modifier !== '*') { value = value.substring(0, parseInt(modifier, 10)); } result.push(this.encodeValue(operator, value, this.isKeyOperator(operator) ? key : null)); } else { if (modifier === '*') { if (Array.isArray(value)) { value.filter(this.isDefined).forEach(function (value) { result.push(this.encodeValue(operator, value, this.isKeyOperator(operator) ? key : null)); }, this); } else { Object.keys(value).forEach(function (k) { if (this.isDefined(value[k])) { result.push(this.encodeValue(operator, value[k], k)); } }, this); } } else { var tmp = []; if (Array.isArray(value)) { value.filter(this.isDefined).forEach(function (value) { tmp.push(this.encodeValue(operator, value)); }, this); } else { Object.keys(value).forEach(function (k) { if (this.isDefined(value[k])) { tmp.push(this.encodeUnreserved(k)); tmp.push(this.encodeValue(operator, value[k].toString())); } }, this); } if (this.isKeyOperator(operator)) { result.push(this.encodeUnreserved(key) + '=' + tmp.join(',')); } else if (tmp.length !== 0) { result.push(tmp.join(',')); } } } } else { if (operator === ';') { if (this.isDefined(value)) { result.push(this.encodeUnreserved(key)); } } else if (value === '' && (operator === '&' || operator === '?')) { result.push(this.encodeUnreserved(key) + '='); } else if (value === '') { result.push(''); } } return result; }; /** * @param {string} template * @return {function(Object):string} */ UrlTemplate.prototype.parse = function (template) { var that = this; var operators = ['+', '#', '.', '/', ';', '?', '&']; return { expand: function (context) { return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { if (expression) { var operator = null, values = []; if (operators.indexOf(expression.charAt(0)) !== -1) { operator = expression.charAt(0); expression = expression.substr(1); } expression.split(/,/g).forEach(function (variable) { var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); values.push.apply(values, that.getValues(context, operator, tmp[1], tmp[2] || tmp[3])); }); if (operator && operator !== '+') { var separator = ','; if (operator === '?') { separator = '&'; } else if (operator !== '#') { separator = operator; } return (values.length !== 0 ? operator : '') + values.join(separator); } else { return values.join(','); } } else { return that.encodeReserved(literal); } }); } }; }; return new UrlTemplate(); })); },{}],22:[function(require,module,exports){ (function(self) { 'use strict'; if (self.fetch) { return } var support = { searchParams: 'URLSearchParams' in self, iterable: 'Symbol' in self && 'iterator' in Symbol, blob: 'FileReader' in self && 'Blob' in self && (function() { try { new Blob() return true } catch(e) { return false } })(), formData: 'FormData' in self, arrayBuffer: 'ArrayBuffer' in self } if (support.arrayBuffer) { var viewClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ] var isDataView = function(obj) { return obj && DataView.prototype.isPrototypeOf(obj) } var isArrayBufferView = ArrayBuffer.isView || function(obj) { return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 } } function normalizeName(name) { if (typeof name !== 'string') { name = String(name) } if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { throw new TypeError('Invalid character in header field name') } return name.toLowerCase() } function normalizeValue(value) { if (typeof value !== 'string') { value = String(value) } return value } // Build a destructive iterator for the value list function iteratorFor(items) { var iterator = { next: function() { var value = items.shift() return {done: value === undefined, value: value} } } if (support.iterable) { iterator[Symbol.iterator] = function() { return iterator } } return iterator } function Headers(headers) { this.map = {} if (headers instanceof Headers) { headers.forEach(function(value, name) { this.append(name, value) }, this) } else if (headers) { Object.getOwnPropertyNames(headers).forEach(function(name) { this.append(name, headers[name]) }, this) } } Headers.prototype.append = function(name, value) { name = normalizeName(name) value = normalizeValue(value) var oldValue = this.map[name] this.map[name] = oldValue ? oldValue+','+value : value } Headers.prototype['delete'] = function(name) { delete this.map[normalizeName(name)] } Headers.prototype.get = function(name) { name = normalizeName(name) return this.has(name) ? this.map[name] : null } Headers.prototype.has = function(name) { return this.map.hasOwnProperty(normalizeName(name)) } Headers.prototype.set = function(name, value) { this.map[normalizeName(name)] = normalizeValue(value) } Headers.prototype.forEach = function(callback, thisArg) { for (var name in this.map) { if (this.map.hasOwnProperty(name)) { callback.call(thisArg, this.map[name], name, this) } } } Headers.prototype.keys = function() { var items = [] this.forEach(function(value, name) { items.push(name) }) return iteratorFor(items) } Headers.prototype.values = function() { var items = [] this.forEach(function(value) { items.push(value) }) return iteratorFor(items) } Headers.prototype.entries = function() { var items = [] this.forEach(function(value, name) { items.push([name, value]) }) return iteratorFor(items) } if (support.iterable) { Headers.prototype[Symbol.iterator] = Headers.prototype.entries } function consumed(body) { if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } body.bodyUsed = true } function fileReaderReady(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result) } reader.onerror = function() { reject(reader.error) } }) } function readBlobAsArrayBuffer(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsArrayBuffer(blob) return promise } function readBlobAsText(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsText(blob) return promise } function bufferClone(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength) view.set(new Uint8Array(buf)) return view.buffer } } function Body() { this.bodyUsed = false this._initBody = function(body) { this._bodyInit = body if (!body) { this._bodyText = '' } else if (typeof body === 'string') { this._bodyText = body } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { this._bodyBlob = body } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { this._bodyFormData = body } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString() } else if (support.arrayBuffer && support.blob && isDataView(body)) { this._bodyArrayBuffer = bufferClone(body.buffer) // IE 10-11 can't handle a DataView body. this._bodyInit = new Blob([this._bodyArrayBuffer]) } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body) } else { throw new Error('unsupported BodyInit type') } if (!this.headers.get('content-type')) { if (typeof body === 'string') { this.headers.set('content-type', 'text/plain;charset=UTF-8') } else if (this._bodyBlob && this._bodyBlob.type) { this.headers.set('content-type', this._bodyBlob.type) } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') } } } if (support.blob) { this.blob = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return Promise.resolve(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(new Blob([this._bodyArrayBuffer])) } else if (this._bodyFormData) { throw new Error('could not read FormData body as blob') } else { return Promise.resolve(new Blob([this._bodyText])) } } } this.text = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return readBlobAsText(this._bodyBlob) } else if (this._bodyArrayBuffer) { var view = new Uint8Array(this._bodyArrayBuffer) var str = String.fromCharCode.apply(null, view) return Promise.resolve(str) } else if (this._bodyFormData) { throw new Error('could not read FormData body as text') } else { return Promise.resolve(this._bodyText) } } if (support.arrayBuffer) { this.arrayBuffer = function() { if (this._bodyArrayBuffer) { return consumed(this) || Promise.resolve(this._bodyArrayBuffer) } else { return this.blob().then(readBlobAsArrayBuffer) } } } if (support.formData) { this.formData = function() { return this.text().then(decode) } } this.json = function() { return this.text().then(JSON.parse) } return this } // HTTP methods whose capitalization should be normalized var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] function normalizeMethod(method) { var upcased = method.toUpperCase() return (methods.indexOf(upcased) > -1) ? upcased : method } function Request(input, options) { options = options || {} var body = options.body if (typeof input === 'string') { this.url = input } else { if (input.bodyUsed) { throw new TypeError('Already read') } this.url = input.url this.credentials = input.credentials if (!options.headers) { this.headers = new Headers(input.headers) } this.method = input.method this.mode = input.mode if (!body && input._bodyInit != null) { body = input._bodyInit input.bodyUsed = true } } this.credentials = options.credentials || this.credentials || 'omit' if (options.headers || !this.headers) { this.headers = new Headers(options.headers) } this.method = normalizeMethod(options.method || this.method || 'GET') this.mode = options.mode || this.mode || null this.referrer = null if ((this.method === 'GET' || this.method === 'HEAD') && body) { throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body) } Request.prototype.clone = function() { return new Request(this, { body: this._bodyInit }) } function decode(body) { var form = new FormData() body.trim().split('&').forEach(function(bytes) { if (bytes) { var split = bytes.split('=') var name = split.shift().replace(/\+/g, ' ') var value = split.join('=').replace(/\+/g, ' ') form.append(decodeURIComponent(name), decodeURIComponent(value)) } }) return form } function parseHeaders(rawHeaders) { var headers = new Headers() rawHeaders.split('\r\n').forEach(function(line) { var parts = line.split(':') var key = parts.shift().trim() if (key) { var value = parts.join(':').trim() headers.append(key, value) } }) return headers } Body.call(Request.prototype) function Response(bodyInit, options) { if (!options) { options = {} } this.type = 'default' this.status = 'status' in options ? options.status : 200 this.ok = this.status >= 200 && this.status < 300 this.statusText = 'statusText' in options ? options.statusText : 'OK' this.headers = new Headers(options.headers) this.url = options.url || '' this._initBody(bodyInit) } Body.call(Response.prototype) Response.prototype.clone = function() { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url }) } Response.error = function() { var response = new Response(null, {status: 0, statusText: ''}) response.type = 'error' return response } var redirectStatuses = [301, 302, 303, 307, 308] Response.redirect = function(url, status) { if (redirectStatuses.indexOf(status) === -1) { throw new RangeError('Invalid status code') } return new Response(null, {status: status, headers: {location: url}}) } self.Headers = Headers self.Request = Request self.Response = Response self.fetch = function(input, init) { return new Promise(function(resolve, reject) { var request = new Request(input, init) var xhr = new XMLHttpRequest() xhr.onload = function() { var options = { status: xhr.status, statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') } options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') var body = 'response' in xhr ? xhr.response : xhr.responseText resolve(new Response(body, options)) } xhr.onerror = function() { reject(new TypeError('Network request failed')) } xhr.ontimeout = function() { reject(new TypeError('Network request failed')) } xhr.open(request.method, request.url, true) if (request.credentials === 'include') { xhr.withCredentials = true } if ('responseType' in xhr && support.blob) { xhr.responseType = 'blob' } request.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value) }) xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) }) } self.fetch.polyfill = true })(typeof self !== 'undefined' ? self : this); },{}]},{},[12])(12) });