From e3a2bd5932c9fba5691868bf15af35e4842d9f4d Mon Sep 17 00:00:00 2001 From: khaydarov Date: Thu, 26 Jan 2017 02:41:04 +0300 Subject: [PATCH] image-plugin --- example.html | 12 +- plugins/image/image.js | 567 ++++++++++++++++++++++++++++++----------- whatwg-fetch.js.map | 2 +- 3 files changed, 424 insertions(+), 157 deletions(-) diff --git a/example.html b/example.html index fd54462e..77c4a30c 100644 --- a/example.html +++ b/example.html @@ -132,17 +132,19 @@ showInlineToolbar: true, allowedToPaste: true }, - image: { - type: 'image', + image_extended: { + type: 'image_extended', iconClassname: 'ce-icon-picture', - make: image.make, appendCallback: image.appendCallback, - settings: image.makeSettings, + prepare: image.prepare, + makeSettings: image.makeSettings, render: image.render, save: image.save, isStretched: true, displayInToolbox: true, - enableLineBreaks: false + config: { + uploadUrl : '/club/fetch' + } }, instagram: { type: 'instagram', diff --git a/plugins/image/image.js b/plugins/image/image.js index 1403babc..c7cee244 100644 --- a/plugins/image/image.js +++ b/plugins/image/image.js @@ -1,40 +1,47 @@ /** -* Image plugin for codex-editor -* @author CodeX Team -* -* @version 1.1.3 -*/ - + * Image plugin for codex-editor + * @author CodeX Team + * + * @version 1.2.0 + */ var image = (function(image) { - var elementClasses = { + /** + * @private + * + * CSS classNames + */ + var elementClasses_ = { ce_image : 'ce-image', loading : 'ce-plugin-image__loader', blockStretched: 'ce-block--stretched', uploadedImage : { - centered : 'ce-plugin-image__uploaded--centered', + centered : 'ce-plugin-image__uploaded--centered', stretched : 'ce-plugin-image__uploaded--stretched' }, imageCaption : 'ce-plugin-image__caption', imageWrapper : 'ce-plugin-image__wrapper', formHolder : 'ce-plugin-image__holder', - uploadButton : 'ce-plugin-image__button' + uploadButton : 'ce-plugin-image__button', + imagePreview : 'ce-image__preview' + }; - var holder = null; - - /** Default path to redactors images */ - var path = '/upload/redactor_images/'; - - var ui = { + /** + * + * @private + * + * UI methods + */ + var ui_ = { holder : function(){ var element = document.createElement('DIV'); - element.classList.add(elementClasses.formHolder); - element.classList.add(elementClasses.ce_image); + element.classList.add(elementClasses_.formHolder); + element.classList.add(elementClasses_.ce_image); return element; }, @@ -43,7 +50,7 @@ var image = (function(image) { var button = document.createElement('SPAN'); - button.classList.add(elementClasses.uploadButton); + button.classList.add(elementClasses_.uploadButton); button.innerHTML = ' '; button.innerHTML += 'Загрузить фотографию'; @@ -53,17 +60,18 @@ var image = (function(image) { }, /** - * @param {string} source - file path + * @param {object} file - file path * @param {string} style - css class * @return {object} image - document IMG tag */ - image : function(source, style) { + image : function(file, style) { var image = document.createElement('IMG'); image.classList.add(style); - image.src = source; + image.src = file.url; + image.dataset.bigUrl = file.bigUrl; return image; }, @@ -72,7 +80,7 @@ var image = (function(image) { var div = document.createElement('div'); - div.classList.add(elementClasses.imageWrapper); + div.classList.add(elementClasses_.imageWrapper); return div; }, @@ -81,7 +89,7 @@ var image = (function(image) { var div = document.createElement('div'); - div.classList.add(elementClasses.imageCaption); + div.classList.add(elementClasses_.imageCaption); div.contentEditable = true; return div; @@ -91,14 +99,14 @@ var image = (function(image) { */ makeForm : function() { - var holder = ui.holder(), - uploadButton = ui.uploadButton(); + var holder = ui_.holder(), + uploadButton = ui_.uploadButton(); holder.appendChild(uploadButton); - uploadButton.addEventListener('click', methods.uploadButtonClicked, false ); + uploadButton.addEventListener('click', uploadButtonClicked_, false ); - holder = holder; + image.holder = holder; return holder; }, @@ -113,12 +121,12 @@ var image = (function(image) { */ makeImage : function(data, imageTypeClass, stretched) { - var file = data.file.url, + var file = data.file, text = data.caption, type = data.type, - image = ui.image(file, imageTypeClass), - caption = ui.caption(), - wrapper = ui.wrapper(); + image = ui_.image(file, imageTypeClass), + caption = ui_.caption(), + wrapper = ui_.wrapper(); caption.textContent = text; @@ -135,8 +143,8 @@ var image = (function(image) { */ getImage : function(data) { - var image = data.querySelector('.' + elementClasses.uploadedImage.centered) || - data.querySelector('.' + elementClasses.uploadedImage.stretched); + var image = data.querySelector('.' + elementClasses_.uploadedImage.centered) || + data.querySelector('.' + elementClasses_.uploadedImage.stretched); return image; }, @@ -149,12 +157,12 @@ var image = (function(image) { */ centeredImage : function(data) { - var file = data.file.url, + var file = data.file, text = data.caption, type = data.type, - image = ui.image(file, elementClasses.uploadedImage.centered), - caption = ui.caption(), - wrapper = ui.wrapper(); + image = ui_.image(file, elementClasses_.uploadedImage.centered), + caption = ui_.caption(), + wrapper = ui_.wrapper(); caption.textContent = text; @@ -175,16 +183,17 @@ var image = (function(image) { */ stretchedImage : function(data) { - var file = data.file.url, + var file = data.file, text = data.caption, type = data.type, - image = ui.image(file, elementClasses.uploadedImage.stretched), - caption = ui.caption(), - wrapper = ui.wrapper(); + image = ui_.image(file, elementClasses_.uploadedImage.stretched), + caption = ui_.caption(), + wrapper = ui_.wrapper(); caption.textContent = text; wrapper.dataset.stretched = 'true'; + /** Appeding to the wrapper */ wrapper.appendChild(image); wrapper.appendChild(caption); @@ -192,25 +201,35 @@ var image = (function(image) { return wrapper; } + }; - var methods = { + /** + * @private + * + * After render callback + */ + var uploadButtonClicked_ = function(event) { - uploadButtonClicked : function(event) { + var beforeSend = uploadingCallbacks_.beforeSend, + success = uploadingCallbacks_.success, + error = uploadingCallbacks_.error; - /** Define callbacks */ - codex.transport.selectAndUpload({ - beforeSend: photoUploadingCallbacks.beforeSend, - success: photoUploadingCallbacks.success, - error: photoUploadingCallbacks.error - }); - }, + /** Define callbacks */ + codex.transport.selectAndUpload({ + beforeSend: beforeSend, + success: success, + error: error + }); + }; + + var methods_ = { addSelectTypeClickListener : function(el, type) { el.addEventListener('click', function() { - methods.selectTypeClicked(type); + methods_.selectTypeClicked(type); }, false); @@ -218,126 +237,401 @@ var image = (function(image) { selectTypeClicked : function(type) { - var current = codex.content.currentNode, + var current = codex.content.currentNode, blockContent = current.childNodes[0], - image = ui.getImage(current), - wrapper = current.querySelector('.' + elementClasses.imageWrapper); + image = ui_.getImage(current), + inFeed = false, + wrapper = current.querySelector('.' + elementClasses_.imageWrapper); + + if (!image) { + return; + } + + if (current.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE)) { + inFeed = true; + } /** Clear classList */ current.className = ''; - image.className = ''; + image.className = ''; + + if (inFeed) { + current.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); + } /** Add important first-level class ce_block */ current.classList.add(codex.ui.className.BLOCK_CLASSNAME); if (type === 'stretched') { - image.classList.add(elementClasses.uploadedImage.stretched); + image.classList.add(elementClasses_.uploadedImage.stretched); - blockContent.classList.add(elementClasses.blockStretched); + blockContent.classList.add(elementClasses_.blockStretched); /** Setting dataset for saver */ wrapper.dataset.stretched = true; } else if (type === 'centered') { - image.classList.add(elementClasses.uploadedImage.centered); + image.classList.add(elementClasses_.uploadedImage.centered); - blockContent.classList.remove(elementClasses.blockStretched); + blockContent.classList.remove(elementClasses_.blockStretched); /** Setting dataset for saver */ wrapper.dataset.stretched = false; } + + codex.toolbar.settings.close(); } }; - var photoUploadingCallbacks = { - - /** Before sending ajax request */ - beforeSend : function() { - holder.classList.add(elementClasses.loading); - }, - - /** Photo was uploaded successfully */ - success : function(result) { - - var parsed = JSON.parse(result), - data, - currentBlock = codex.content.currentNode, - imageReady; - - /** - * Preparing {Object} data to draw an image - * @uses make method - */ - data = { - background : false, - border : false, - isStretch : false, - file : { - url : path + 'o_' + parsed.filename, - bigUrl : null, - width : null, - height : null, - additionalData : null - }, - caption : '', - cover : null - }; - - imageReady = image.make(data); - - /** - * If current block is empty, we can replace it to uploaded image - * Or insert new block - */ - codex.content.switchBlock(holder, imageReady, 'image'); - }, - - /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ - error : function(result) { - console.log('Choosen file is not an image or image is corrupted'); - codex.notifications.errorThrown(); - } - - }; - /** - * Public method + * @private + * Callbacks */ - image.make = function ( data ) { + var uploadingCallbacks_ = { - var imageHolder; + ByClick : { + + /** + * Before sending ajax request + */ + beforeSend : function() { + + var input = codex.transport.input, + files = input.files; + + var _validFileExtensions = ["jpg", "jpeg", "bmp", "gif", "png"]; + + var type = files[0].type.split('/'); + + var result = _validFileExtensions.some(function(ext) { + return ext == type[1] + }); + + if (!result) { + return; + } + + var reader = new FileReader(); + reader.readAsDataURL(files[0]); + + reader.onload = function(e) { + + var data = { + background : false, + border : false, + isstretch : false, + file : { + url : e.target.result, + bigUrl : null, + width : null, + height : null, + additionalData : null + }, + caption : '', + cover : null + }; + + var image = make_(data); + + codex.content.switchBlock(image.holder, image, 'image_extended'); + image.classList.add(elementClasses_.imagePreview); + + /** + * Change holder to image + */ + image.holder = image; + }; + + }, + + /** Photo was uploaded successfully */ + success : function(result) { + + var parsed = JSON.parse(result), + data, + currentBlock = codex.content.currentNode; + + /** + * Preparing {Object} data to draw an image + * @uses ceImage.make method + */ + data = parsed.data; + + image.holder.classList.remove(elementClasses_.imagePreview); + + /** + * Change src of image + */ + var img = image.holder.getElementsByTagName('IMG')[0]; + + img.src = parsed.data.file.url; + img.dataset.bigUrl = parsed.data.file.bigUrl; + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error : function(result) { + + var oldHolder = image.holder; + var form = ui_.makeForm(); + + codex.content.switchBlock(oldHolder, form, 'image_extended'); + + } + }, + + ByPaste : { + + /** + * Direct upload + * Any URL that contains image extension + * @param url + */ + uploadImageFromUrl : function(path) { + + var ajaxUrl = image.config.uploadUrl, + file, + image_plugin, + current = codex.content.currentNode, + beforeSend, + success_callback; + + /** When image is uploaded to redactors folder */ + success_callback = function(data) { + + var imageInfo = JSON.parse(data); + + image_plugin.dataset.stretched = false; + image_plugin.dataset.src = imageInfo.file.url; + image_plugin.dataset.bigUrl = imageInfo.file.bigUrl; + image_plugin.dataset.width = imageInfo.file.width; + image_plugin.dataset.height = imageInfo.file.height; + image_plugin.dataset.additionalData = imageInfo.file.additionalData; + + image_plugin.classList.remove(elementClasses_.imagePreview); + + }; + + /** Before sending XMLHTTP request */ + beforeSend = function() { + + var content = current.querySelector('.ce-block__content'); + + var data = { + background: false, + border: false, + isStretch: false, + file: { + url: path, + bigUrl: null, + width: null, + height: null, + additionalData: null + }, + caption: '', + cover: null + }; + + image_plugin = codex.tools.image_extended.make(data); + + image_plugin.classList.add(elementClasses_.imagePreview); + + var img = image_plugin.querySelector('img'); + + codex.content.switchBlock(codex.content.currentNode, image_plugin, 'image_extended'); + + }; + + /** Preparing data for XMLHTTP */ + var data = { + url: image.config.uploadUrl, + type: "POST", + data : { + url: path + }, + beforeSend : beforeSend, + success : success_callback + }; + + codex.core.ajax(data); + } + + }, + + uploadFromUploadCare : function(image) { + + var image_plugin; + + /** Preparing data for XMLHTTP */ + var data = { + url: image.config.uploadUrl, + type: "POST", + data : { + url: image + }, + beforeSend : function() { + + var data = { + background: false, + border: false, + isStretch: false, + file: { + url: image, + bigUrl: null, + width: null, + height: null, + additionalData: null + }, + caption: '', + cover: null + }; + + /** Using Image plugin make method */ + image_plugin = codex.tools.image_extended.make(data); + + image_plugin.classList.add(elementClasses_.imagePreview); + + var img = image_plugin.querySelector('img'); + + codex.content.switchBlock(codex.content.currentNode, image_plugin, 'image_extended'); + + }, + success : function(result) { + + var data = JSON.parse(result); + + image_plugin.dataset.stretched = false; + image_plugin.dataset.src = data.file.url; + image_plugin.dataset.bigUrl = data.file.bigUrl; + image_plugin.dataset.width = data.file.width; + image_plugin.dataset.height = data.file.height; + image_plugin.dataset.additionalData = data.file.additionalData; + + image_plugin.classList.remove(elementClasses_.imagePreview); + } + }; + + codex.core.ajax(data); + } + }; + + /** + * Default image holder which will be replaced after image upload + * @type {null} + */ + image.holder = null; + + /** + * Image path + * @type {null} + */ + image.path = null; + + /** + * Plugin configuration + */ + image.config = null; + + /** + * + * @private + * + * @param data + * @return {*} + * + */ + var make_ = function ( data ) { + + var holder; if (data) { - if ( data.isStretch !== 'true') { - imageHolder = ui.makeImage(data, elementClasses.uploadedImage.centered, 'false'); + if ( data.isstretch || data.isstretch === 'true') { + + holder = ui_.makeImage(data, elementClasses_.uploadedImage.stretched, 'true'); + } else { - imageHolder = ui.makeImage(data, elementClasses.uploadedImage.stretched, 'true'); + + holder = ui_.makeImage(data, elementClasses_.uploadedImage.centered, 'false'); + } + return holder; + } else { - imageHolder = ui.makeForm(); + holder = ui_.makeForm(); + return holder; } - - holder = imageHolder; - return imageHolder; }; /** + * @public + * @param config + */ + image.prepare = function(config) { + image.config = config; + }; + + /** + * @public + * * this tool works when tool is clicked in toolbox */ image.appendCallback = function(event) { /** Upload image and call success callback*/ - methods.uploadButtonClicked(event); + uploadButtonClicked_(event); }; /** + * @public + * + * @param data + * @return {*} + */ + image.render = function( data ) { + + return make_(data); + }; + + /** + * @public + * + * @param block + * @return {{background: boolean, border: boolean, isstretch: boolean, file: {url: (*|string|Object), bigUrl: (null|*), width: *, height: *, additionalData: null}, caption: (string|*|string), cover: null}} + */ + image.save = function ( block ) { + + var content = block, + image = ui_.getImage(content), + caption = content.querySelector('.' + elementClasses_.imageCaption); + + var data = { + background : false, + border : false, + isstretch : content.dataset.stretched === 'true' ? true : false, + file : { + url : image.src, + bigUrl : image.dataset.bigUrl, + width : image.width, + height : image.height, + additionalData :null + }, + caption : caption.textContent, + cover : null + }; + + return data; + }; + + + /** + * @public + * * Settings panel content * @return {Element} element contains all settings */ @@ -361,7 +655,7 @@ var image = (function(image) { selectTypeButton.textContent = types[type]; selectTypeButton.className = 'ce_plugin_image--select_button'; - methods.addSelectTypeClickListener(selectTypeButton, type); + methods_.addSelectTypeClickListener(selectTypeButton, type); holder.appendChild(selectTypeButton); @@ -371,35 +665,6 @@ var image = (function(image) { }; - image.render = function( data ) { - - return image.make(data); - }; - - image.save = function ( block ) { - - var content = block, - image = ui.getImage(content), - caption = content.querySelector('.' + elementClasses.imageCaption); - - var data = { - background : false, - border : false, - isStretch : content.dataset.stretched, - file : { - url : image.src, - bigUrl : null, - width : image.width, - height : image.height, - additionalData :null - }, - caption : caption.textContent, - cover : null - }; - - return data; - }; - return image; })({}); \ No newline at end of file diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index c7f24eae..909d5ad1 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 6ca10f35aaf07c7ccc82?fc0f","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6ca10f35aaf07c7ccc82","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 272a4df8a260c682a916?7f86","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 272a4df8a260c682a916","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file