[
  {
    "path": ".babelrc.js",
    "content": "module.exports = {\n\n  presets: [\n      ['@babel/preset-env', {\n          loose: true,\n          modules: false\n      }]\n  ]\n\n};\n"
  },
  {
    "path": ".circleci/config.yml",
    "content": "version: 2\n\ndefaults: &defaults\n    docker:\n        - image: circleci/node:14-browsers\n    environment:\n        CHROME_BIN: /usr/bin/google-chrome\n    working_directory: ~/vue-resource\n\njobs:\n    build:\n        <<: *defaults\n        steps:\n            - checkout\n            - restore_cache:\n                  key: yarn-{{ checksum \"yarn.lock\" }}\n            - run:\n                  name: Install Dependencies\n                  command: yarn --pure-lockfile\n            - run:\n                  name: Run Tests\n                  command: |\n                      yarn test\n                      yarn karma --browsers Chrome\n            - run:\n                  name: Build Release\n                  command: yarn build\n            - save_cache:\n                  key: yarn-{{ checksum \"yarn.lock\" }}\n                  paths:\n                      - ./node_modules\n"
  },
  {
    "path": ".eslintignore",
    "content": "/node_modules\n/dist\n/test\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  \"root\":true,\n  \"env\": {\n      \"es6\": true,\n      \"browser\": true,\n      \"commonjs\": true,\n  },\n  \"extends\": [\n      \"eslint:recommended\"\n  ],\n  \"parserOptions\": {\n      \"sourceType\": \"module\"\n  },\n  \"rules\": {\n      \"brace-style\": [\"error\", \"1tbs\", {\"allowSingleLine\": true}],\n      \"comma-style\": \"error\",\n      \"comma-spacing\": \"error\",\n      \"eqeqeq\": [\"off\", \"smart\"],\n      \"indent\": \"off\",\n      \"indent-legacy\": [\"error\", 4, {\"SwitchCase\": 1}],\n      \"key-spacing\": \"error\",\n      \"keyword-spacing\": \"error\",\n      \"linebreak-style\": [\"error\", \"unix\"],\n      \"no-multi-spaces\": \"error\",\n      \"no-trailing-spaces\": \"error\",\n      \"no-lone-blocks\": \"error\",\n      \"no-extend-native\": \"error\",\n      \"no-unused-vars\": [\"error\", {\"vars\": \"local\", \"args\": \"none\"}],\n      \"no-empty\": [\"error\", {\"allowEmptyCatch\": true}],\n      \"no-duplicate-imports\": \"error\",\n      \"no-array-constructor\": \"error\",\n      \"no-multiple-empty-lines\": \"error\",\n      \"no-template-curly-in-string\": \"error\",\n      \"no-console\": \"off\",\n      \"object-curly-spacing\": \"error\",\n      \"quotes\": [\"error\", \"single\", {\"avoidEscape\": true}],\n      \"semi\": [\"error\", \"always\"],\n      \"space-infix-ops\": \"error\",\n      \"space-unary-ops\": \"error\",\n      \"space-in-parens\": \"error\",\n      \"space-before-blocks\": \"error\",\n      \"template-curly-spacing\": \"error\"\n  }\n};\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!--\nGot a question?\n===============\nThe issue list of this repo is exclusively for bug reports and feature requests. For questions, please use the following resources:\n\n- Read the docs: https://github.com/pagekit/vue-resource/tree/master/docs\n- Look for/ask questions on stack overflow: http://stackoverflow.com/search?q=vue-resource\n\nThank you!\n-->\n\n<!-- BUG REPORT TEMPLATE -->\n### Reproduction Link\n<!-- A minimal jsfiddle that can reproduce the bug. -->\n<!-- You could start with this template: https://jsfiddle.net/pjjr7e7m/ -->\n\n### Steps to reproduce\n<!-- Incl. which version is used on what browser and device. -->\n\n### What is Expected?\n\n### What is actually happening?\n"
  },
  {
    "path": ".gitignore",
    "content": "/node_modules\n/test/specs.js\n.DS_Store"
  },
  {
    "path": ".npmignore",
    "content": "build\ndocs\nbower.json"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015-2017 steffans\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# vue-resource [![Build](https://circleci.com/gh/pagekit/vue-resource.svg?style=shield)](https://circleci.com/gh/pagekit/vue-resource) [![Downloads](https://img.shields.io/npm/dm/vue-resource.svg)](https://www.npmjs.com/package/vue-resource) [![jsdelivr](https://data.jsdelivr.com/v1/package/npm/vue-resource/badge?style=rounded)](https://www.jsdelivr.com/package/npm/vue-resource) [![Version](https://img.shields.io/npm/v/vue-resource.svg)](https://www.npmjs.com/package/vue-resource) [![License](https://img.shields.io/npm/l/vue-resource.svg)](https://www.npmjs.com/package/vue-resource)\n\nThe plugin for [Vue.js](http://vuejs.org) provides services for making web requests and handle responses using a [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) or JSONP.\n\n## Features\n\n- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API and [URI Templates](https://medialize.github.io/URI.js/uri-template.html)\n- Supports [interceptors](docs/http.md#interceptors) for request and response\n- Supports latest Firefox, Chrome, Safari, Opera and IE9+\n- Supports Vue 1.0 & Vue 2.0\n- Compact size 14KB (5.3KB gzipped)\n\n## Installation\nYou can install it via [yarn](https://yarnpkg.com/) or [NPM](http://npmjs.org/).\n```\n$ yarn add vue-resource\n$ npm install vue-resource\n```\n\n### CDN\nAvailable on [jsdelivr](https://cdn.jsdelivr.net/npm/vue-resource@1.5.3), [unpkg](https://unpkg.com/vue-resource@1.5.3) or [cdnjs](https://cdnjs.com/libraries/vue-resource).\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/vue-resource@1.5.3\"></script>\n```\n\n## Example\n```js\n{\n  // GET /someUrl\n  this.$http.get('/someUrl').then(response => {\n\n    // get body data\n    this.someData = response.body;\n\n  }, response => {\n    // error callback\n  });\n}\n```\n\n## Documentation\n\n- [Configuration](docs/config.md)\n- [HTTP Requests/Response](docs/http.md)\n- [Creating Resources](docs/resource.md)\n- [Code Recipes](docs/recipes.md)\n- [API Reference](docs/api.md)\n\n## Changelog\n\nDetails changes for each release are documented in the [release notes](https://github.com/pagekit/vue-resource/releases).\n\n## Contribution\n\nIf you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/pagekit/vue-resource/issues) or a [pull request](https://github.com/pagekit/vue-resource/pulls).\n\n## License\n\n[MIT](http://opensource.org/licenses/MIT)\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"vue-resource\",\n  \"main\": \"dist/vue-resource.js\",\n  \"version\": \"1.5.3\",\n  \"description\": \"The HTTP client for Vue.js\",\n  \"homepage\": \"https://github.com/pagekit/vue-resource\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"vue\",\n    \"xhr\",\n    \"http\",\n    \"ajax\"\n  ],\n  \"ignore\": [\n    \".*\",\n    \"build\",\n    \"docs\",\n    \"package.json\"\n  ]\n}\n"
  },
  {
    "path": "build/build.js",
    "content": "/* eslint-env node */\n\nconst fs = require('fs');\nconst zlib = require('zlib');\nconst rollup = require('rollup');\nconst uglify = require('uglify-js');\nconst babel = require('rollup-plugin-babel');\nconst replace = require('rollup-plugin-replace');\nconst {name, version, homepage} = require('../package.json');\nconst banner = `/*!\\n * ${name} v${version}\\n * ${homepage}\\n * Released under the MIT License.\\n */\\n`;\n\nrollup.rollup({\n    input: 'src/index.js',\n    plugins: [babel(), replace({__VERSION__: version})]\n})\n.then(bundle =>\n    bundle.generate({\n        banner,\n        format: 'umd',\n        name: 'VueResource'\n    }).then(({code}) => write(`dist/${name}.js`, code, bundle))\n)\n.then(bundle =>\n    write(`dist/${name}.min.js`, banner + '\\n' +\n    uglify.minify(read(`dist/${name}.js`)).code, bundle, true)\n)\n.then(bundle =>\n    bundle.generate({\n        banner,\n        format: 'es',\n        footer: 'export { Url, Http, Resource };'\n    }).then(({code}) => write(`dist/${name}.esm.js`, code, bundle))\n)\n.then(bundle =>\n    bundle.generate({\n        banner,\n        format: 'cjs'\n    }).then(({code}) => write(`dist/${name}.common.js`, code, bundle))\n)\n.catch(logError);\n\nfunction read(path) {\n    return fs.readFileSync(path, 'utf8');\n}\n\nfunction write(dest, code, bundle, zip) {\n    return new Promise((resolve, reject) => {\n        fs.writeFile(dest, code, err => {\n            if (err) return reject(err);\n\n            if (zip) {\n                zlib.gzip(code, (err, zipped) => {\n                    if (err) return reject(err);\n                    console.log(blue(dest) + ' ' + getSize(code) + ' (' + getSize(zipped) + ' gzipped)');\n                });\n            } else {\n                console.log(blue(dest) + ' ' + getSize(code));\n            }\n\n            resolve(bundle);\n        });\n    });\n}\n\nfunction getSize(code) {\n    return (code.length / 1024).toFixed(2) + 'kb';\n}\n\nfunction logError(e) {\n    console.log(e);\n}\n\nfunction blue(str) {\n    return '\\x1b[1m\\x1b[34m' + str + '\\x1b[39m\\x1b[22m';\n}\n"
  },
  {
    "path": "build/release.js",
    "content": "/* eslint-env node */\n\nvar replace = require('replace-in-file');\nvar version = process.argv[2];\n\nreplace({\n    files: 'bower.json',\n    from: /(\"version\"\\s*:\\s*\")\\d+\\.\\d+\\.\\d+(\"\\s*,)/g,\n    to: '$1' + version + '$2'\n});\n\nreplace({\n    files: 'package.json',\n    from: /(\"version\"\\s*:\\s*\")\\d+\\.\\d+\\.\\d+(\"\\s*,)/g,\n    to: '$1' + version + '$2'\n});\n\nreplace({\n    files: 'README.md',\n    from: /(\\/|@)\\d+\\.\\d+\\.\\d+/g,\n    to: '$1' + version\n});\n"
  },
  {
    "path": "dist/README.md",
    "content": "# NOTE!\n\nThe `dist` folder contains the standalone build for vue-resource, however files here are only checked-in when a release happens. If you are on the `dev` branch, files here are **NOT** up to date. Only the `master` branch contains the built files for the latest stable version.\n"
  },
  {
    "path": "dist/vue-resource.common.js",
    "content": "/*!\n * vue-resource v1.5.3\n * https://github.com/pagekit/vue-resource\n * Released under the MIT License.\n */\n\n'use strict';\n\n/**\n * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)\n */\nvar RESOLVED = 0;\nvar REJECTED = 1;\nvar PENDING = 2;\nfunction Promise$1(executor) {\n  this.state = PENDING;\n  this.value = undefined;\n  this.deferred = [];\n  var promise = this;\n\n  try {\n    executor(function (x) {\n      promise.resolve(x);\n    }, function (r) {\n      promise.reject(r);\n    });\n  } catch (e) {\n    promise.reject(e);\n  }\n}\n\nPromise$1.reject = function (r) {\n  return new Promise$1(function (resolve, reject) {\n    reject(r);\n  });\n};\n\nPromise$1.resolve = function (x) {\n  return new Promise$1(function (resolve, reject) {\n    resolve(x);\n  });\n};\n\nPromise$1.all = function all(iterable) {\n  return new Promise$1(function (resolve, reject) {\n    var count = 0,\n        result = [];\n\n    if (iterable.length === 0) {\n      resolve(result);\n    }\n\n    function resolver(i) {\n      return function (x) {\n        result[i] = x;\n        count += 1;\n\n        if (count === iterable.length) {\n          resolve(result);\n        }\n      };\n    }\n\n    for (var i = 0; i < iterable.length; i += 1) {\n      Promise$1.resolve(iterable[i]).then(resolver(i), reject);\n    }\n  });\n};\n\nPromise$1.race = function race(iterable) {\n  return new Promise$1(function (resolve, reject) {\n    for (var i = 0; i < iterable.length; i += 1) {\n      Promise$1.resolve(iterable[i]).then(resolve, reject);\n    }\n  });\n};\n\nvar p = Promise$1.prototype;\n\np.resolve = function resolve(x) {\n  var promise = this;\n\n  if (promise.state === PENDING) {\n    if (x === promise) {\n      throw new TypeError('Promise settled with itself.');\n    }\n\n    var called = false;\n\n    try {\n      var then = x && x['then'];\n\n      if (x !== null && typeof x === 'object' && typeof then === 'function') {\n        then.call(x, function (x) {\n          if (!called) {\n            promise.resolve(x);\n          }\n\n          called = true;\n        }, function (r) {\n          if (!called) {\n            promise.reject(r);\n          }\n\n          called = true;\n        });\n        return;\n      }\n    } catch (e) {\n      if (!called) {\n        promise.reject(e);\n      }\n\n      return;\n    }\n\n    promise.state = RESOLVED;\n    promise.value = x;\n    promise.notify();\n  }\n};\n\np.reject = function reject(reason) {\n  var promise = this;\n\n  if (promise.state === PENDING) {\n    if (reason === promise) {\n      throw new TypeError('Promise settled with itself.');\n    }\n\n    promise.state = REJECTED;\n    promise.value = reason;\n    promise.notify();\n  }\n};\n\np.notify = function notify() {\n  var promise = this;\n  nextTick(function () {\n    if (promise.state !== PENDING) {\n      while (promise.deferred.length) {\n        var deferred = promise.deferred.shift(),\n            onResolved = deferred[0],\n            onRejected = deferred[1],\n            resolve = deferred[2],\n            reject = deferred[3];\n\n        try {\n          if (promise.state === RESOLVED) {\n            if (typeof onResolved === 'function') {\n              resolve(onResolved.call(undefined, promise.value));\n            } else {\n              resolve(promise.value);\n            }\n          } else if (promise.state === REJECTED) {\n            if (typeof onRejected === 'function') {\n              resolve(onRejected.call(undefined, promise.value));\n            } else {\n              reject(promise.value);\n            }\n          }\n        } catch (e) {\n          reject(e);\n        }\n      }\n    }\n  });\n};\n\np.then = function then(onResolved, onRejected) {\n  var promise = this;\n  return new Promise$1(function (resolve, reject) {\n    promise.deferred.push([onResolved, onRejected, resolve, reject]);\n    promise.notify();\n  });\n};\n\np[\"catch\"] = function (onRejected) {\n  return this.then(undefined, onRejected);\n};\n\n/**\n * Promise adapter.\n */\n\nif (typeof Promise === 'undefined') {\n  window.Promise = Promise$1;\n}\n\nfunction PromiseObj(executor, context) {\n  if (executor instanceof Promise) {\n    this.promise = executor;\n  } else {\n    this.promise = new Promise(executor.bind(context));\n  }\n\n  this.context = context;\n}\n\nPromiseObj.all = function (iterable, context) {\n  return new PromiseObj(Promise.all(iterable), context);\n};\n\nPromiseObj.resolve = function (value, context) {\n  return new PromiseObj(Promise.resolve(value), context);\n};\n\nPromiseObj.reject = function (reason, context) {\n  return new PromiseObj(Promise.reject(reason), context);\n};\n\nPromiseObj.race = function (iterable, context) {\n  return new PromiseObj(Promise.race(iterable), context);\n};\n\nvar p$1 = PromiseObj.prototype;\n\np$1.bind = function (context) {\n  this.context = context;\n  return this;\n};\n\np$1.then = function (fulfilled, rejected) {\n  if (fulfilled && fulfilled.bind && this.context) {\n    fulfilled = fulfilled.bind(this.context);\n  }\n\n  if (rejected && rejected.bind && this.context) {\n    rejected = rejected.bind(this.context);\n  }\n\n  return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);\n};\n\np$1[\"catch\"] = function (rejected) {\n  if (rejected && rejected.bind && this.context) {\n    rejected = rejected.bind(this.context);\n  }\n\n  return new PromiseObj(this.promise[\"catch\"](rejected), this.context);\n};\n\np$1[\"finally\"] = function (callback) {\n  return this.then(function (value) {\n    callback.call(this);\n    return value;\n  }, function (reason) {\n    callback.call(this);\n    return Promise.reject(reason);\n  });\n};\n\n/**\n * Utility functions.\n */\nvar _ref = {},\n    hasOwnProperty = _ref.hasOwnProperty,\n    slice = [].slice,\n    debug = false,\n    ntick;\nvar inBrowser = typeof window !== 'undefined';\nfunction Util (_ref2) {\n  var config = _ref2.config,\n      nextTick = _ref2.nextTick;\n  ntick = nextTick;\n  debug = config.debug || !config.silent;\n}\nfunction warn(msg) {\n  if (typeof console !== 'undefined' && debug) {\n    console.warn('[VueResource warn]: ' + msg);\n  }\n}\nfunction error(msg) {\n  if (typeof console !== 'undefined') {\n    console.error(msg);\n  }\n}\nfunction nextTick(cb, ctx) {\n  return ntick(cb, ctx);\n}\nfunction trim(str) {\n  return str ? str.replace(/^\\s*|\\s*$/g, '') : '';\n}\nfunction trimEnd(str, chars) {\n  if (str && chars === undefined) {\n    return str.replace(/\\s+$/, '');\n  }\n\n  if (!str || !chars) {\n    return str;\n  }\n\n  return str.replace(new RegExp(\"[\" + chars + \"]+$\"), '');\n}\nfunction toLower(str) {\n  return str ? str.toLowerCase() : '';\n}\nfunction toUpper(str) {\n  return str ? str.toUpperCase() : '';\n}\nvar isArray = Array.isArray;\nfunction isString(val) {\n  return typeof val === 'string';\n}\nfunction isFunction(val) {\n  return typeof val === 'function';\n}\nfunction isObject(obj) {\n  return obj !== null && typeof obj === 'object';\n}\nfunction isPlainObject(obj) {\n  return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;\n}\nfunction isBlob(obj) {\n  return typeof Blob !== 'undefined' && obj instanceof Blob;\n}\nfunction isFormData(obj) {\n  return typeof FormData !== 'undefined' && obj instanceof FormData;\n}\nfunction when(value, fulfilled, rejected) {\n  var promise = PromiseObj.resolve(value);\n\n  if (arguments.length < 2) {\n    return promise;\n  }\n\n  return promise.then(fulfilled, rejected);\n}\nfunction options(fn, obj, opts) {\n  opts = opts || {};\n\n  if (isFunction(opts)) {\n    opts = opts.call(obj);\n  }\n\n  return merge(fn.bind({\n    $vm: obj,\n    $options: opts\n  }), fn, {\n    $options: opts\n  });\n}\nfunction each(obj, iterator) {\n  var i, key;\n\n  if (isArray(obj)) {\n    for (i = 0; i < obj.length; i++) {\n      iterator.call(obj[i], obj[i], i);\n    }\n  } else if (isObject(obj)) {\n    for (key in obj) {\n      if (hasOwnProperty.call(obj, key)) {\n        iterator.call(obj[key], obj[key], key);\n      }\n    }\n  }\n\n  return obj;\n}\nvar assign = Object.assign || _assign;\nfunction merge(target) {\n  var args = slice.call(arguments, 1);\n  args.forEach(function (source) {\n    _merge(target, source, true);\n  });\n  return target;\n}\nfunction defaults(target) {\n  var args = slice.call(arguments, 1);\n  args.forEach(function (source) {\n    for (var key in source) {\n      if (target[key] === undefined) {\n        target[key] = source[key];\n      }\n    }\n  });\n  return target;\n}\n\nfunction _assign(target) {\n  var args = slice.call(arguments, 1);\n  args.forEach(function (source) {\n    _merge(target, source);\n  });\n  return target;\n}\n\nfunction _merge(target, source, deep) {\n  for (var key in source) {\n    if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n      if (isPlainObject(source[key]) && !isPlainObject(target[key])) {\n        target[key] = {};\n      }\n\n      if (isArray(source[key]) && !isArray(target[key])) {\n        target[key] = [];\n      }\n\n      _merge(target[key], source[key], deep);\n    } else if (source[key] !== undefined) {\n      target[key] = source[key];\n    }\n  }\n}\n\n/**\n * Root Prefix Transform.\n */\nfunction root (options$$1, next) {\n  var url = next(options$$1);\n\n  if (isString(options$$1.root) && !/^(https?:)?\\//.test(url)) {\n    url = trimEnd(options$$1.root, '/') + '/' + url;\n  }\n\n  return url;\n}\n\n/**\n * Query Parameter Transform.\n */\nfunction query (options$$1, next) {\n  var urlParams = Object.keys(Url.options.params),\n      query = {},\n      url = next(options$$1);\n  each(options$$1.params, function (value, key) {\n    if (urlParams.indexOf(key) === -1) {\n      query[key] = value;\n    }\n  });\n  query = Url.params(query);\n\n  if (query) {\n    url += (url.indexOf('?') == -1 ? '?' : '&') + query;\n  }\n\n  return url;\n}\n\n/**\n * URL Template v2.0.6 (https://github.com/bramstein/url-template)\n */\nfunction expand(url, params, variables) {\n  var tmpl = parse(url),\n      expanded = tmpl.expand(params);\n\n  if (variables) {\n    variables.push.apply(variables, tmpl.vars);\n  }\n\n  return expanded;\n}\nfunction parse(template) {\n  var operators = ['+', '#', '.', '/', ';', '?', '&'],\n      variables = [];\n  return {\n    vars: variables,\n    expand: function expand(context) {\n      return template.replace(/\\{([^{}]+)\\}|([^{}]+)/g, function (_, expression, literal) {\n        if (expression) {\n          var operator = null,\n              values = [];\n\n          if (operators.indexOf(expression.charAt(0)) !== -1) {\n            operator = expression.charAt(0);\n            expression = expression.substr(1);\n          }\n\n          expression.split(/,/g).forEach(function (variable) {\n            var tmp = /([^:*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n            values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n            variables.push(tmp[1]);\n          });\n\n          if (operator && operator !== '+') {\n            var separator = ',';\n\n            if (operator === '?') {\n              separator = '&';\n            } else if (operator !== '#') {\n              separator = operator;\n            }\n\n            return (values.length !== 0 ? operator : '') + values.join(separator);\n          } else {\n            return values.join(',');\n          }\n        } else {\n          return encodeReserved(literal);\n        }\n      });\n    }\n  };\n}\n\nfunction getValues(context, operator, key, modifier) {\n  var value = context[key],\n      result = [];\n\n  if (isDefined(value) && value !== '') {\n    if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n      value = value.toString();\n\n      if (modifier && modifier !== '*') {\n        value = value.substring(0, parseInt(modifier, 10));\n      }\n\n      result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n    } else {\n      if (modifier === '*') {\n        if (Array.isArray(value)) {\n          value.filter(isDefined).forEach(function (value) {\n            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n          });\n        } else {\n          Object.keys(value).forEach(function (k) {\n            if (isDefined(value[k])) {\n              result.push(encodeValue(operator, value[k], k));\n            }\n          });\n        }\n      } else {\n        var tmp = [];\n\n        if (Array.isArray(value)) {\n          value.filter(isDefined).forEach(function (value) {\n            tmp.push(encodeValue(operator, value));\n          });\n        } else {\n          Object.keys(value).forEach(function (k) {\n            if (isDefined(value[k])) {\n              tmp.push(encodeURIComponent(k));\n              tmp.push(encodeValue(operator, value[k].toString()));\n            }\n          });\n        }\n\n        if (isKeyOperator(operator)) {\n          result.push(encodeURIComponent(key) + '=' + tmp.join(','));\n        } else if (tmp.length !== 0) {\n          result.push(tmp.join(','));\n        }\n      }\n    }\n  } else {\n    if (operator === ';') {\n      result.push(encodeURIComponent(key));\n    } else if (value === '' && (operator === '&' || operator === '?')) {\n      result.push(encodeURIComponent(key) + '=');\n    } else if (value === '') {\n      result.push('');\n    }\n  }\n\n  return result;\n}\n\nfunction isDefined(value) {\n  return value !== undefined && value !== null;\n}\n\nfunction isKeyOperator(operator) {\n  return operator === ';' || operator === '&' || operator === '?';\n}\n\nfunction encodeValue(operator, value, key) {\n  value = operator === '+' || operator === '#' ? encodeReserved(value) : encodeURIComponent(value);\n\n  if (key) {\n    return encodeURIComponent(key) + '=' + value;\n  } else {\n    return value;\n  }\n}\n\nfunction encodeReserved(str) {\n  return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {\n    if (!/%[0-9A-Fa-f]/.test(part)) {\n      part = encodeURI(part);\n    }\n\n    return part;\n  }).join('');\n}\n\n/**\n * URL Template (RFC 6570) Transform.\n */\nfunction template (options) {\n  var variables = [],\n      url = expand(options.url, options.params, variables);\n  variables.forEach(function (key) {\n    delete options.params[key];\n  });\n  return url;\n}\n\n/**\n * Service for URL templating.\n */\nfunction Url(url, params) {\n  var self = this || {},\n      options$$1 = url,\n      transform;\n\n  if (isString(url)) {\n    options$$1 = {\n      url: url,\n      params: params\n    };\n  }\n\n  options$$1 = merge({}, Url.options, self.$options, options$$1);\n  Url.transforms.forEach(function (handler) {\n    if (isString(handler)) {\n      handler = Url.transform[handler];\n    }\n\n    if (isFunction(handler)) {\n      transform = factory(handler, transform, self.$vm);\n    }\n  });\n  return transform(options$$1);\n}\n/**\n * Url options.\n */\n\nUrl.options = {\n  url: '',\n  root: null,\n  params: {}\n};\n/**\n * Url transforms.\n */\n\nUrl.transform = {\n  template: template,\n  query: query,\n  root: root\n};\nUrl.transforms = ['template', 'query', 'root'];\n/**\n * Encodes a Url parameter string.\n *\n * @param {Object} obj\n */\n\nUrl.params = function (obj) {\n  var params = [],\n      escape = encodeURIComponent;\n\n  params.add = function (key, value) {\n    if (isFunction(value)) {\n      value = value();\n    }\n\n    if (value === null) {\n      value = '';\n    }\n\n    this.push(escape(key) + '=' + escape(value));\n  };\n\n  serialize(params, obj);\n  return params.join('&').replace(/%20/g, '+');\n};\n/**\n * Parse a URL and return its components.\n *\n * @param {String} url\n */\n\n\nUrl.parse = function (url) {\n  var el = document.createElement('a');\n\n  if (document.documentMode) {\n    el.href = url;\n    url = el.href;\n  }\n\n  el.href = url;\n  return {\n    href: el.href,\n    protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',\n    port: el.port,\n    host: el.host,\n    hostname: el.hostname,\n    pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,\n    search: el.search ? el.search.replace(/^\\?/, '') : '',\n    hash: el.hash ? el.hash.replace(/^#/, '') : ''\n  };\n};\n\nfunction factory(handler, next, vm) {\n  return function (options$$1) {\n    return handler.call(vm, options$$1, next);\n  };\n}\n\nfunction serialize(params, obj, scope) {\n  var array = isArray(obj),\n      plain = isPlainObject(obj),\n      hash;\n  each(obj, function (value, key) {\n    hash = isObject(value) || isArray(value);\n\n    if (scope) {\n      key = scope + '[' + (plain || hash ? key : '') + ']';\n    }\n\n    if (!scope && array) {\n      params.add(value.name, value.value);\n    } else if (hash) {\n      serialize(params, value, key);\n    } else {\n      params.add(key, value);\n    }\n  });\n}\n\n/**\n * XDomain client (Internet Explorer).\n */\nfunction xdrClient (request) {\n  return new PromiseObj(function (resolve) {\n    var xdr = new XDomainRequest(),\n        handler = function handler(_ref) {\n      var type = _ref.type;\n      var status = 0;\n\n      if (type === 'load') {\n        status = 200;\n      } else if (type === 'error') {\n        status = 500;\n      }\n\n      resolve(request.respondWith(xdr.responseText, {\n        status: status\n      }));\n    };\n\n    request.abort = function () {\n      return xdr.abort();\n    };\n\n    xdr.open(request.method, request.getUrl());\n\n    if (request.timeout) {\n      xdr.timeout = request.timeout;\n    }\n\n    xdr.onload = handler;\n    xdr.onabort = handler;\n    xdr.onerror = handler;\n    xdr.ontimeout = handler;\n\n    xdr.onprogress = function () {};\n\n    xdr.send(request.getBody());\n  });\n}\n\n/**\n * CORS Interceptor.\n */\nvar SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();\nfunction cors (request) {\n  if (inBrowser) {\n    var orgUrl = Url.parse(location.href);\n    var reqUrl = Url.parse(request.getUrl());\n\n    if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {\n      request.crossOrigin = true;\n      request.emulateHTTP = false;\n\n      if (!SUPPORTS_CORS) {\n        request.client = xdrClient;\n      }\n    }\n  }\n}\n\n/**\n * Form data Interceptor.\n */\nfunction form (request) {\n  if (isFormData(request.body)) {\n    request.headers[\"delete\"]('Content-Type');\n  } else if (isObject(request.body) && request.emulateJSON) {\n    request.body = Url.params(request.body);\n    request.headers.set('Content-Type', 'application/x-www-form-urlencoded');\n  }\n}\n\n/**\n * JSON Interceptor.\n */\nfunction json (request) {\n  var type = request.headers.get('Content-Type') || '';\n\n  if (isObject(request.body) && type.indexOf('application/json') === 0) {\n    request.body = JSON.stringify(request.body);\n  }\n\n  return function (response) {\n    return response.bodyText ? when(response.text(), function (text) {\n      var type = response.headers.get('Content-Type') || '';\n\n      if (type.indexOf('application/json') === 0 || isJson(text)) {\n        try {\n          response.body = JSON.parse(text);\n        } catch (e) {\n          response.body = null;\n        }\n      } else {\n        response.body = text;\n      }\n\n      return response;\n    }) : response;\n  };\n}\n\nfunction isJson(str) {\n  var start = str.match(/^\\s*(\\[|\\{)/);\n  var end = {\n    '[': /]\\s*$/,\n    '{': /}\\s*$/\n  };\n  return start && end[start[1]].test(str);\n}\n\n/**\n * JSONP client (Browser).\n */\nfunction jsonpClient (request) {\n  return new PromiseObj(function (resolve) {\n    var name = request.jsonp || 'callback',\n        callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2),\n        body = null,\n        handler,\n        script;\n\n    handler = function handler(_ref) {\n      var type = _ref.type;\n      var status = 0;\n\n      if (type === 'load' && body !== null) {\n        status = 200;\n      } else if (type === 'error') {\n        status = 500;\n      }\n\n      if (status && window[callback]) {\n        delete window[callback];\n        document.body.removeChild(script);\n      }\n\n      resolve(request.respondWith(body, {\n        status: status\n      }));\n    };\n\n    window[callback] = function (result) {\n      body = JSON.stringify(result);\n    };\n\n    request.abort = function () {\n      handler({\n        type: 'abort'\n      });\n    };\n\n    request.params[name] = callback;\n\n    if (request.timeout) {\n      setTimeout(request.abort, request.timeout);\n    }\n\n    script = document.createElement('script');\n    script.src = request.getUrl();\n    script.type = 'text/javascript';\n    script.async = true;\n    script.onload = handler;\n    script.onerror = handler;\n    document.body.appendChild(script);\n  });\n}\n\n/**\n * JSONP Interceptor.\n */\nfunction jsonp (request) {\n  if (request.method == 'JSONP') {\n    request.client = jsonpClient;\n  }\n}\n\n/**\n * Before Interceptor.\n */\nfunction before (request) {\n  if (isFunction(request.before)) {\n    request.before.call(this, request);\n  }\n}\n\n/**\n * HTTP method override Interceptor.\n */\nfunction method (request) {\n  if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {\n    request.headers.set('X-HTTP-Method-Override', request.method);\n    request.method = 'POST';\n  }\n}\n\n/**\n * Header Interceptor.\n */\nfunction header (request) {\n  var headers = assign({}, Http.headers.common, !request.crossOrigin ? Http.headers.custom : {}, Http.headers[toLower(request.method)]);\n  each(headers, function (value, name) {\n    if (!request.headers.has(name)) {\n      request.headers.set(name, value);\n    }\n  });\n}\n\n/**\n * XMLHttp client (Browser).\n */\nfunction xhrClient (request) {\n  return new PromiseObj(function (resolve) {\n    var xhr = new XMLHttpRequest(),\n        handler = function handler(event) {\n      var response = request.respondWith('response' in xhr ? xhr.response : xhr.responseText, {\n        status: xhr.status === 1223 ? 204 : xhr.status,\n        // IE9 status bug\n        statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)\n      });\n      each(trim(xhr.getAllResponseHeaders()).split('\\n'), function (row) {\n        response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));\n      });\n      resolve(response);\n    };\n\n    request.abort = function () {\n      return xhr.abort();\n    };\n\n    xhr.open(request.method, request.getUrl(), true);\n\n    if (request.timeout) {\n      xhr.timeout = request.timeout;\n    }\n\n    if (request.responseType && 'responseType' in xhr) {\n      xhr.responseType = request.responseType;\n    }\n\n    if (request.withCredentials || request.credentials) {\n      xhr.withCredentials = true;\n    }\n\n    if (!request.crossOrigin) {\n      request.headers.set('X-Requested-With', 'XMLHttpRequest');\n    } // deprecated use downloadProgress\n\n\n    if (isFunction(request.progress) && request.method === 'GET') {\n      xhr.addEventListener('progress', request.progress);\n    }\n\n    if (isFunction(request.downloadProgress)) {\n      xhr.addEventListener('progress', request.downloadProgress);\n    } // deprecated use uploadProgress\n\n\n    if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {\n      xhr.upload.addEventListener('progress', request.progress);\n    }\n\n    if (isFunction(request.uploadProgress) && xhr.upload) {\n      xhr.upload.addEventListener('progress', request.uploadProgress);\n    }\n\n    request.headers.forEach(function (value, name) {\n      xhr.setRequestHeader(name, value);\n    });\n    xhr.onload = handler;\n    xhr.onabort = handler;\n    xhr.onerror = handler;\n    xhr.ontimeout = handler;\n    xhr.send(request.getBody());\n  });\n}\n\n/**\n * Http client (Node).\n */\nfunction nodeClient (request) {\n  var client = require('got');\n\n  return new PromiseObj(function (resolve) {\n    var url = request.getUrl();\n    var body = request.getBody();\n    var method = request.method;\n    var headers = {},\n        handler;\n    request.headers.forEach(function (value, name) {\n      headers[name] = value;\n    });\n    client(url, {\n      body: body,\n      method: method,\n      headers: headers\n    }).then(handler = function handler(resp) {\n      var response = request.respondWith(resp.body, {\n        status: resp.statusCode,\n        statusText: trim(resp.statusMessage)\n      });\n      each(resp.headers, function (value, name) {\n        response.headers.set(name, value);\n      });\n      resolve(response);\n    }, function (error$$1) {\n      return handler(error$$1.response);\n    });\n  });\n}\n\n/**\n * Base client.\n */\nfunction Client (context) {\n  var reqHandlers = [sendRequest],\n      resHandlers = [];\n\n  if (!isObject(context)) {\n    context = null;\n  }\n\n  function Client(request) {\n    while (reqHandlers.length) {\n      var handler = reqHandlers.pop();\n\n      if (isFunction(handler)) {\n        var _ret = function () {\n          var response = void 0,\n              next = void 0;\n          response = handler.call(context, request, function (val) {\n            return next = val;\n          }) || next;\n\n          if (isObject(response)) {\n            return {\n              v: new PromiseObj(function (resolve, reject) {\n                resHandlers.forEach(function (handler) {\n                  response = when(response, function (response) {\n                    return handler.call(context, response) || response;\n                  }, reject);\n                });\n                when(response, resolve, reject);\n              }, context)\n            };\n          }\n\n          if (isFunction(response)) {\n            resHandlers.unshift(response);\n          }\n        }();\n\n        if (typeof _ret === \"object\") return _ret.v;\n      } else {\n        warn(\"Invalid interceptor of type \" + typeof handler + \", must be a function\");\n      }\n    }\n  }\n\n  Client.use = function (handler) {\n    reqHandlers.push(handler);\n  };\n\n  return Client;\n}\n\nfunction sendRequest(request) {\n  var client = request.client || (inBrowser ? xhrClient : nodeClient);\n  return client(request);\n}\n\n/**\n * HTTP Headers.\n */\n\nvar Headers = /*#__PURE__*/function () {\n  function Headers(headers) {\n    var _this = this;\n\n    this.map = {};\n    each(headers, function (value, name) {\n      return _this.append(name, value);\n    });\n  }\n\n  var _proto = Headers.prototype;\n\n  _proto.has = function has(name) {\n    return getName(this.map, name) !== null;\n  };\n\n  _proto.get = function get(name) {\n    var list = this.map[getName(this.map, name)];\n    return list ? list.join() : null;\n  };\n\n  _proto.getAll = function getAll(name) {\n    return this.map[getName(this.map, name)] || [];\n  };\n\n  _proto.set = function set(name, value) {\n    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];\n  };\n\n  _proto.append = function append(name, value) {\n    var list = this.map[getName(this.map, name)];\n\n    if (list) {\n      list.push(trim(value));\n    } else {\n      this.set(name, value);\n    }\n  };\n\n  _proto[\"delete\"] = function _delete(name) {\n    delete this.map[getName(this.map, name)];\n  };\n\n  _proto.deleteAll = function deleteAll() {\n    this.map = {};\n  };\n\n  _proto.forEach = function forEach(callback, thisArg) {\n    var _this2 = this;\n\n    each(this.map, function (list, name) {\n      each(list, function (value) {\n        return callback.call(thisArg, value, name, _this2);\n      });\n    });\n  };\n\n  return Headers;\n}();\n\nfunction getName(map, name) {\n  return Object.keys(map).reduce(function (prev, curr) {\n    return toLower(name) === toLower(curr) ? curr : prev;\n  }, null);\n}\n\nfunction normalizeName(name) {\n  if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n    throw new TypeError('Invalid character in header field name');\n  }\n\n  return trim(name);\n}\n\n/**\n * HTTP Response.\n */\n\nvar Response = /*#__PURE__*/function () {\n  function Response(body, _ref) {\n    var url = _ref.url,\n        headers = _ref.headers,\n        status = _ref.status,\n        statusText = _ref.statusText;\n    this.url = url;\n    this.ok = status >= 200 && status < 300;\n    this.status = status || 0;\n    this.statusText = statusText || '';\n    this.headers = new Headers(headers);\n    this.body = body;\n\n    if (isString(body)) {\n      this.bodyText = body;\n    } else if (isBlob(body)) {\n      this.bodyBlob = body;\n\n      if (isBlobText(body)) {\n        this.bodyText = blobText(body);\n      }\n    }\n  }\n\n  var _proto = Response.prototype;\n\n  _proto.blob = function blob() {\n    return when(this.bodyBlob);\n  };\n\n  _proto.text = function text() {\n    return when(this.bodyText);\n  };\n\n  _proto.json = function json() {\n    return when(this.text(), function (text) {\n      return JSON.parse(text);\n    });\n  };\n\n  return Response;\n}();\nObject.defineProperty(Response.prototype, 'data', {\n  get: function get() {\n    return this.body;\n  },\n  set: function set(body) {\n    this.body = body;\n  }\n});\n\nfunction blobText(body) {\n  return new PromiseObj(function (resolve) {\n    var reader = new FileReader();\n    reader.readAsText(body);\n\n    reader.onload = function () {\n      resolve(reader.result);\n    };\n  });\n}\n\nfunction isBlobText(body) {\n  return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;\n}\n\n/**\n * HTTP Request.\n */\n\nvar Request = /*#__PURE__*/function () {\n  function Request(options$$1) {\n    this.body = null;\n    this.params = {};\n    assign(this, options$$1, {\n      method: toUpper(options$$1.method || 'GET')\n    });\n\n    if (!(this.headers instanceof Headers)) {\n      this.headers = new Headers(this.headers);\n    }\n  }\n\n  var _proto = Request.prototype;\n\n  _proto.getUrl = function getUrl() {\n    return Url(this);\n  };\n\n  _proto.getBody = function getBody() {\n    return this.body;\n  };\n\n  _proto.respondWith = function respondWith(body, options$$1) {\n    return new Response(body, assign(options$$1 || {}, {\n      url: this.getUrl()\n    }));\n  };\n\n  return Request;\n}();\n\n/**\n * Service for sending network requests.\n */\nvar COMMON_HEADERS = {\n  'Accept': 'application/json, text/plain, */*'\n};\nvar JSON_CONTENT_TYPE = {\n  'Content-Type': 'application/json;charset=utf-8'\n};\nfunction Http(options$$1) {\n  var self = this || {},\n      client = Client(self.$vm);\n  defaults(options$$1 || {}, self.$options, Http.options);\n  Http.interceptors.forEach(function (handler) {\n    if (isString(handler)) {\n      handler = Http.interceptor[handler];\n    }\n\n    if (isFunction(handler)) {\n      client.use(handler);\n    }\n  });\n  return client(new Request(options$$1)).then(function (response) {\n    return response.ok ? response : PromiseObj.reject(response);\n  }, function (response) {\n    if (response instanceof Error) {\n      error(response);\n    }\n\n    return PromiseObj.reject(response);\n  });\n}\nHttp.options = {};\nHttp.headers = {\n  put: JSON_CONTENT_TYPE,\n  post: JSON_CONTENT_TYPE,\n  patch: JSON_CONTENT_TYPE,\n  \"delete\": JSON_CONTENT_TYPE,\n  common: COMMON_HEADERS,\n  custom: {}\n};\nHttp.interceptor = {\n  before: before,\n  method: method,\n  jsonp: jsonp,\n  json: json,\n  form: form,\n  header: header,\n  cors: cors\n};\nHttp.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];\n['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {\n  Http[method$$1] = function (url, options$$1) {\n    return this(assign(options$$1 || {}, {\n      url: url,\n      method: method$$1\n    }));\n  };\n});\n['post', 'put', 'patch'].forEach(function (method$$1) {\n  Http[method$$1] = function (url, body, options$$1) {\n    return this(assign(options$$1 || {}, {\n      url: url,\n      method: method$$1,\n      body: body\n    }));\n  };\n});\n\n/**\n * Service for interacting with RESTful services.\n */\nfunction Resource(url, params, actions, options$$1) {\n  var self = this || {},\n      resource = {};\n  actions = assign({}, Resource.actions, actions);\n  each(actions, function (action, name) {\n    action = merge({\n      url: url,\n      params: assign({}, params)\n    }, options$$1, action);\n\n    resource[name] = function () {\n      return (self.$http || Http)(opts(action, arguments));\n    };\n  });\n  return resource;\n}\n\nfunction opts(action, args) {\n  var options$$1 = assign({}, action),\n      params = {},\n      body;\n\n  switch (args.length) {\n    case 2:\n      params = args[0];\n      body = args[1];\n      break;\n\n    case 1:\n      if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {\n        body = args[0];\n      } else {\n        params = args[0];\n      }\n\n      break;\n\n    case 0:\n      break;\n\n    default:\n      throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';\n  }\n\n  options$$1.body = body;\n  options$$1.params = assign({}, options$$1.params, params);\n  return options$$1;\n}\n\nResource.actions = {\n  get: {\n    method: 'GET'\n  },\n  save: {\n    method: 'POST'\n  },\n  query: {\n    method: 'GET'\n  },\n  update: {\n    method: 'PUT'\n  },\n  remove: {\n    method: 'DELETE'\n  },\n  \"delete\": {\n    method: 'DELETE'\n  }\n};\n\n/**\n * Install plugin.\n */\n\nfunction plugin(Vue) {\n  if (plugin.installed) {\n    return;\n  }\n\n  Util(Vue);\n  Vue.url = Url;\n  Vue.http = Http;\n  Vue.resource = Resource;\n  Vue.Promise = PromiseObj;\n  Object.defineProperties(Vue.prototype, {\n    $url: {\n      get: function get() {\n        return options(Vue.url, this, this.$options.url);\n      }\n    },\n    $http: {\n      get: function get() {\n        return options(Vue.http, this, this.$options.http);\n      }\n    },\n    $resource: {\n      get: function get() {\n        return Vue.resource.bind(this);\n      }\n    },\n    $promise: {\n      get: function get() {\n        var _this = this;\n\n        return function (executor) {\n          return new Vue.Promise(executor, _this);\n        };\n      }\n    }\n  });\n}\n\nif (typeof window !== 'undefined' && window.Vue && !window.Vue.resource) {\n  window.Vue.use(plugin);\n}\n\nmodule.exports = plugin;\n"
  },
  {
    "path": "dist/vue-resource.esm.js",
    "content": "/*!\n * vue-resource v1.5.3\n * https://github.com/pagekit/vue-resource\n * Released under the MIT License.\n */\n\n/**\n * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)\n */\nvar RESOLVED = 0;\nvar REJECTED = 1;\nvar PENDING = 2;\nfunction Promise$1(executor) {\n  this.state = PENDING;\n  this.value = undefined;\n  this.deferred = [];\n  var promise = this;\n\n  try {\n    executor(function (x) {\n      promise.resolve(x);\n    }, function (r) {\n      promise.reject(r);\n    });\n  } catch (e) {\n    promise.reject(e);\n  }\n}\n\nPromise$1.reject = function (r) {\n  return new Promise$1(function (resolve, reject) {\n    reject(r);\n  });\n};\n\nPromise$1.resolve = function (x) {\n  return new Promise$1(function (resolve, reject) {\n    resolve(x);\n  });\n};\n\nPromise$1.all = function all(iterable) {\n  return new Promise$1(function (resolve, reject) {\n    var count = 0,\n        result = [];\n\n    if (iterable.length === 0) {\n      resolve(result);\n    }\n\n    function resolver(i) {\n      return function (x) {\n        result[i] = x;\n        count += 1;\n\n        if (count === iterable.length) {\n          resolve(result);\n        }\n      };\n    }\n\n    for (var i = 0; i < iterable.length; i += 1) {\n      Promise$1.resolve(iterable[i]).then(resolver(i), reject);\n    }\n  });\n};\n\nPromise$1.race = function race(iterable) {\n  return new Promise$1(function (resolve, reject) {\n    for (var i = 0; i < iterable.length; i += 1) {\n      Promise$1.resolve(iterable[i]).then(resolve, reject);\n    }\n  });\n};\n\nvar p = Promise$1.prototype;\n\np.resolve = function resolve(x) {\n  var promise = this;\n\n  if (promise.state === PENDING) {\n    if (x === promise) {\n      throw new TypeError('Promise settled with itself.');\n    }\n\n    var called = false;\n\n    try {\n      var then = x && x['then'];\n\n      if (x !== null && typeof x === 'object' && typeof then === 'function') {\n        then.call(x, function (x) {\n          if (!called) {\n            promise.resolve(x);\n          }\n\n          called = true;\n        }, function (r) {\n          if (!called) {\n            promise.reject(r);\n          }\n\n          called = true;\n        });\n        return;\n      }\n    } catch (e) {\n      if (!called) {\n        promise.reject(e);\n      }\n\n      return;\n    }\n\n    promise.state = RESOLVED;\n    promise.value = x;\n    promise.notify();\n  }\n};\n\np.reject = function reject(reason) {\n  var promise = this;\n\n  if (promise.state === PENDING) {\n    if (reason === promise) {\n      throw new TypeError('Promise settled with itself.');\n    }\n\n    promise.state = REJECTED;\n    promise.value = reason;\n    promise.notify();\n  }\n};\n\np.notify = function notify() {\n  var promise = this;\n  nextTick(function () {\n    if (promise.state !== PENDING) {\n      while (promise.deferred.length) {\n        var deferred = promise.deferred.shift(),\n            onResolved = deferred[0],\n            onRejected = deferred[1],\n            resolve = deferred[2],\n            reject = deferred[3];\n\n        try {\n          if (promise.state === RESOLVED) {\n            if (typeof onResolved === 'function') {\n              resolve(onResolved.call(undefined, promise.value));\n            } else {\n              resolve(promise.value);\n            }\n          } else if (promise.state === REJECTED) {\n            if (typeof onRejected === 'function') {\n              resolve(onRejected.call(undefined, promise.value));\n            } else {\n              reject(promise.value);\n            }\n          }\n        } catch (e) {\n          reject(e);\n        }\n      }\n    }\n  });\n};\n\np.then = function then(onResolved, onRejected) {\n  var promise = this;\n  return new Promise$1(function (resolve, reject) {\n    promise.deferred.push([onResolved, onRejected, resolve, reject]);\n    promise.notify();\n  });\n};\n\np[\"catch\"] = function (onRejected) {\n  return this.then(undefined, onRejected);\n};\n\n/**\n * Promise adapter.\n */\n\nif (typeof Promise === 'undefined') {\n  window.Promise = Promise$1;\n}\n\nfunction PromiseObj(executor, context) {\n  if (executor instanceof Promise) {\n    this.promise = executor;\n  } else {\n    this.promise = new Promise(executor.bind(context));\n  }\n\n  this.context = context;\n}\n\nPromiseObj.all = function (iterable, context) {\n  return new PromiseObj(Promise.all(iterable), context);\n};\n\nPromiseObj.resolve = function (value, context) {\n  return new PromiseObj(Promise.resolve(value), context);\n};\n\nPromiseObj.reject = function (reason, context) {\n  return new PromiseObj(Promise.reject(reason), context);\n};\n\nPromiseObj.race = function (iterable, context) {\n  return new PromiseObj(Promise.race(iterable), context);\n};\n\nvar p$1 = PromiseObj.prototype;\n\np$1.bind = function (context) {\n  this.context = context;\n  return this;\n};\n\np$1.then = function (fulfilled, rejected) {\n  if (fulfilled && fulfilled.bind && this.context) {\n    fulfilled = fulfilled.bind(this.context);\n  }\n\n  if (rejected && rejected.bind && this.context) {\n    rejected = rejected.bind(this.context);\n  }\n\n  return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);\n};\n\np$1[\"catch\"] = function (rejected) {\n  if (rejected && rejected.bind && this.context) {\n    rejected = rejected.bind(this.context);\n  }\n\n  return new PromiseObj(this.promise[\"catch\"](rejected), this.context);\n};\n\np$1[\"finally\"] = function (callback) {\n  return this.then(function (value) {\n    callback.call(this);\n    return value;\n  }, function (reason) {\n    callback.call(this);\n    return Promise.reject(reason);\n  });\n};\n\n/**\n * Utility functions.\n */\nvar _ref = {},\n    hasOwnProperty = _ref.hasOwnProperty,\n    slice = [].slice,\n    debug = false,\n    ntick;\nvar inBrowser = typeof window !== 'undefined';\nfunction Util (_ref2) {\n  var config = _ref2.config,\n      nextTick = _ref2.nextTick;\n  ntick = nextTick;\n  debug = config.debug || !config.silent;\n}\nfunction warn(msg) {\n  if (typeof console !== 'undefined' && debug) {\n    console.warn('[VueResource warn]: ' + msg);\n  }\n}\nfunction error(msg) {\n  if (typeof console !== 'undefined') {\n    console.error(msg);\n  }\n}\nfunction nextTick(cb, ctx) {\n  return ntick(cb, ctx);\n}\nfunction trim(str) {\n  return str ? str.replace(/^\\s*|\\s*$/g, '') : '';\n}\nfunction trimEnd(str, chars) {\n  if (str && chars === undefined) {\n    return str.replace(/\\s+$/, '');\n  }\n\n  if (!str || !chars) {\n    return str;\n  }\n\n  return str.replace(new RegExp(\"[\" + chars + \"]+$\"), '');\n}\nfunction toLower(str) {\n  return str ? str.toLowerCase() : '';\n}\nfunction toUpper(str) {\n  return str ? str.toUpperCase() : '';\n}\nvar isArray = Array.isArray;\nfunction isString(val) {\n  return typeof val === 'string';\n}\nfunction isFunction(val) {\n  return typeof val === 'function';\n}\nfunction isObject(obj) {\n  return obj !== null && typeof obj === 'object';\n}\nfunction isPlainObject(obj) {\n  return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;\n}\nfunction isBlob(obj) {\n  return typeof Blob !== 'undefined' && obj instanceof Blob;\n}\nfunction isFormData(obj) {\n  return typeof FormData !== 'undefined' && obj instanceof FormData;\n}\nfunction when(value, fulfilled, rejected) {\n  var promise = PromiseObj.resolve(value);\n\n  if (arguments.length < 2) {\n    return promise;\n  }\n\n  return promise.then(fulfilled, rejected);\n}\nfunction options(fn, obj, opts) {\n  opts = opts || {};\n\n  if (isFunction(opts)) {\n    opts = opts.call(obj);\n  }\n\n  return merge(fn.bind({\n    $vm: obj,\n    $options: opts\n  }), fn, {\n    $options: opts\n  });\n}\nfunction each(obj, iterator) {\n  var i, key;\n\n  if (isArray(obj)) {\n    for (i = 0; i < obj.length; i++) {\n      iterator.call(obj[i], obj[i], i);\n    }\n  } else if (isObject(obj)) {\n    for (key in obj) {\n      if (hasOwnProperty.call(obj, key)) {\n        iterator.call(obj[key], obj[key], key);\n      }\n    }\n  }\n\n  return obj;\n}\nvar assign = Object.assign || _assign;\nfunction merge(target) {\n  var args = slice.call(arguments, 1);\n  args.forEach(function (source) {\n    _merge(target, source, true);\n  });\n  return target;\n}\nfunction defaults(target) {\n  var args = slice.call(arguments, 1);\n  args.forEach(function (source) {\n    for (var key in source) {\n      if (target[key] === undefined) {\n        target[key] = source[key];\n      }\n    }\n  });\n  return target;\n}\n\nfunction _assign(target) {\n  var args = slice.call(arguments, 1);\n  args.forEach(function (source) {\n    _merge(target, source);\n  });\n  return target;\n}\n\nfunction _merge(target, source, deep) {\n  for (var key in source) {\n    if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n      if (isPlainObject(source[key]) && !isPlainObject(target[key])) {\n        target[key] = {};\n      }\n\n      if (isArray(source[key]) && !isArray(target[key])) {\n        target[key] = [];\n      }\n\n      _merge(target[key], source[key], deep);\n    } else if (source[key] !== undefined) {\n      target[key] = source[key];\n    }\n  }\n}\n\n/**\n * Root Prefix Transform.\n */\nfunction root (options$$1, next) {\n  var url = next(options$$1);\n\n  if (isString(options$$1.root) && !/^(https?:)?\\//.test(url)) {\n    url = trimEnd(options$$1.root, '/') + '/' + url;\n  }\n\n  return url;\n}\n\n/**\n * Query Parameter Transform.\n */\nfunction query (options$$1, next) {\n  var urlParams = Object.keys(Url.options.params),\n      query = {},\n      url = next(options$$1);\n  each(options$$1.params, function (value, key) {\n    if (urlParams.indexOf(key) === -1) {\n      query[key] = value;\n    }\n  });\n  query = Url.params(query);\n\n  if (query) {\n    url += (url.indexOf('?') == -1 ? '?' : '&') + query;\n  }\n\n  return url;\n}\n\n/**\n * URL Template v2.0.6 (https://github.com/bramstein/url-template)\n */\nfunction expand(url, params, variables) {\n  var tmpl = parse(url),\n      expanded = tmpl.expand(params);\n\n  if (variables) {\n    variables.push.apply(variables, tmpl.vars);\n  }\n\n  return expanded;\n}\nfunction parse(template) {\n  var operators = ['+', '#', '.', '/', ';', '?', '&'],\n      variables = [];\n  return {\n    vars: variables,\n    expand: function expand(context) {\n      return template.replace(/\\{([^{}]+)\\}|([^{}]+)/g, function (_, expression, literal) {\n        if (expression) {\n          var operator = null,\n              values = [];\n\n          if (operators.indexOf(expression.charAt(0)) !== -1) {\n            operator = expression.charAt(0);\n            expression = expression.substr(1);\n          }\n\n          expression.split(/,/g).forEach(function (variable) {\n            var tmp = /([^:*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n            values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n            variables.push(tmp[1]);\n          });\n\n          if (operator && operator !== '+') {\n            var separator = ',';\n\n            if (operator === '?') {\n              separator = '&';\n            } else if (operator !== '#') {\n              separator = operator;\n            }\n\n            return (values.length !== 0 ? operator : '') + values.join(separator);\n          } else {\n            return values.join(',');\n          }\n        } else {\n          return encodeReserved(literal);\n        }\n      });\n    }\n  };\n}\n\nfunction getValues(context, operator, key, modifier) {\n  var value = context[key],\n      result = [];\n\n  if (isDefined(value) && value !== '') {\n    if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n      value = value.toString();\n\n      if (modifier && modifier !== '*') {\n        value = value.substring(0, parseInt(modifier, 10));\n      }\n\n      result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n    } else {\n      if (modifier === '*') {\n        if (Array.isArray(value)) {\n          value.filter(isDefined).forEach(function (value) {\n            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n          });\n        } else {\n          Object.keys(value).forEach(function (k) {\n            if (isDefined(value[k])) {\n              result.push(encodeValue(operator, value[k], k));\n            }\n          });\n        }\n      } else {\n        var tmp = [];\n\n        if (Array.isArray(value)) {\n          value.filter(isDefined).forEach(function (value) {\n            tmp.push(encodeValue(operator, value));\n          });\n        } else {\n          Object.keys(value).forEach(function (k) {\n            if (isDefined(value[k])) {\n              tmp.push(encodeURIComponent(k));\n              tmp.push(encodeValue(operator, value[k].toString()));\n            }\n          });\n        }\n\n        if (isKeyOperator(operator)) {\n          result.push(encodeURIComponent(key) + '=' + tmp.join(','));\n        } else if (tmp.length !== 0) {\n          result.push(tmp.join(','));\n        }\n      }\n    }\n  } else {\n    if (operator === ';') {\n      result.push(encodeURIComponent(key));\n    } else if (value === '' && (operator === '&' || operator === '?')) {\n      result.push(encodeURIComponent(key) + '=');\n    } else if (value === '') {\n      result.push('');\n    }\n  }\n\n  return result;\n}\n\nfunction isDefined(value) {\n  return value !== undefined && value !== null;\n}\n\nfunction isKeyOperator(operator) {\n  return operator === ';' || operator === '&' || operator === '?';\n}\n\nfunction encodeValue(operator, value, key) {\n  value = operator === '+' || operator === '#' ? encodeReserved(value) : encodeURIComponent(value);\n\n  if (key) {\n    return encodeURIComponent(key) + '=' + value;\n  } else {\n    return value;\n  }\n}\n\nfunction encodeReserved(str) {\n  return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {\n    if (!/%[0-9A-Fa-f]/.test(part)) {\n      part = encodeURI(part);\n    }\n\n    return part;\n  }).join('');\n}\n\n/**\n * URL Template (RFC 6570) Transform.\n */\nfunction template (options) {\n  var variables = [],\n      url = expand(options.url, options.params, variables);\n  variables.forEach(function (key) {\n    delete options.params[key];\n  });\n  return url;\n}\n\n/**\n * Service for URL templating.\n */\nfunction Url(url, params) {\n  var self = this || {},\n      options$$1 = url,\n      transform;\n\n  if (isString(url)) {\n    options$$1 = {\n      url: url,\n      params: params\n    };\n  }\n\n  options$$1 = merge({}, Url.options, self.$options, options$$1);\n  Url.transforms.forEach(function (handler) {\n    if (isString(handler)) {\n      handler = Url.transform[handler];\n    }\n\n    if (isFunction(handler)) {\n      transform = factory(handler, transform, self.$vm);\n    }\n  });\n  return transform(options$$1);\n}\n/**\n * Url options.\n */\n\nUrl.options = {\n  url: '',\n  root: null,\n  params: {}\n};\n/**\n * Url transforms.\n */\n\nUrl.transform = {\n  template: template,\n  query: query,\n  root: root\n};\nUrl.transforms = ['template', 'query', 'root'];\n/**\n * Encodes a Url parameter string.\n *\n * @param {Object} obj\n */\n\nUrl.params = function (obj) {\n  var params = [],\n      escape = encodeURIComponent;\n\n  params.add = function (key, value) {\n    if (isFunction(value)) {\n      value = value();\n    }\n\n    if (value === null) {\n      value = '';\n    }\n\n    this.push(escape(key) + '=' + escape(value));\n  };\n\n  serialize(params, obj);\n  return params.join('&').replace(/%20/g, '+');\n};\n/**\n * Parse a URL and return its components.\n *\n * @param {String} url\n */\n\n\nUrl.parse = function (url) {\n  var el = document.createElement('a');\n\n  if (document.documentMode) {\n    el.href = url;\n    url = el.href;\n  }\n\n  el.href = url;\n  return {\n    href: el.href,\n    protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',\n    port: el.port,\n    host: el.host,\n    hostname: el.hostname,\n    pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,\n    search: el.search ? el.search.replace(/^\\?/, '') : '',\n    hash: el.hash ? el.hash.replace(/^#/, '') : ''\n  };\n};\n\nfunction factory(handler, next, vm) {\n  return function (options$$1) {\n    return handler.call(vm, options$$1, next);\n  };\n}\n\nfunction serialize(params, obj, scope) {\n  var array = isArray(obj),\n      plain = isPlainObject(obj),\n      hash;\n  each(obj, function (value, key) {\n    hash = isObject(value) || isArray(value);\n\n    if (scope) {\n      key = scope + '[' + (plain || hash ? key : '') + ']';\n    }\n\n    if (!scope && array) {\n      params.add(value.name, value.value);\n    } else if (hash) {\n      serialize(params, value, key);\n    } else {\n      params.add(key, value);\n    }\n  });\n}\n\n/**\n * XDomain client (Internet Explorer).\n */\nfunction xdrClient (request) {\n  return new PromiseObj(function (resolve) {\n    var xdr = new XDomainRequest(),\n        handler = function handler(_ref) {\n      var type = _ref.type;\n      var status = 0;\n\n      if (type === 'load') {\n        status = 200;\n      } else if (type === 'error') {\n        status = 500;\n      }\n\n      resolve(request.respondWith(xdr.responseText, {\n        status: status\n      }));\n    };\n\n    request.abort = function () {\n      return xdr.abort();\n    };\n\n    xdr.open(request.method, request.getUrl());\n\n    if (request.timeout) {\n      xdr.timeout = request.timeout;\n    }\n\n    xdr.onload = handler;\n    xdr.onabort = handler;\n    xdr.onerror = handler;\n    xdr.ontimeout = handler;\n\n    xdr.onprogress = function () {};\n\n    xdr.send(request.getBody());\n  });\n}\n\n/**\n * CORS Interceptor.\n */\nvar SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();\nfunction cors (request) {\n  if (inBrowser) {\n    var orgUrl = Url.parse(location.href);\n    var reqUrl = Url.parse(request.getUrl());\n\n    if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {\n      request.crossOrigin = true;\n      request.emulateHTTP = false;\n\n      if (!SUPPORTS_CORS) {\n        request.client = xdrClient;\n      }\n    }\n  }\n}\n\n/**\n * Form data Interceptor.\n */\nfunction form (request) {\n  if (isFormData(request.body)) {\n    request.headers[\"delete\"]('Content-Type');\n  } else if (isObject(request.body) && request.emulateJSON) {\n    request.body = Url.params(request.body);\n    request.headers.set('Content-Type', 'application/x-www-form-urlencoded');\n  }\n}\n\n/**\n * JSON Interceptor.\n */\nfunction json (request) {\n  var type = request.headers.get('Content-Type') || '';\n\n  if (isObject(request.body) && type.indexOf('application/json') === 0) {\n    request.body = JSON.stringify(request.body);\n  }\n\n  return function (response) {\n    return response.bodyText ? when(response.text(), function (text) {\n      var type = response.headers.get('Content-Type') || '';\n\n      if (type.indexOf('application/json') === 0 || isJson(text)) {\n        try {\n          response.body = JSON.parse(text);\n        } catch (e) {\n          response.body = null;\n        }\n      } else {\n        response.body = text;\n      }\n\n      return response;\n    }) : response;\n  };\n}\n\nfunction isJson(str) {\n  var start = str.match(/^\\s*(\\[|\\{)/);\n  var end = {\n    '[': /]\\s*$/,\n    '{': /}\\s*$/\n  };\n  return start && end[start[1]].test(str);\n}\n\n/**\n * JSONP client (Browser).\n */\nfunction jsonpClient (request) {\n  return new PromiseObj(function (resolve) {\n    var name = request.jsonp || 'callback',\n        callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2),\n        body = null,\n        handler,\n        script;\n\n    handler = function handler(_ref) {\n      var type = _ref.type;\n      var status = 0;\n\n      if (type === 'load' && body !== null) {\n        status = 200;\n      } else if (type === 'error') {\n        status = 500;\n      }\n\n      if (status && window[callback]) {\n        delete window[callback];\n        document.body.removeChild(script);\n      }\n\n      resolve(request.respondWith(body, {\n        status: status\n      }));\n    };\n\n    window[callback] = function (result) {\n      body = JSON.stringify(result);\n    };\n\n    request.abort = function () {\n      handler({\n        type: 'abort'\n      });\n    };\n\n    request.params[name] = callback;\n\n    if (request.timeout) {\n      setTimeout(request.abort, request.timeout);\n    }\n\n    script = document.createElement('script');\n    script.src = request.getUrl();\n    script.type = 'text/javascript';\n    script.async = true;\n    script.onload = handler;\n    script.onerror = handler;\n    document.body.appendChild(script);\n  });\n}\n\n/**\n * JSONP Interceptor.\n */\nfunction jsonp (request) {\n  if (request.method == 'JSONP') {\n    request.client = jsonpClient;\n  }\n}\n\n/**\n * Before Interceptor.\n */\nfunction before (request) {\n  if (isFunction(request.before)) {\n    request.before.call(this, request);\n  }\n}\n\n/**\n * HTTP method override Interceptor.\n */\nfunction method (request) {\n  if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {\n    request.headers.set('X-HTTP-Method-Override', request.method);\n    request.method = 'POST';\n  }\n}\n\n/**\n * Header Interceptor.\n */\nfunction header (request) {\n  var headers = assign({}, Http.headers.common, !request.crossOrigin ? Http.headers.custom : {}, Http.headers[toLower(request.method)]);\n  each(headers, function (value, name) {\n    if (!request.headers.has(name)) {\n      request.headers.set(name, value);\n    }\n  });\n}\n\n/**\n * XMLHttp client (Browser).\n */\nfunction xhrClient (request) {\n  return new PromiseObj(function (resolve) {\n    var xhr = new XMLHttpRequest(),\n        handler = function handler(event) {\n      var response = request.respondWith('response' in xhr ? xhr.response : xhr.responseText, {\n        status: xhr.status === 1223 ? 204 : xhr.status,\n        // IE9 status bug\n        statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)\n      });\n      each(trim(xhr.getAllResponseHeaders()).split('\\n'), function (row) {\n        response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));\n      });\n      resolve(response);\n    };\n\n    request.abort = function () {\n      return xhr.abort();\n    };\n\n    xhr.open(request.method, request.getUrl(), true);\n\n    if (request.timeout) {\n      xhr.timeout = request.timeout;\n    }\n\n    if (request.responseType && 'responseType' in xhr) {\n      xhr.responseType = request.responseType;\n    }\n\n    if (request.withCredentials || request.credentials) {\n      xhr.withCredentials = true;\n    }\n\n    if (!request.crossOrigin) {\n      request.headers.set('X-Requested-With', 'XMLHttpRequest');\n    } // deprecated use downloadProgress\n\n\n    if (isFunction(request.progress) && request.method === 'GET') {\n      xhr.addEventListener('progress', request.progress);\n    }\n\n    if (isFunction(request.downloadProgress)) {\n      xhr.addEventListener('progress', request.downloadProgress);\n    } // deprecated use uploadProgress\n\n\n    if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {\n      xhr.upload.addEventListener('progress', request.progress);\n    }\n\n    if (isFunction(request.uploadProgress) && xhr.upload) {\n      xhr.upload.addEventListener('progress', request.uploadProgress);\n    }\n\n    request.headers.forEach(function (value, name) {\n      xhr.setRequestHeader(name, value);\n    });\n    xhr.onload = handler;\n    xhr.onabort = handler;\n    xhr.onerror = handler;\n    xhr.ontimeout = handler;\n    xhr.send(request.getBody());\n  });\n}\n\n/**\n * Http client (Node).\n */\nfunction nodeClient (request) {\n  var client = require('got');\n\n  return new PromiseObj(function (resolve) {\n    var url = request.getUrl();\n    var body = request.getBody();\n    var method = request.method;\n    var headers = {},\n        handler;\n    request.headers.forEach(function (value, name) {\n      headers[name] = value;\n    });\n    client(url, {\n      body: body,\n      method: method,\n      headers: headers\n    }).then(handler = function handler(resp) {\n      var response = request.respondWith(resp.body, {\n        status: resp.statusCode,\n        statusText: trim(resp.statusMessage)\n      });\n      each(resp.headers, function (value, name) {\n        response.headers.set(name, value);\n      });\n      resolve(response);\n    }, function (error$$1) {\n      return handler(error$$1.response);\n    });\n  });\n}\n\n/**\n * Base client.\n */\nfunction Client (context) {\n  var reqHandlers = [sendRequest],\n      resHandlers = [];\n\n  if (!isObject(context)) {\n    context = null;\n  }\n\n  function Client(request) {\n    while (reqHandlers.length) {\n      var handler = reqHandlers.pop();\n\n      if (isFunction(handler)) {\n        var _ret = function () {\n          var response = void 0,\n              next = void 0;\n          response = handler.call(context, request, function (val) {\n            return next = val;\n          }) || next;\n\n          if (isObject(response)) {\n            return {\n              v: new PromiseObj(function (resolve, reject) {\n                resHandlers.forEach(function (handler) {\n                  response = when(response, function (response) {\n                    return handler.call(context, response) || response;\n                  }, reject);\n                });\n                when(response, resolve, reject);\n              }, context)\n            };\n          }\n\n          if (isFunction(response)) {\n            resHandlers.unshift(response);\n          }\n        }();\n\n        if (typeof _ret === \"object\") return _ret.v;\n      } else {\n        warn(\"Invalid interceptor of type \" + typeof handler + \", must be a function\");\n      }\n    }\n  }\n\n  Client.use = function (handler) {\n    reqHandlers.push(handler);\n  };\n\n  return Client;\n}\n\nfunction sendRequest(request) {\n  var client = request.client || (inBrowser ? xhrClient : nodeClient);\n  return client(request);\n}\n\n/**\n * HTTP Headers.\n */\n\nvar Headers = /*#__PURE__*/function () {\n  function Headers(headers) {\n    var _this = this;\n\n    this.map = {};\n    each(headers, function (value, name) {\n      return _this.append(name, value);\n    });\n  }\n\n  var _proto = Headers.prototype;\n\n  _proto.has = function has(name) {\n    return getName(this.map, name) !== null;\n  };\n\n  _proto.get = function get(name) {\n    var list = this.map[getName(this.map, name)];\n    return list ? list.join() : null;\n  };\n\n  _proto.getAll = function getAll(name) {\n    return this.map[getName(this.map, name)] || [];\n  };\n\n  _proto.set = function set(name, value) {\n    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];\n  };\n\n  _proto.append = function append(name, value) {\n    var list = this.map[getName(this.map, name)];\n\n    if (list) {\n      list.push(trim(value));\n    } else {\n      this.set(name, value);\n    }\n  };\n\n  _proto[\"delete\"] = function _delete(name) {\n    delete this.map[getName(this.map, name)];\n  };\n\n  _proto.deleteAll = function deleteAll() {\n    this.map = {};\n  };\n\n  _proto.forEach = function forEach(callback, thisArg) {\n    var _this2 = this;\n\n    each(this.map, function (list, name) {\n      each(list, function (value) {\n        return callback.call(thisArg, value, name, _this2);\n      });\n    });\n  };\n\n  return Headers;\n}();\n\nfunction getName(map, name) {\n  return Object.keys(map).reduce(function (prev, curr) {\n    return toLower(name) === toLower(curr) ? curr : prev;\n  }, null);\n}\n\nfunction normalizeName(name) {\n  if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n    throw new TypeError('Invalid character in header field name');\n  }\n\n  return trim(name);\n}\n\n/**\n * HTTP Response.\n */\n\nvar Response = /*#__PURE__*/function () {\n  function Response(body, _ref) {\n    var url = _ref.url,\n        headers = _ref.headers,\n        status = _ref.status,\n        statusText = _ref.statusText;\n    this.url = url;\n    this.ok = status >= 200 && status < 300;\n    this.status = status || 0;\n    this.statusText = statusText || '';\n    this.headers = new Headers(headers);\n    this.body = body;\n\n    if (isString(body)) {\n      this.bodyText = body;\n    } else if (isBlob(body)) {\n      this.bodyBlob = body;\n\n      if (isBlobText(body)) {\n        this.bodyText = blobText(body);\n      }\n    }\n  }\n\n  var _proto = Response.prototype;\n\n  _proto.blob = function blob() {\n    return when(this.bodyBlob);\n  };\n\n  _proto.text = function text() {\n    return when(this.bodyText);\n  };\n\n  _proto.json = function json() {\n    return when(this.text(), function (text) {\n      return JSON.parse(text);\n    });\n  };\n\n  return Response;\n}();\nObject.defineProperty(Response.prototype, 'data', {\n  get: function get() {\n    return this.body;\n  },\n  set: function set(body) {\n    this.body = body;\n  }\n});\n\nfunction blobText(body) {\n  return new PromiseObj(function (resolve) {\n    var reader = new FileReader();\n    reader.readAsText(body);\n\n    reader.onload = function () {\n      resolve(reader.result);\n    };\n  });\n}\n\nfunction isBlobText(body) {\n  return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;\n}\n\n/**\n * HTTP Request.\n */\n\nvar Request = /*#__PURE__*/function () {\n  function Request(options$$1) {\n    this.body = null;\n    this.params = {};\n    assign(this, options$$1, {\n      method: toUpper(options$$1.method || 'GET')\n    });\n\n    if (!(this.headers instanceof Headers)) {\n      this.headers = new Headers(this.headers);\n    }\n  }\n\n  var _proto = Request.prototype;\n\n  _proto.getUrl = function getUrl() {\n    return Url(this);\n  };\n\n  _proto.getBody = function getBody() {\n    return this.body;\n  };\n\n  _proto.respondWith = function respondWith(body, options$$1) {\n    return new Response(body, assign(options$$1 || {}, {\n      url: this.getUrl()\n    }));\n  };\n\n  return Request;\n}();\n\n/**\n * Service for sending network requests.\n */\nvar COMMON_HEADERS = {\n  'Accept': 'application/json, text/plain, */*'\n};\nvar JSON_CONTENT_TYPE = {\n  'Content-Type': 'application/json;charset=utf-8'\n};\nfunction Http(options$$1) {\n  var self = this || {},\n      client = Client(self.$vm);\n  defaults(options$$1 || {}, self.$options, Http.options);\n  Http.interceptors.forEach(function (handler) {\n    if (isString(handler)) {\n      handler = Http.interceptor[handler];\n    }\n\n    if (isFunction(handler)) {\n      client.use(handler);\n    }\n  });\n  return client(new Request(options$$1)).then(function (response) {\n    return response.ok ? response : PromiseObj.reject(response);\n  }, function (response) {\n    if (response instanceof Error) {\n      error(response);\n    }\n\n    return PromiseObj.reject(response);\n  });\n}\nHttp.options = {};\nHttp.headers = {\n  put: JSON_CONTENT_TYPE,\n  post: JSON_CONTENT_TYPE,\n  patch: JSON_CONTENT_TYPE,\n  \"delete\": JSON_CONTENT_TYPE,\n  common: COMMON_HEADERS,\n  custom: {}\n};\nHttp.interceptor = {\n  before: before,\n  method: method,\n  jsonp: jsonp,\n  json: json,\n  form: form,\n  header: header,\n  cors: cors\n};\nHttp.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];\n['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {\n  Http[method$$1] = function (url, options$$1) {\n    return this(assign(options$$1 || {}, {\n      url: url,\n      method: method$$1\n    }));\n  };\n});\n['post', 'put', 'patch'].forEach(function (method$$1) {\n  Http[method$$1] = function (url, body, options$$1) {\n    return this(assign(options$$1 || {}, {\n      url: url,\n      method: method$$1,\n      body: body\n    }));\n  };\n});\n\n/**\n * Service for interacting with RESTful services.\n */\nfunction Resource(url, params, actions, options$$1) {\n  var self = this || {},\n      resource = {};\n  actions = assign({}, Resource.actions, actions);\n  each(actions, function (action, name) {\n    action = merge({\n      url: url,\n      params: assign({}, params)\n    }, options$$1, action);\n\n    resource[name] = function () {\n      return (self.$http || Http)(opts(action, arguments));\n    };\n  });\n  return resource;\n}\n\nfunction opts(action, args) {\n  var options$$1 = assign({}, action),\n      params = {},\n      body;\n\n  switch (args.length) {\n    case 2:\n      params = args[0];\n      body = args[1];\n      break;\n\n    case 1:\n      if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {\n        body = args[0];\n      } else {\n        params = args[0];\n      }\n\n      break;\n\n    case 0:\n      break;\n\n    default:\n      throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';\n  }\n\n  options$$1.body = body;\n  options$$1.params = assign({}, options$$1.params, params);\n  return options$$1;\n}\n\nResource.actions = {\n  get: {\n    method: 'GET'\n  },\n  save: {\n    method: 'POST'\n  },\n  query: {\n    method: 'GET'\n  },\n  update: {\n    method: 'PUT'\n  },\n  remove: {\n    method: 'DELETE'\n  },\n  \"delete\": {\n    method: 'DELETE'\n  }\n};\n\n/**\n * Install plugin.\n */\n\nfunction plugin(Vue) {\n  if (plugin.installed) {\n    return;\n  }\n\n  Util(Vue);\n  Vue.url = Url;\n  Vue.http = Http;\n  Vue.resource = Resource;\n  Vue.Promise = PromiseObj;\n  Object.defineProperties(Vue.prototype, {\n    $url: {\n      get: function get() {\n        return options(Vue.url, this, this.$options.url);\n      }\n    },\n    $http: {\n      get: function get() {\n        return options(Vue.http, this, this.$options.http);\n      }\n    },\n    $resource: {\n      get: function get() {\n        return Vue.resource.bind(this);\n      }\n    },\n    $promise: {\n      get: function get() {\n        var _this = this;\n\n        return function (executor) {\n          return new Vue.Promise(executor, _this);\n        };\n      }\n    }\n  });\n}\n\nif (typeof window !== 'undefined' && window.Vue && !window.Vue.resource) {\n  window.Vue.use(plugin);\n}\n\nexport default plugin;\nexport { Url, Http, Resource };\n"
  },
  {
    "path": "dist/vue-resource.js",
    "content": "/*!\n * vue-resource v1.5.3\n * https://github.com/pagekit/vue-resource\n * Released under the MIT License.\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.VueResource = factory());\n}(this, (function () { 'use strict';\n\n    /**\n     * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)\n     */\n    var RESOLVED = 0;\n    var REJECTED = 1;\n    var PENDING = 2;\n    function Promise$1(executor) {\n      this.state = PENDING;\n      this.value = undefined;\n      this.deferred = [];\n      var promise = this;\n\n      try {\n        executor(function (x) {\n          promise.resolve(x);\n        }, function (r) {\n          promise.reject(r);\n        });\n      } catch (e) {\n        promise.reject(e);\n      }\n    }\n\n    Promise$1.reject = function (r) {\n      return new Promise$1(function (resolve, reject) {\n        reject(r);\n      });\n    };\n\n    Promise$1.resolve = function (x) {\n      return new Promise$1(function (resolve, reject) {\n        resolve(x);\n      });\n    };\n\n    Promise$1.all = function all(iterable) {\n      return new Promise$1(function (resolve, reject) {\n        var count = 0,\n            result = [];\n\n        if (iterable.length === 0) {\n          resolve(result);\n        }\n\n        function resolver(i) {\n          return function (x) {\n            result[i] = x;\n            count += 1;\n\n            if (count === iterable.length) {\n              resolve(result);\n            }\n          };\n        }\n\n        for (var i = 0; i < iterable.length; i += 1) {\n          Promise$1.resolve(iterable[i]).then(resolver(i), reject);\n        }\n      });\n    };\n\n    Promise$1.race = function race(iterable) {\n      return new Promise$1(function (resolve, reject) {\n        for (var i = 0; i < iterable.length; i += 1) {\n          Promise$1.resolve(iterable[i]).then(resolve, reject);\n        }\n      });\n    };\n\n    var p = Promise$1.prototype;\n\n    p.resolve = function resolve(x) {\n      var promise = this;\n\n      if (promise.state === PENDING) {\n        if (x === promise) {\n          throw new TypeError('Promise settled with itself.');\n        }\n\n        var called = false;\n\n        try {\n          var then = x && x['then'];\n\n          if (x !== null && typeof x === 'object' && typeof then === 'function') {\n            then.call(x, function (x) {\n              if (!called) {\n                promise.resolve(x);\n              }\n\n              called = true;\n            }, function (r) {\n              if (!called) {\n                promise.reject(r);\n              }\n\n              called = true;\n            });\n            return;\n          }\n        } catch (e) {\n          if (!called) {\n            promise.reject(e);\n          }\n\n          return;\n        }\n\n        promise.state = RESOLVED;\n        promise.value = x;\n        promise.notify();\n      }\n    };\n\n    p.reject = function reject(reason) {\n      var promise = this;\n\n      if (promise.state === PENDING) {\n        if (reason === promise) {\n          throw new TypeError('Promise settled with itself.');\n        }\n\n        promise.state = REJECTED;\n        promise.value = reason;\n        promise.notify();\n      }\n    };\n\n    p.notify = function notify() {\n      var promise = this;\n      nextTick(function () {\n        if (promise.state !== PENDING) {\n          while (promise.deferred.length) {\n            var deferred = promise.deferred.shift(),\n                onResolved = deferred[0],\n                onRejected = deferred[1],\n                resolve = deferred[2],\n                reject = deferred[3];\n\n            try {\n              if (promise.state === RESOLVED) {\n                if (typeof onResolved === 'function') {\n                  resolve(onResolved.call(undefined, promise.value));\n                } else {\n                  resolve(promise.value);\n                }\n              } else if (promise.state === REJECTED) {\n                if (typeof onRejected === 'function') {\n                  resolve(onRejected.call(undefined, promise.value));\n                } else {\n                  reject(promise.value);\n                }\n              }\n            } catch (e) {\n              reject(e);\n            }\n          }\n        }\n      });\n    };\n\n    p.then = function then(onResolved, onRejected) {\n      var promise = this;\n      return new Promise$1(function (resolve, reject) {\n        promise.deferred.push([onResolved, onRejected, resolve, reject]);\n        promise.notify();\n      });\n    };\n\n    p[\"catch\"] = function (onRejected) {\n      return this.then(undefined, onRejected);\n    };\n\n    /**\n     * Promise adapter.\n     */\n\n    if (typeof Promise === 'undefined') {\n      window.Promise = Promise$1;\n    }\n\n    function PromiseObj(executor, context) {\n      if (executor instanceof Promise) {\n        this.promise = executor;\n      } else {\n        this.promise = new Promise(executor.bind(context));\n      }\n\n      this.context = context;\n    }\n\n    PromiseObj.all = function (iterable, context) {\n      return new PromiseObj(Promise.all(iterable), context);\n    };\n\n    PromiseObj.resolve = function (value, context) {\n      return new PromiseObj(Promise.resolve(value), context);\n    };\n\n    PromiseObj.reject = function (reason, context) {\n      return new PromiseObj(Promise.reject(reason), context);\n    };\n\n    PromiseObj.race = function (iterable, context) {\n      return new PromiseObj(Promise.race(iterable), context);\n    };\n\n    var p$1 = PromiseObj.prototype;\n\n    p$1.bind = function (context) {\n      this.context = context;\n      return this;\n    };\n\n    p$1.then = function (fulfilled, rejected) {\n      if (fulfilled && fulfilled.bind && this.context) {\n        fulfilled = fulfilled.bind(this.context);\n      }\n\n      if (rejected && rejected.bind && this.context) {\n        rejected = rejected.bind(this.context);\n      }\n\n      return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);\n    };\n\n    p$1[\"catch\"] = function (rejected) {\n      if (rejected && rejected.bind && this.context) {\n        rejected = rejected.bind(this.context);\n      }\n\n      return new PromiseObj(this.promise[\"catch\"](rejected), this.context);\n    };\n\n    p$1[\"finally\"] = function (callback) {\n      return this.then(function (value) {\n        callback.call(this);\n        return value;\n      }, function (reason) {\n        callback.call(this);\n        return Promise.reject(reason);\n      });\n    };\n\n    /**\n     * Utility functions.\n     */\n    var _ref = {},\n        hasOwnProperty = _ref.hasOwnProperty,\n        slice = [].slice,\n        debug = false,\n        ntick;\n    var inBrowser = typeof window !== 'undefined';\n    function Util (_ref2) {\n      var config = _ref2.config,\n          nextTick = _ref2.nextTick;\n      ntick = nextTick;\n      debug = config.debug || !config.silent;\n    }\n    function warn(msg) {\n      if (typeof console !== 'undefined' && debug) {\n        console.warn('[VueResource warn]: ' + msg);\n      }\n    }\n    function error(msg) {\n      if (typeof console !== 'undefined') {\n        console.error(msg);\n      }\n    }\n    function nextTick(cb, ctx) {\n      return ntick(cb, ctx);\n    }\n    function trim(str) {\n      return str ? str.replace(/^\\s*|\\s*$/g, '') : '';\n    }\n    function trimEnd(str, chars) {\n      if (str && chars === undefined) {\n        return str.replace(/\\s+$/, '');\n      }\n\n      if (!str || !chars) {\n        return str;\n      }\n\n      return str.replace(new RegExp(\"[\" + chars + \"]+$\"), '');\n    }\n    function toLower(str) {\n      return str ? str.toLowerCase() : '';\n    }\n    function toUpper(str) {\n      return str ? str.toUpperCase() : '';\n    }\n    var isArray = Array.isArray;\n    function isString(val) {\n      return typeof val === 'string';\n    }\n    function isFunction(val) {\n      return typeof val === 'function';\n    }\n    function isObject(obj) {\n      return obj !== null && typeof obj === 'object';\n    }\n    function isPlainObject(obj) {\n      return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;\n    }\n    function isBlob(obj) {\n      return typeof Blob !== 'undefined' && obj instanceof Blob;\n    }\n    function isFormData(obj) {\n      return typeof FormData !== 'undefined' && obj instanceof FormData;\n    }\n    function when(value, fulfilled, rejected) {\n      var promise = PromiseObj.resolve(value);\n\n      if (arguments.length < 2) {\n        return promise;\n      }\n\n      return promise.then(fulfilled, rejected);\n    }\n    function options(fn, obj, opts) {\n      opts = opts || {};\n\n      if (isFunction(opts)) {\n        opts = opts.call(obj);\n      }\n\n      return merge(fn.bind({\n        $vm: obj,\n        $options: opts\n      }), fn, {\n        $options: opts\n      });\n    }\n    function each(obj, iterator) {\n      var i, key;\n\n      if (isArray(obj)) {\n        for (i = 0; i < obj.length; i++) {\n          iterator.call(obj[i], obj[i], i);\n        }\n      } else if (isObject(obj)) {\n        for (key in obj) {\n          if (hasOwnProperty.call(obj, key)) {\n            iterator.call(obj[key], obj[key], key);\n          }\n        }\n      }\n\n      return obj;\n    }\n    var assign = Object.assign || _assign;\n    function merge(target) {\n      var args = slice.call(arguments, 1);\n      args.forEach(function (source) {\n        _merge(target, source, true);\n      });\n      return target;\n    }\n    function defaults(target) {\n      var args = slice.call(arguments, 1);\n      args.forEach(function (source) {\n        for (var key in source) {\n          if (target[key] === undefined) {\n            target[key] = source[key];\n          }\n        }\n      });\n      return target;\n    }\n\n    function _assign(target) {\n      var args = slice.call(arguments, 1);\n      args.forEach(function (source) {\n        _merge(target, source);\n      });\n      return target;\n    }\n\n    function _merge(target, source, deep) {\n      for (var key in source) {\n        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n          if (isPlainObject(source[key]) && !isPlainObject(target[key])) {\n            target[key] = {};\n          }\n\n          if (isArray(source[key]) && !isArray(target[key])) {\n            target[key] = [];\n          }\n\n          _merge(target[key], source[key], deep);\n        } else if (source[key] !== undefined) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    /**\n     * Root Prefix Transform.\n     */\n    function root (options$$1, next) {\n      var url = next(options$$1);\n\n      if (isString(options$$1.root) && !/^(https?:)?\\//.test(url)) {\n        url = trimEnd(options$$1.root, '/') + '/' + url;\n      }\n\n      return url;\n    }\n\n    /**\n     * Query Parameter Transform.\n     */\n    function query (options$$1, next) {\n      var urlParams = Object.keys(Url.options.params),\n          query = {},\n          url = next(options$$1);\n      each(options$$1.params, function (value, key) {\n        if (urlParams.indexOf(key) === -1) {\n          query[key] = value;\n        }\n      });\n      query = Url.params(query);\n\n      if (query) {\n        url += (url.indexOf('?') == -1 ? '?' : '&') + query;\n      }\n\n      return url;\n    }\n\n    /**\n     * URL Template v2.0.6 (https://github.com/bramstein/url-template)\n     */\n    function expand(url, params, variables) {\n      var tmpl = parse(url),\n          expanded = tmpl.expand(params);\n\n      if (variables) {\n        variables.push.apply(variables, tmpl.vars);\n      }\n\n      return expanded;\n    }\n    function parse(template) {\n      var operators = ['+', '#', '.', '/', ';', '?', '&'],\n          variables = [];\n      return {\n        vars: variables,\n        expand: function expand(context) {\n          return template.replace(/\\{([^{}]+)\\}|([^{}]+)/g, function (_, expression, literal) {\n            if (expression) {\n              var operator = null,\n                  values = [];\n\n              if (operators.indexOf(expression.charAt(0)) !== -1) {\n                operator = expression.charAt(0);\n                expression = expression.substr(1);\n              }\n\n              expression.split(/,/g).forEach(function (variable) {\n                var tmp = /([^:*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n                values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n                variables.push(tmp[1]);\n              });\n\n              if (operator && operator !== '+') {\n                var separator = ',';\n\n                if (operator === '?') {\n                  separator = '&';\n                } else if (operator !== '#') {\n                  separator = operator;\n                }\n\n                return (values.length !== 0 ? operator : '') + values.join(separator);\n              } else {\n                return values.join(',');\n              }\n            } else {\n              return encodeReserved(literal);\n            }\n          });\n        }\n      };\n    }\n\n    function getValues(context, operator, key, modifier) {\n      var value = context[key],\n          result = [];\n\n      if (isDefined(value) && value !== '') {\n        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n          value = value.toString();\n\n          if (modifier && modifier !== '*') {\n            value = value.substring(0, parseInt(modifier, 10));\n          }\n\n          result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n        } else {\n          if (modifier === '*') {\n            if (Array.isArray(value)) {\n              value.filter(isDefined).forEach(function (value) {\n                result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n              });\n            } else {\n              Object.keys(value).forEach(function (k) {\n                if (isDefined(value[k])) {\n                  result.push(encodeValue(operator, value[k], k));\n                }\n              });\n            }\n          } else {\n            var tmp = [];\n\n            if (Array.isArray(value)) {\n              value.filter(isDefined).forEach(function (value) {\n                tmp.push(encodeValue(operator, value));\n              });\n            } else {\n              Object.keys(value).forEach(function (k) {\n                if (isDefined(value[k])) {\n                  tmp.push(encodeURIComponent(k));\n                  tmp.push(encodeValue(operator, value[k].toString()));\n                }\n              });\n            }\n\n            if (isKeyOperator(operator)) {\n              result.push(encodeURIComponent(key) + '=' + tmp.join(','));\n            } else if (tmp.length !== 0) {\n              result.push(tmp.join(','));\n            }\n          }\n        }\n      } else {\n        if (operator === ';') {\n          result.push(encodeURIComponent(key));\n        } else if (value === '' && (operator === '&' || operator === '?')) {\n          result.push(encodeURIComponent(key) + '=');\n        } else if (value === '') {\n          result.push('');\n        }\n      }\n\n      return result;\n    }\n\n    function isDefined(value) {\n      return value !== undefined && value !== null;\n    }\n\n    function isKeyOperator(operator) {\n      return operator === ';' || operator === '&' || operator === '?';\n    }\n\n    function encodeValue(operator, value, key) {\n      value = operator === '+' || operator === '#' ? encodeReserved(value) : encodeURIComponent(value);\n\n      if (key) {\n        return encodeURIComponent(key) + '=' + value;\n      } else {\n        return value;\n      }\n    }\n\n    function encodeReserved(str) {\n      return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {\n        if (!/%[0-9A-Fa-f]/.test(part)) {\n          part = encodeURI(part);\n        }\n\n        return part;\n      }).join('');\n    }\n\n    /**\n     * URL Template (RFC 6570) Transform.\n     */\n    function template (options) {\n      var variables = [],\n          url = expand(options.url, options.params, variables);\n      variables.forEach(function (key) {\n        delete options.params[key];\n      });\n      return url;\n    }\n\n    /**\n     * Service for URL templating.\n     */\n    function Url(url, params) {\n      var self = this || {},\n          options$$1 = url,\n          transform;\n\n      if (isString(url)) {\n        options$$1 = {\n          url: url,\n          params: params\n        };\n      }\n\n      options$$1 = merge({}, Url.options, self.$options, options$$1);\n      Url.transforms.forEach(function (handler) {\n        if (isString(handler)) {\n          handler = Url.transform[handler];\n        }\n\n        if (isFunction(handler)) {\n          transform = factory(handler, transform, self.$vm);\n        }\n      });\n      return transform(options$$1);\n    }\n    /**\n     * Url options.\n     */\n\n    Url.options = {\n      url: '',\n      root: null,\n      params: {}\n    };\n    /**\n     * Url transforms.\n     */\n\n    Url.transform = {\n      template: template,\n      query: query,\n      root: root\n    };\n    Url.transforms = ['template', 'query', 'root'];\n    /**\n     * Encodes a Url parameter string.\n     *\n     * @param {Object} obj\n     */\n\n    Url.params = function (obj) {\n      var params = [],\n          escape = encodeURIComponent;\n\n      params.add = function (key, value) {\n        if (isFunction(value)) {\n          value = value();\n        }\n\n        if (value === null) {\n          value = '';\n        }\n\n        this.push(escape(key) + '=' + escape(value));\n      };\n\n      serialize(params, obj);\n      return params.join('&').replace(/%20/g, '+');\n    };\n    /**\n     * Parse a URL and return its components.\n     *\n     * @param {String} url\n     */\n\n\n    Url.parse = function (url) {\n      var el = document.createElement('a');\n\n      if (document.documentMode) {\n        el.href = url;\n        url = el.href;\n      }\n\n      el.href = url;\n      return {\n        href: el.href,\n        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',\n        port: el.port,\n        host: el.host,\n        hostname: el.hostname,\n        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,\n        search: el.search ? el.search.replace(/^\\?/, '') : '',\n        hash: el.hash ? el.hash.replace(/^#/, '') : ''\n      };\n    };\n\n    function factory(handler, next, vm) {\n      return function (options$$1) {\n        return handler.call(vm, options$$1, next);\n      };\n    }\n\n    function serialize(params, obj, scope) {\n      var array = isArray(obj),\n          plain = isPlainObject(obj),\n          hash;\n      each(obj, function (value, key) {\n        hash = isObject(value) || isArray(value);\n\n        if (scope) {\n          key = scope + '[' + (plain || hash ? key : '') + ']';\n        }\n\n        if (!scope && array) {\n          params.add(value.name, value.value);\n        } else if (hash) {\n          serialize(params, value, key);\n        } else {\n          params.add(key, value);\n        }\n      });\n    }\n\n    /**\n     * XDomain client (Internet Explorer).\n     */\n    function xdrClient (request) {\n      return new PromiseObj(function (resolve) {\n        var xdr = new XDomainRequest(),\n            handler = function handler(_ref) {\n          var type = _ref.type;\n          var status = 0;\n\n          if (type === 'load') {\n            status = 200;\n          } else if (type === 'error') {\n            status = 500;\n          }\n\n          resolve(request.respondWith(xdr.responseText, {\n            status: status\n          }));\n        };\n\n        request.abort = function () {\n          return xdr.abort();\n        };\n\n        xdr.open(request.method, request.getUrl());\n\n        if (request.timeout) {\n          xdr.timeout = request.timeout;\n        }\n\n        xdr.onload = handler;\n        xdr.onabort = handler;\n        xdr.onerror = handler;\n        xdr.ontimeout = handler;\n\n        xdr.onprogress = function () {};\n\n        xdr.send(request.getBody());\n      });\n    }\n\n    /**\n     * CORS Interceptor.\n     */\n    var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();\n    function cors (request) {\n      if (inBrowser) {\n        var orgUrl = Url.parse(location.href);\n        var reqUrl = Url.parse(request.getUrl());\n\n        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {\n          request.crossOrigin = true;\n          request.emulateHTTP = false;\n\n          if (!SUPPORTS_CORS) {\n            request.client = xdrClient;\n          }\n        }\n      }\n    }\n\n    /**\n     * Form data Interceptor.\n     */\n    function form (request) {\n      if (isFormData(request.body)) {\n        request.headers[\"delete\"]('Content-Type');\n      } else if (isObject(request.body) && request.emulateJSON) {\n        request.body = Url.params(request.body);\n        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');\n      }\n    }\n\n    /**\n     * JSON Interceptor.\n     */\n    function json (request) {\n      var type = request.headers.get('Content-Type') || '';\n\n      if (isObject(request.body) && type.indexOf('application/json') === 0) {\n        request.body = JSON.stringify(request.body);\n      }\n\n      return function (response) {\n        return response.bodyText ? when(response.text(), function (text) {\n          var type = response.headers.get('Content-Type') || '';\n\n          if (type.indexOf('application/json') === 0 || isJson(text)) {\n            try {\n              response.body = JSON.parse(text);\n            } catch (e) {\n              response.body = null;\n            }\n          } else {\n            response.body = text;\n          }\n\n          return response;\n        }) : response;\n      };\n    }\n\n    function isJson(str) {\n      var start = str.match(/^\\s*(\\[|\\{)/);\n      var end = {\n        '[': /]\\s*$/,\n        '{': /}\\s*$/\n      };\n      return start && end[start[1]].test(str);\n    }\n\n    /**\n     * JSONP client (Browser).\n     */\n    function jsonpClient (request) {\n      return new PromiseObj(function (resolve) {\n        var name = request.jsonp || 'callback',\n            callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2),\n            body = null,\n            handler,\n            script;\n\n        handler = function handler(_ref) {\n          var type = _ref.type;\n          var status = 0;\n\n          if (type === 'load' && body !== null) {\n            status = 200;\n          } else if (type === 'error') {\n            status = 500;\n          }\n\n          if (status && window[callback]) {\n            delete window[callback];\n            document.body.removeChild(script);\n          }\n\n          resolve(request.respondWith(body, {\n            status: status\n          }));\n        };\n\n        window[callback] = function (result) {\n          body = JSON.stringify(result);\n        };\n\n        request.abort = function () {\n          handler({\n            type: 'abort'\n          });\n        };\n\n        request.params[name] = callback;\n\n        if (request.timeout) {\n          setTimeout(request.abort, request.timeout);\n        }\n\n        script = document.createElement('script');\n        script.src = request.getUrl();\n        script.type = 'text/javascript';\n        script.async = true;\n        script.onload = handler;\n        script.onerror = handler;\n        document.body.appendChild(script);\n      });\n    }\n\n    /**\n     * JSONP Interceptor.\n     */\n    function jsonp (request) {\n      if (request.method == 'JSONP') {\n        request.client = jsonpClient;\n      }\n    }\n\n    /**\n     * Before Interceptor.\n     */\n    function before (request) {\n      if (isFunction(request.before)) {\n        request.before.call(this, request);\n      }\n    }\n\n    /**\n     * HTTP method override Interceptor.\n     */\n    function method (request) {\n      if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {\n        request.headers.set('X-HTTP-Method-Override', request.method);\n        request.method = 'POST';\n      }\n    }\n\n    /**\n     * Header Interceptor.\n     */\n    function header (request) {\n      var headers = assign({}, Http.headers.common, !request.crossOrigin ? Http.headers.custom : {}, Http.headers[toLower(request.method)]);\n      each(headers, function (value, name) {\n        if (!request.headers.has(name)) {\n          request.headers.set(name, value);\n        }\n      });\n    }\n\n    /**\n     * XMLHttp client (Browser).\n     */\n    function xhrClient (request) {\n      return new PromiseObj(function (resolve) {\n        var xhr = new XMLHttpRequest(),\n            handler = function handler(event) {\n          var response = request.respondWith('response' in xhr ? xhr.response : xhr.responseText, {\n            status: xhr.status === 1223 ? 204 : xhr.status,\n            // IE9 status bug\n            statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)\n          });\n          each(trim(xhr.getAllResponseHeaders()).split('\\n'), function (row) {\n            response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));\n          });\n          resolve(response);\n        };\n\n        request.abort = function () {\n          return xhr.abort();\n        };\n\n        xhr.open(request.method, request.getUrl(), true);\n\n        if (request.timeout) {\n          xhr.timeout = request.timeout;\n        }\n\n        if (request.responseType && 'responseType' in xhr) {\n          xhr.responseType = request.responseType;\n        }\n\n        if (request.withCredentials || request.credentials) {\n          xhr.withCredentials = true;\n        }\n\n        if (!request.crossOrigin) {\n          request.headers.set('X-Requested-With', 'XMLHttpRequest');\n        } // deprecated use downloadProgress\n\n\n        if (isFunction(request.progress) && request.method === 'GET') {\n          xhr.addEventListener('progress', request.progress);\n        }\n\n        if (isFunction(request.downloadProgress)) {\n          xhr.addEventListener('progress', request.downloadProgress);\n        } // deprecated use uploadProgress\n\n\n        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {\n          xhr.upload.addEventListener('progress', request.progress);\n        }\n\n        if (isFunction(request.uploadProgress) && xhr.upload) {\n          xhr.upload.addEventListener('progress', request.uploadProgress);\n        }\n\n        request.headers.forEach(function (value, name) {\n          xhr.setRequestHeader(name, value);\n        });\n        xhr.onload = handler;\n        xhr.onabort = handler;\n        xhr.onerror = handler;\n        xhr.ontimeout = handler;\n        xhr.send(request.getBody());\n      });\n    }\n\n    /**\n     * Http client (Node).\n     */\n    function nodeClient (request) {\n      var client = require('got');\n\n      return new PromiseObj(function (resolve) {\n        var url = request.getUrl();\n        var body = request.getBody();\n        var method = request.method;\n        var headers = {},\n            handler;\n        request.headers.forEach(function (value, name) {\n          headers[name] = value;\n        });\n        client(url, {\n          body: body,\n          method: method,\n          headers: headers\n        }).then(handler = function handler(resp) {\n          var response = request.respondWith(resp.body, {\n            status: resp.statusCode,\n            statusText: trim(resp.statusMessage)\n          });\n          each(resp.headers, function (value, name) {\n            response.headers.set(name, value);\n          });\n          resolve(response);\n        }, function (error$$1) {\n          return handler(error$$1.response);\n        });\n      });\n    }\n\n    /**\n     * Base client.\n     */\n    function Client (context) {\n      var reqHandlers = [sendRequest],\n          resHandlers = [];\n\n      if (!isObject(context)) {\n        context = null;\n      }\n\n      function Client(request) {\n        while (reqHandlers.length) {\n          var handler = reqHandlers.pop();\n\n          if (isFunction(handler)) {\n            var _ret = function () {\n              var response = void 0,\n                  next = void 0;\n              response = handler.call(context, request, function (val) {\n                return next = val;\n              }) || next;\n\n              if (isObject(response)) {\n                return {\n                  v: new PromiseObj(function (resolve, reject) {\n                    resHandlers.forEach(function (handler) {\n                      response = when(response, function (response) {\n                        return handler.call(context, response) || response;\n                      }, reject);\n                    });\n                    when(response, resolve, reject);\n                  }, context)\n                };\n              }\n\n              if (isFunction(response)) {\n                resHandlers.unshift(response);\n              }\n            }();\n\n            if (typeof _ret === \"object\") return _ret.v;\n          } else {\n            warn(\"Invalid interceptor of type \" + typeof handler + \", must be a function\");\n          }\n        }\n      }\n\n      Client.use = function (handler) {\n        reqHandlers.push(handler);\n      };\n\n      return Client;\n    }\n\n    function sendRequest(request) {\n      var client = request.client || (inBrowser ? xhrClient : nodeClient);\n      return client(request);\n    }\n\n    /**\n     * HTTP Headers.\n     */\n\n    var Headers = /*#__PURE__*/function () {\n      function Headers(headers) {\n        var _this = this;\n\n        this.map = {};\n        each(headers, function (value, name) {\n          return _this.append(name, value);\n        });\n      }\n\n      var _proto = Headers.prototype;\n\n      _proto.has = function has(name) {\n        return getName(this.map, name) !== null;\n      };\n\n      _proto.get = function get(name) {\n        var list = this.map[getName(this.map, name)];\n        return list ? list.join() : null;\n      };\n\n      _proto.getAll = function getAll(name) {\n        return this.map[getName(this.map, name)] || [];\n      };\n\n      _proto.set = function set(name, value) {\n        this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];\n      };\n\n      _proto.append = function append(name, value) {\n        var list = this.map[getName(this.map, name)];\n\n        if (list) {\n          list.push(trim(value));\n        } else {\n          this.set(name, value);\n        }\n      };\n\n      _proto[\"delete\"] = function _delete(name) {\n        delete this.map[getName(this.map, name)];\n      };\n\n      _proto.deleteAll = function deleteAll() {\n        this.map = {};\n      };\n\n      _proto.forEach = function forEach(callback, thisArg) {\n        var _this2 = this;\n\n        each(this.map, function (list, name) {\n          each(list, function (value) {\n            return callback.call(thisArg, value, name, _this2);\n          });\n        });\n      };\n\n      return Headers;\n    }();\n\n    function getName(map, name) {\n      return Object.keys(map).reduce(function (prev, curr) {\n        return toLower(name) === toLower(curr) ? curr : prev;\n      }, null);\n    }\n\n    function normalizeName(name) {\n      if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n        throw new TypeError('Invalid character in header field name');\n      }\n\n      return trim(name);\n    }\n\n    /**\n     * HTTP Response.\n     */\n\n    var Response = /*#__PURE__*/function () {\n      function Response(body, _ref) {\n        var url = _ref.url,\n            headers = _ref.headers,\n            status = _ref.status,\n            statusText = _ref.statusText;\n        this.url = url;\n        this.ok = status >= 200 && status < 300;\n        this.status = status || 0;\n        this.statusText = statusText || '';\n        this.headers = new Headers(headers);\n        this.body = body;\n\n        if (isString(body)) {\n          this.bodyText = body;\n        } else if (isBlob(body)) {\n          this.bodyBlob = body;\n\n          if (isBlobText(body)) {\n            this.bodyText = blobText(body);\n          }\n        }\n      }\n\n      var _proto = Response.prototype;\n\n      _proto.blob = function blob() {\n        return when(this.bodyBlob);\n      };\n\n      _proto.text = function text() {\n        return when(this.bodyText);\n      };\n\n      _proto.json = function json() {\n        return when(this.text(), function (text) {\n          return JSON.parse(text);\n        });\n      };\n\n      return Response;\n    }();\n    Object.defineProperty(Response.prototype, 'data', {\n      get: function get() {\n        return this.body;\n      },\n      set: function set(body) {\n        this.body = body;\n      }\n    });\n\n    function blobText(body) {\n      return new PromiseObj(function (resolve) {\n        var reader = new FileReader();\n        reader.readAsText(body);\n\n        reader.onload = function () {\n          resolve(reader.result);\n        };\n      });\n    }\n\n    function isBlobText(body) {\n      return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;\n    }\n\n    /**\n     * HTTP Request.\n     */\n\n    var Request = /*#__PURE__*/function () {\n      function Request(options$$1) {\n        this.body = null;\n        this.params = {};\n        assign(this, options$$1, {\n          method: toUpper(options$$1.method || 'GET')\n        });\n\n        if (!(this.headers instanceof Headers)) {\n          this.headers = new Headers(this.headers);\n        }\n      }\n\n      var _proto = Request.prototype;\n\n      _proto.getUrl = function getUrl() {\n        return Url(this);\n      };\n\n      _proto.getBody = function getBody() {\n        return this.body;\n      };\n\n      _proto.respondWith = function respondWith(body, options$$1) {\n        return new Response(body, assign(options$$1 || {}, {\n          url: this.getUrl()\n        }));\n      };\n\n      return Request;\n    }();\n\n    /**\n     * Service for sending network requests.\n     */\n    var COMMON_HEADERS = {\n      'Accept': 'application/json, text/plain, */*'\n    };\n    var JSON_CONTENT_TYPE = {\n      'Content-Type': 'application/json;charset=utf-8'\n    };\n    function Http(options$$1) {\n      var self = this || {},\n          client = Client(self.$vm);\n      defaults(options$$1 || {}, self.$options, Http.options);\n      Http.interceptors.forEach(function (handler) {\n        if (isString(handler)) {\n          handler = Http.interceptor[handler];\n        }\n\n        if (isFunction(handler)) {\n          client.use(handler);\n        }\n      });\n      return client(new Request(options$$1)).then(function (response) {\n        return response.ok ? response : PromiseObj.reject(response);\n      }, function (response) {\n        if (response instanceof Error) {\n          error(response);\n        }\n\n        return PromiseObj.reject(response);\n      });\n    }\n    Http.options = {};\n    Http.headers = {\n      put: JSON_CONTENT_TYPE,\n      post: JSON_CONTENT_TYPE,\n      patch: JSON_CONTENT_TYPE,\n      \"delete\": JSON_CONTENT_TYPE,\n      common: COMMON_HEADERS,\n      custom: {}\n    };\n    Http.interceptor = {\n      before: before,\n      method: method,\n      jsonp: jsonp,\n      json: json,\n      form: form,\n      header: header,\n      cors: cors\n    };\n    Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];\n    ['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {\n      Http[method$$1] = function (url, options$$1) {\n        return this(assign(options$$1 || {}, {\n          url: url,\n          method: method$$1\n        }));\n      };\n    });\n    ['post', 'put', 'patch'].forEach(function (method$$1) {\n      Http[method$$1] = function (url, body, options$$1) {\n        return this(assign(options$$1 || {}, {\n          url: url,\n          method: method$$1,\n          body: body\n        }));\n      };\n    });\n\n    /**\n     * Service for interacting with RESTful services.\n     */\n    function Resource(url, params, actions, options$$1) {\n      var self = this || {},\n          resource = {};\n      actions = assign({}, Resource.actions, actions);\n      each(actions, function (action, name) {\n        action = merge({\n          url: url,\n          params: assign({}, params)\n        }, options$$1, action);\n\n        resource[name] = function () {\n          return (self.$http || Http)(opts(action, arguments));\n        };\n      });\n      return resource;\n    }\n\n    function opts(action, args) {\n      var options$$1 = assign({}, action),\n          params = {},\n          body;\n\n      switch (args.length) {\n        case 2:\n          params = args[0];\n          body = args[1];\n          break;\n\n        case 1:\n          if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {\n            body = args[0];\n          } else {\n            params = args[0];\n          }\n\n          break;\n\n        case 0:\n          break;\n\n        default:\n          throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';\n      }\n\n      options$$1.body = body;\n      options$$1.params = assign({}, options$$1.params, params);\n      return options$$1;\n    }\n\n    Resource.actions = {\n      get: {\n        method: 'GET'\n      },\n      save: {\n        method: 'POST'\n      },\n      query: {\n        method: 'GET'\n      },\n      update: {\n        method: 'PUT'\n      },\n      remove: {\n        method: 'DELETE'\n      },\n      \"delete\": {\n        method: 'DELETE'\n      }\n    };\n\n    /**\n     * Install plugin.\n     */\n\n    function plugin(Vue) {\n      if (plugin.installed) {\n        return;\n      }\n\n      Util(Vue);\n      Vue.url = Url;\n      Vue.http = Http;\n      Vue.resource = Resource;\n      Vue.Promise = PromiseObj;\n      Object.defineProperties(Vue.prototype, {\n        $url: {\n          get: function get() {\n            return options(Vue.url, this, this.$options.url);\n          }\n        },\n        $http: {\n          get: function get() {\n            return options(Vue.http, this, this.$options.http);\n          }\n        },\n        $resource: {\n          get: function get() {\n            return Vue.resource.bind(this);\n          }\n        },\n        $promise: {\n          get: function get() {\n            var _this = this;\n\n            return function (executor) {\n              return new Vue.Promise(executor, _this);\n            };\n          }\n        }\n      });\n    }\n\n    if (typeof window !== 'undefined' && window.Vue && !window.Vue.resource) {\n      window.Vue.use(plugin);\n    }\n\n    return plugin;\n\n})));\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Documentation\n\n- [Configuration](config.md)\n- [HTTP Requests/Response](http.md)\n- [Creating Resources](resource.md)\n- [Code Recipes](recipes.md)\n- [API Reference](api.md)\n"
  },
  {
    "path": "docs/api.md",
    "content": "# API Reference\n\n## Request\n\n```js\n{\n  // Constructor\n  constructor(object: config)\n\n  // Properties\n  url (string)\n  body (any)\n  headers (Headers)\n  method (string)\n  params (object)\n  timeout (number)\n  credentials (boolean)\n  emulateHTTP (boolean)\n  emulateJSON (boolean)\n  before (function(Request))\n  progress (function(Event))\n\n  // Methods\n  getUrl() (string)\n  getBody() (any)\n  respondWith(any: body, object: config) (Response)\n  abort()\n}\n```\n\n## Response\n\n```js\n{\n  // Constructor\n  constructor(any: body, object: {string: url, object: headers, number: status, string: statusText})\n\n  // Properties\n  url (string)\n  body (any)\n  headers (Headers)\n  ok (boolean)\n  status (number)\n  statusText (string)\n\n  // Methods\n  blob() (Promise)\n  text() (Promise)\n  json() (Promise)\n}\n```\n\n## Headers\n\n```js\n{\n  // Constructor\n  constructor(object: headers)\n\n  // Properties\n  map (object)\n\n  // Methods\n  has(string: name) (boolean)\n  get(string: name) (string)\n  getAll() (string[])\n  set(string: name, string: value) (void)\n  append(string: name, string: value) (void)\n  delete(string: name) (void)\n  forEach(function: callback, any: thisArg) (void)\n}\n```\n"
  },
  {
    "path": "docs/config.md",
    "content": "# Configuration\n\nSet default values using the global configuration.\n\n```js\nVue.http.options.root = '/root';\nVue.http.headers.common['Authorization'] = 'Basic YXBpOnBhc3N3b3Jk';\n```\n\nSet default values inside your Vue component options.\n\n```js\nnew Vue({\n\n  http: {\n    root: '/root',\n    headers: {\n      Authorization: 'Basic YXBpOnBhc3N3b3Jk'\n    }\n  }\n\n})\n```\n\nNote that for the root option to work, the path of the request must be relative. This will use this the root option: `Vue.http.get('someUrl')` while this will not: `Vue.http.get('/someUrl')`.\n\n## Webpack/Browserify\n\nAdd `vue` and `vue-resource` to your `package.json`, then `npm install`, then add these lines in your code:\n\n```js\nvar Vue = require('vue');\nvar VueResource = require('vue-resource');\n\nVue.use(VueResource);\n```\n\n## Legacy web servers\n\nIf your web server can't handle requests encoded as `application/json`, you can enable the `emulateJSON` option. This will send the request as `application/x-www-form-urlencoded` MIME type, as if from an normal HTML form.\n\n```js\nVue.http.options.emulateJSON = true;\n```\n\nIf your web server can't handle REST/HTTP requests like `PUT`, `PATCH` and `DELETE`, you can enable the `emulateHTTP` option. This will set the `X-HTTP-Method-Override` header with the actual HTTP method and use a normal `POST` request.\n\n```js\nVue.http.options.emulateHTTP = true;\n```\n\n## Typescript Support\n\nTypescript for vue-resource should work out of the box since the type definition files are included within the npm package.\n"
  },
  {
    "path": "docs/http.md",
    "content": "# HTTP\n\nThe http service can be used globally `Vue.http` or in a Vue instance `this.$http`.\n\n## Usage\n\nA Vue instance provides the `this.$http` service which can send HTTP requests. A request method call returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) that resolves to the response. Also the Vue instance will be automatically bound to `this` in all function callbacks.\n\n```js\n{\n  // GET /someUrl\n  this.$http.get('/someUrl').then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n}\n```\n\n## Methods\n\nShortcut methods are available for all request types. These methods work globally or in a Vue instance.\n\n```js\n// global Vue object\nVue.http.get('/someUrl', [config]).then(successCallback, errorCallback);\nVue.http.post('/someUrl', [body], [config]).then(successCallback, errorCallback);\n\n// in a Vue instance\nthis.$http.get('/someUrl', [config]).then(successCallback, errorCallback);\nthis.$http.post('/someUrl', [body], [config]).then(successCallback, errorCallback);\n```\nList of shortcut methods:\n\n* `get(url, [config])`\n* `head(url, [config])`\n* `delete(url, [config])`\n* `jsonp(url, [config])`\n* `post(url, [body], [config])`\n* `put(url, [body], [config])`\n* `patch(url, [body], [config])`\n\n## Config\n\nParameter | Type | Description\n--------- | ---- | -----------\nurl | `string` | URL to which the request is sent\nbody | `Object`, `FormData`, `string` | Data to be sent as the request body\nheaders | `Object` | Headers object to be sent as HTTP request headers\nparams | `Object` | Parameters object to be sent as URL parameters\nmethod | `string` | HTTP method (e.g. GET, POST, ...)\nresponseType | `string` | Type of the response body (e.g. text, blob, json, ...)\ntimeout | `number` | Request timeout in milliseconds (`0` means no timeout)\ncredentials | `boolean` | Indicates whether or not cross-site Access-Control requests should be made using credentials\nemulateHTTP | `boolean` | Send PUT, PATCH and DELETE requests with a HTTP POST and set the `X-HTTP-Method-Override` header\nemulateJSON | `boolean` | Send request body as `application/x-www-form-urlencoded` content type\nbefore | `function(request)` | Callback function to modify the request object before it is sent\nuploadProgress | `function(event)` | Callback function to handle the [ProgressEvent](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent) of uploads\ndownloadProgress | `function(event)` | Callback function to handle the [ProgressEvent](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent) of downloads\n\n## Response\n\nA request resolves to a response object with the following properties and methods:\n\nProperty | Type | Description\n-------- | ---- | -----------\nurl | `string` | Response URL origin\nbody | `Object`, `Blob`, `string` | Response body\nheaders | `Header` | Response Headers object\nok | `boolean` | HTTP status code between 200 and 299\nstatus | `number` | HTTP status code of the response\nstatusText | `string` | HTTP status text of the response\n**Method** | **Type** | **Description**\ntext() | `Promise` | Resolves the body as string\njson() | `Promise` | Resolves the body as parsed JSON object\nblob() | `Promise` | Resolves the body as Blob object\n\n## Example\n\n```js\n{\n  // POST /someUrl\n  this.$http.post('/someUrl', {foo: 'bar'}).then(response => {\n\n    // get status\n    response.status;\n\n    // get status text\n    response.statusText;\n\n    // get 'Expires' header\n    response.headers.get('Expires');\n\n    // get body data\n    this.someData = response.body;\n\n  }, response => {\n    // error callback\n  });\n}\n```\n\nSend a get request with URL query parameters and a custom headers.\n\n```js\n{\n  // GET /someUrl?foo=bar\n  this.$http.get('/someUrl', {params: {foo: 'bar'}, headers: {'X-Custom': '...'}}).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n}\n```\n\nFetch an image and use the blob() method to extract the image body content from the response.\n\n```js\n{\n  // GET /image.jpg\n  this.$http.get('/image.jpg', {responseType: 'blob'}).then(response => {\n\n    // resolve to Blob\n    return response.blob();\n\n  }).then(blob => {\n    // use image Blob\n  });\n}\n```\n\n## Interceptors\n\nInterceptors can be defined globally and are used for pre- and postprocessing of a request. If a request is sent using `this.$http` or `this.$resource` the current Vue instance is available as `this` in a interceptor callback.\n\n### Request processing\n```js\nVue.http.interceptors.push(function(request) {\n\n  // modify method\n  request.method = 'POST';\n\n  // modify headers\n  request.headers.set('X-CSRF-TOKEN', 'TOKEN');\n  request.headers.set('Authorization', 'Bearer TOKEN');\n\n});\n```\n\n### Request and Response processing\n```js\nVue.http.interceptors.push(function(request) {\n\n  // modify request\n  request.method = 'POST';\n\n  // return response callback\n  return function(response) {\n\n    // modify response\n    response.body = '...';\n\n  };\n});\n```\n\n### Return a Response and stop processing\n```js\nVue.http.interceptors.push(function(request) {\n\n  // modify request ...\n\n  // stop and return response\n  return request.respondWith(body, {\n    status: 404,\n    statusText: 'Not found'\n  });\n});\n```\n\n### Overriding default interceptors\n\nAll default interceptors callbacks can be overriden to change their behavior. All interceptors are exposed through the `Vue.http.interceptor` object with their names `before`, `method`, `jsonp`, `json`, `form`, `header` and `cors`.\n\n```js\nVue.http.interceptor.before = function(request) {\n\n  // override before interceptor\n\n};\n"
  },
  {
    "path": "docs/recipes.md",
    "content": "# Code Recipes\n\nThe Recipes provide code examples to common use-cases. If you want to share your recipe feel free to send a [pull request](https://github.com/pagekit/vue-resource/pulls).\n\n## Forms\n\nSending forms using [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData).\n\n```js\n{\n  var formData = new FormData();\n\n  // append string\n  formData.append('foo', 'bar');\n\n  // append Blob/File object\n  formData.append('pic', fileInput, 'mypic.jpg');\n\n  // POST /someUrl\n  this.$http.post('/someUrl', formData).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n}\n```\n\n## Abort a request\n\nAbort a previous request when a new request is about to be sent. For example when typing in a autocomplete input.\n\n```js\n{\n  // GET /someUrl\n  this.$http.get('/someUrl', {\n\n    // use before callback\n    before(request) {\n\n      // abort previous request, if exists\n      if (this.previousRequest) {\n        this.previousRequest.abort();\n      }\n\n      // set previous request on Vue instance\n      this.previousRequest = request;\n    }\n\n  }).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n}\n```\n"
  },
  {
    "path": "docs/resource.md",
    "content": "# Resource\n\nThe resource service can be used globally `Vue.resource` or in a Vue instance `this.$resource`.\n\n## Methods\n\n* `resource(url, [params], [actions], [options])`\n\n## Default Actions\n\n```js\nget: {method: 'GET'},\nsave: {method: 'POST'},\nquery: {method: 'GET'},\nupdate: {method: 'PUT'},\nremove: {method: 'DELETE'},\ndelete: {method: 'DELETE'}\n```\n\n## Example\n\n```js\n{\n  var resource = this.$resource('someItem{/id}');\n\n  // GET someItem/1\n  resource.get({id: 1}).then(response => {\n    this.item = response.body;\n  });\n\n  // POST someItem/1\n  resource.save({id: 1}, {item: this.item}).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n\n  // DELETE someItem/1\n  resource.delete({id: 1}).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n}\n```\n\n## Custom Actions\n\n```js\n{\n  var customActions = {\n    foo: {method: 'GET', url: 'someItem/foo{/id}'},\n    bar: {method: 'POST', url: 'someItem/bar{/id}'}\n  }\n\n  var resource = this.$resource('someItem{/id}', {}, customActions);\n\n  // GET someItem/foo/1\n  resource.foo({id: 1}).then(response => {\n    this.item = response.body;\n  });\n\n  // POST someItem/bar/1\n  resource.bar({id: 1}, {item: this.item}).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n}\n```\n\n**Note:** When passing only one single object (for POST, PUT and PATCH custom actions), it will defaults to body param. If you need set url params you will have to pass an empty object as second argument.\n\n```js\n{\n  var resource = this.$resource('someItem{/id}', {}, {\n    baz: {method: 'POST', url: 'someItem/baz{/id}'}\n  });\n\n  // POST someItem/baz\n  resource.baz({id: 1}).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n\n  // POST someItem/baz/1\n  resource.baz({id: 1}, {}).then(response => {\n    // success callback\n  }, response => {\n    // error callback\n  });\n```\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"vue-resource\",\n    \"version\": \"1.5.3\",\n    \"main\": \"dist/vue-resource.common.js\",\n    \"module\": \"dist/vue-resource.esm.js\",\n    \"unpkg\": \"dist/vue-resource.min.js\",\n    \"jsdelivr\": \"dist/vue-resource.min.js\",\n    \"typings\": \"types/index.d.ts\",\n    \"description\": \"The HTTP client for Vue.js\",\n    \"homepage\": \"https://github.com/pagekit/vue-resource\",\n    \"license\": \"MIT\",\n    \"keywords\": [\n        \"vue\",\n        \"xhr\",\n        \"http\",\n        \"ajax\"\n    ],\n    \"bugs\": {\n        \"url\": \"https://github.com/pagekit/vue-resource/issues\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/pagekit/vue-resource.git\"\n    },\n    \"scripts\": {\n        \"up\": \"yarn upgrade-interactive --latest\",\n        \"test\": \"jest --env=node\",\n        \"karma\": \"karma start test/karma.conf.js --single-run\",\n        \"build\": \"node build/build.js\",\n        \"release\": \"node build/release.js\",\n        \"webpack\": \"webpack --config test/webpack.config.js\"\n    },\n    \"browser\": {\n        \"got\": false\n    },\n    \"dependencies\": {\n        \"got\": \">=8.0 <12.0\"\n    },\n    \"devDependencies\": {\n        \"@babel/core\": \"^7.2.2\",\n        \"@babel/preset-env\": \"^7.2.0\",\n        \"babel-loader\": \"^8.0.4\",\n        \"eslint\": \"^5.11.1\",\n        \"generate-release\": \"^1.1.1\",\n        \"jasmine\": \"^3.3.1\",\n        \"jasmine-core\": \"^3.3.0\",\n        \"jest\": \"^23.6.0\",\n        \"karma\": \"^3.1.4\",\n        \"karma-chrome-launcher\": \"^2.2.0\",\n        \"karma-firefox-launcher\": \"^1.1.0\",\n        \"karma-jasmine\": \"^2.0.1\",\n        \"karma-safari-launcher\": \"^1.0.0\",\n        \"karma-webpack\": \"^3.0.5\",\n        \"replace-in-file\": \"^3.4.2\",\n        \"rollup\": \"^0.66.0\",\n        \"rollup-plugin-babel\": \"^4.1.0\",\n        \"rollup-plugin-replace\": \"^2.1.0\",\n        \"uglify-js\": \"^3.4.9\",\n        \"vue\": \"^2.5.21\",\n        \"webpack\": \"^4.28.3\",\n        \"webpack-cli\": \"^3.1.2\"\n    }\n}\n"
  },
  {
    "path": "src/http/client/index.js",
    "content": "/**\n * Base client.\n */\n\nimport Promise from '../../promise';\nimport xhrClient from './xhr';\nimport nodeClient from './node';\nimport {warn, when, isObject, isFunction, inBrowser} from '../../util';\n\nexport default function (context) {\n\n    const reqHandlers = [sendRequest], resHandlers = [];\n\n    if (!isObject(context)) {\n        context = null;\n    }\n\n    function Client(request) {\n        while (reqHandlers.length) {\n\n            const handler = reqHandlers.pop();\n\n            if (isFunction(handler)) {\n\n                let response, next;\n\n                response = handler.call(context, request, val => next = val) || next;\n\n                if (isObject(response)) {\n                    return new Promise((resolve, reject) => {\n\n                        resHandlers.forEach(handler => {\n                            response = when(response, response => {\n                                return handler.call(context, response) || response;\n                            }, reject);\n                        });\n\n                        when(response, resolve, reject);\n\n                    }, context);\n                }\n\n                if (isFunction(response)) {\n                    resHandlers.unshift(response);\n                }\n\n            } else {\n                warn(`Invalid interceptor of type ${typeof handler}, must be a function`);\n            }\n        }\n    }\n\n    Client.use = handler => {\n        reqHandlers.push(handler);\n    };\n\n    return Client;\n}\n\nfunction sendRequest(request) {\n\n    const client = request.client || (inBrowser ? xhrClient : nodeClient);\n\n    return client(request);\n}\n"
  },
  {
    "path": "src/http/client/jsonp.js",
    "content": "/**\n * JSONP client (Browser).\n */\n\nimport Promise from '../../promise';\n\nexport default function (request) {\n    return new Promise(resolve => {\n\n        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;\n\n        handler = ({type}) => {\n\n            var status = 0;\n\n            if (type === 'load' && body !== null) {\n                status = 200;\n            } else if (type === 'error') {\n                status = 500;\n            }\n\n            if (status && window[callback]) {\n                delete window[callback];\n                document.body.removeChild(script);\n            }\n\n            resolve(request.respondWith(body, {status}));\n        };\n\n        window[callback] = result => {\n            body = JSON.stringify(result);\n        };\n\n        request.abort = () => {\n            handler({type: 'abort'});\n        };\n\n        request.params[name] = callback;\n\n        if (request.timeout) {\n            setTimeout(request.abort, request.timeout);\n        }\n\n        script = document.createElement('script');\n        script.src = request.getUrl();\n        script.type = 'text/javascript';\n        script.async = true;\n        script.onload = handler;\n        script.onerror = handler;\n\n        document.body.appendChild(script);\n    });\n}\n"
  },
  {
    "path": "src/http/client/node.js",
    "content": "/**\n * Http client (Node).\n */\n\nimport Promise from '../../promise';\nimport {each, trim} from '../../util';\n\nexport default function (request) {\n\n    const client = require('got');\n\n    return new Promise(resolve => {\n\n        var url = request.getUrl();\n        var body = request.getBody();\n        var method = request.method;\n        var headers = {}, handler;\n\n        request.headers.forEach((value, name) => {\n            headers[name] = value;\n        });\n\n        client(url, {body, method, headers}).then(handler = (resp) => {\n\n            var response = request.respondWith(resp.body, {\n                status: resp.statusCode,\n                statusText: trim(resp.statusMessage)\n            });\n\n            each(resp.headers, (value, name) => {\n                response.headers.set(name, value);\n            });\n\n            resolve(response);\n\n        }, error => handler(error.response));\n    });\n}\n"
  },
  {
    "path": "src/http/client/xdr.js",
    "content": "/**\n * XDomain client (Internet Explorer).\n */\n\nimport Promise from '../../promise';\n\nexport default function (request) {\n    return new Promise(resolve => {\n\n        var xdr = new XDomainRequest(), handler = ({type}) => {\n\n                var status = 0;\n\n                if (type === 'load') {\n                    status = 200;\n                } else if (type === 'error') {\n                    status = 500;\n                }\n\n                resolve(request.respondWith(xdr.responseText, {status}));\n            };\n\n        request.abort = () => xdr.abort();\n\n        xdr.open(request.method, request.getUrl());\n\n        if (request.timeout) {\n            xdr.timeout = request.timeout;\n        }\n\n        xdr.onload = handler;\n        xdr.onabort = handler;\n        xdr.onerror = handler;\n        xdr.ontimeout = handler;\n        xdr.onprogress = () => {};\n        xdr.send(request.getBody());\n    });\n}\n"
  },
  {
    "path": "src/http/client/xhr.js",
    "content": "/**\n * XMLHttp client (Browser).\n */\n\nimport Promise from '../../promise';\nimport {each, trim, isFunction} from '../../util';\n\nexport default function (request) {\n    return new Promise(resolve => {\n\n        var xhr = new XMLHttpRequest(), handler = (event) => {\n\n                var response = request.respondWith(\n                'response' in xhr ? xhr.response : xhr.responseText, {\n                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug\n                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)\n                });\n\n                each(trim(xhr.getAllResponseHeaders()).split('\\n'), row => {\n                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));\n                });\n\n                resolve(response);\n            };\n\n        request.abort = () => xhr.abort();\n\n        xhr.open(request.method, request.getUrl(), true);\n\n        if (request.timeout) {\n            xhr.timeout = request.timeout;\n        }\n\n        if (request.responseType && 'responseType' in xhr) {\n            xhr.responseType = request.responseType;\n        }\n\n        if (request.withCredentials || request.credentials) {\n            xhr.withCredentials = true;\n        }\n\n        if (!request.crossOrigin) {\n            request.headers.set('X-Requested-With', 'XMLHttpRequest');\n        }\n\n        // deprecated use downloadProgress\n        if (isFunction(request.progress) && request.method === 'GET') {\n            xhr.addEventListener('progress', request.progress);\n        }\n\n        if (isFunction(request.downloadProgress)) {\n            xhr.addEventListener('progress', request.downloadProgress);\n        }\n\n        // deprecated use uploadProgress\n        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {\n            xhr.upload.addEventListener('progress', request.progress);\n        }\n\n        if (isFunction(request.uploadProgress) && xhr.upload) {\n            xhr.upload.addEventListener('progress', request.uploadProgress);\n        }\n\n        request.headers.forEach((value, name) => {\n            xhr.setRequestHeader(name, value);\n        });\n\n        xhr.onload = handler;\n        xhr.onabort = handler;\n        xhr.onerror = handler;\n        xhr.ontimeout = handler;\n        xhr.send(request.getBody());\n    });\n}\n"
  },
  {
    "path": "src/http/headers.js",
    "content": "/**\n * HTTP Headers.\n */\n\nimport {each, trim, toLower} from '../util';\n\nexport default class Headers {\n\n    constructor(headers) {\n\n        this.map = {};\n\n        each(headers, (value, name) => this.append(name, value));\n    }\n\n    has(name) {\n        return getName(this.map, name) !== null;\n    }\n\n    get(name) {\n\n        var list = this.map[getName(this.map, name)];\n\n        return list ? list.join() : null;\n    }\n\n    getAll(name) {\n        return this.map[getName(this.map, name)] || [];\n    }\n\n    set(name, value) {\n        this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];\n    }\n\n    append(name, value) {\n\n        var list = this.map[getName(this.map, name)];\n\n        if (list) {\n            list.push(trim(value));\n        } else {\n            this.set(name, value);\n        }\n    }\n\n    delete(name) {\n        delete this.map[getName(this.map, name)];\n    }\n\n    deleteAll() {\n        this.map = {};\n    }\n\n    forEach(callback, thisArg) {\n        each(this.map, (list, name) => {\n            each(list, value => callback.call(thisArg, value, name, this));\n        });\n    }\n\n}\n\nfunction getName(map, name) {\n    return Object.keys(map).reduce((prev, curr) => {\n        return toLower(name) === toLower(curr) ? curr : prev;\n    }, null);\n}\n\nfunction normalizeName(name) {\n\n    if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n        throw new TypeError('Invalid character in header field name');\n    }\n\n    return trim(name);\n}\n"
  },
  {
    "path": "src/http/index.js",
    "content": "/**\n * Service for sending network requests.\n */\n\nconst COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};\nconst JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};\n\nimport cors from './interceptor/cors';\nimport form from './interceptor/form';\nimport json from './interceptor/json';\nimport jsonp from './interceptor/jsonp';\nimport before from './interceptor/before';\nimport method from './interceptor/method';\nimport header from './interceptor/header';\nimport Client from './client/index';\nimport Request from './request';\nimport Promise from '../promise';\nimport {assign, defaults, error, isString, isFunction} from '../util';\n\nexport default function Http(options) {\n\n    var self = this || {}, client = Client(self.$vm);\n\n    defaults(options || {}, self.$options, Http.options);\n\n    Http.interceptors.forEach(handler => {\n\n        if (isString(handler)) {\n            handler = Http.interceptor[handler];\n        }\n\n        if (isFunction(handler)) {\n            client.use(handler);\n        }\n\n    });\n\n    return client(new Request(options)).then(response => {\n\n        return response.ok ? response : Promise.reject(response);\n\n    }, response => {\n\n        if (response instanceof Error) {\n            error(response);\n        }\n\n        return Promise.reject(response);\n    });\n}\n\nHttp.options = {};\n\nHttp.headers = {\n    put: JSON_CONTENT_TYPE,\n    post: JSON_CONTENT_TYPE,\n    patch: JSON_CONTENT_TYPE,\n    delete: JSON_CONTENT_TYPE,\n    common: COMMON_HEADERS,\n    custom: {}\n};\n\nHttp.interceptor = {before, method, jsonp, json, form, header, cors};\nHttp.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];\n\n['get', 'delete', 'head', 'jsonp'].forEach(method => {\n\n    Http[method] = function (url, options) {\n        return this(assign(options || {}, {url, method}));\n    };\n\n});\n\n['post', 'put', 'patch'].forEach(method => {\n\n    Http[method] = function (url, body, options) {\n        return this(assign(options || {}, {url, method, body}));\n    };\n\n});\n"
  },
  {
    "path": "src/http/interceptor/before.js",
    "content": "/**\n * Before Interceptor.\n */\n\nimport {isFunction} from '../../util';\n\nexport default function (request) {\n\n    if (isFunction(request.before)) {\n        request.before.call(this, request);\n    }\n\n}\n"
  },
  {
    "path": "src/http/interceptor/cors.js",
    "content": "/**\n * CORS Interceptor.\n */\n\nimport Url from '../../url/index';\nimport xdrClient from '../client/xdr';\nimport {inBrowser} from '../../util';\n\nconst SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();\n\nexport default function (request) {\n\n    if (inBrowser) {\n\n        const orgUrl = Url.parse(location.href);\n        const reqUrl = Url.parse(request.getUrl());\n\n        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {\n\n            request.crossOrigin = true;\n            request.emulateHTTP = false;\n\n            if (!SUPPORTS_CORS) {\n                request.client = xdrClient;\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/http/interceptor/form.js",
    "content": "/**\n * Form data Interceptor.\n */\n\nimport Url from '../../url/index';\nimport {isObject, isFormData} from '../../util';\n\nexport default function (request) {\n\n    if (isFormData(request.body)) {\n        request.headers.delete('Content-Type');\n    } else if (isObject(request.body) && request.emulateJSON) {\n        request.body = Url.params(request.body);\n        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');\n    }\n\n}\n"
  },
  {
    "path": "src/http/interceptor/header.js",
    "content": "/**\n * Header Interceptor.\n */\n\nimport Http from '../index';\nimport {assign, each, toLower} from '../../util';\n\nexport default function (request) {\n\n    const headers = assign({}, Http.headers.common,\n        !request.crossOrigin ? Http.headers.custom : {},\n        Http.headers[toLower(request.method)]\n    );\n\n    each(headers, (value, name) => {\n        if (!request.headers.has(name)) {\n            request.headers.set(name, value);\n        }\n    });\n\n}\n"
  },
  {
    "path": "src/http/interceptor/json.js",
    "content": "/**\n * JSON Interceptor.\n */\n\nimport {when, isObject} from '../../util';\n\nexport default function (request) {\n\n    const type = request.headers.get('Content-Type') || '';\n\n    if (isObject(request.body) && type.indexOf('application/json') === 0) {\n        request.body = JSON.stringify(request.body);\n    }\n\n    return response => {\n\n        return response.bodyText ? when(response.text(), text => {\n\n            const type = response.headers.get('Content-Type') || '';\n\n            if (type.indexOf('application/json') === 0 || isJson(text)) {\n\n                try {\n                    response.body = JSON.parse(text);\n                } catch (e) {\n                    response.body = null;\n                }\n\n            } else {\n                response.body = text;\n            }\n\n            return response;\n\n        }) : response;\n\n    };\n}\n\nfunction isJson(str) {\n\n    const start = str.match(/^\\s*(\\[|\\{)/);\n    const end = {'[': /]\\s*$/, '{': /}\\s*$/};\n\n    return start && end[start[1]].test(str);\n}\n"
  },
  {
    "path": "src/http/interceptor/jsonp.js",
    "content": "/**\n * JSONP Interceptor.\n */\n\nimport jsonpClient from '../client/jsonp';\n\nexport default function (request) {\n\n    if (request.method == 'JSONP') {\n        request.client = jsonpClient;\n    }\n\n}\n"
  },
  {
    "path": "src/http/interceptor/method.js",
    "content": "/**\n * HTTP method override Interceptor.\n */\n\nexport default function (request) {\n\n    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {\n        request.headers.set('X-HTTP-Method-Override', request.method);\n        request.method = 'POST';\n    }\n\n}\n"
  },
  {
    "path": "src/http/request.js",
    "content": "/**\n * HTTP Request.\n */\n\nimport Url from '../url/index';\nimport Headers from './headers';\nimport Response from './response';\nimport {assign, toUpper} from '../util';\n\nexport default class Request {\n\n    constructor(options) {\n\n        this.body = null;\n        this.params = {};\n\n        assign(this, options, {\n            method: toUpper(options.method || 'GET')\n        });\n\n        if (!(this.headers instanceof Headers)) {\n            this.headers = new Headers(this.headers);\n        }\n    }\n\n    getUrl() {\n        return Url(this);\n    }\n\n    getBody() {\n        return this.body;\n    }\n\n    respondWith(body, options) {\n        return new Response(body, assign(options || {}, {url: this.getUrl()}));\n    }\n\n}\n"
  },
  {
    "path": "src/http/response.js",
    "content": "/**\n * HTTP Response.\n */\n\nimport Headers from './headers';\nimport Promise from '../promise';\nimport {when, isBlob, isString} from '../util';\n\nexport default class Response {\n\n    constructor(body, {url, headers, status, statusText}) {\n\n        this.url = url;\n        this.ok = status >= 200 && status < 300;\n        this.status = status || 0;\n        this.statusText = statusText || '';\n        this.headers = new Headers(headers);\n        this.body = body;\n\n        if (isString(body)) {\n\n            this.bodyText = body;\n\n        } else if (isBlob(body)) {\n\n            this.bodyBlob = body;\n\n            if (isBlobText(body)) {\n                this.bodyText = blobText(body);\n            }\n        }\n    }\n\n    blob() {\n        return when(this.bodyBlob);\n    }\n\n    text() {\n        return when(this.bodyText);\n    }\n\n    json() {\n        return when(this.text(), text => JSON.parse(text));\n    }\n\n}\n\nObject.defineProperty(Response.prototype, 'data', {\n\n    get() {\n        return this.body;\n    },\n\n    set(body) {\n        this.body = body;\n    }\n\n});\n\nfunction blobText(body) {\n    return new Promise((resolve) => {\n\n        var reader = new FileReader();\n\n        reader.readAsText(body);\n        reader.onload = () => {\n            resolve(reader.result);\n        };\n\n    });\n}\n\nfunction isBlobText(body) {\n    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;\n}\n"
  },
  {
    "path": "src/index.js",
    "content": "/**\n * Install plugin.\n */\n\nimport Url from './url/index';\nimport Http from './http/index';\nimport Promise from './promise';\nimport Resource from './resource';\nimport Util, {options} from './util';\n\nfunction plugin(Vue) {\n\n    if (plugin.installed) {\n        return;\n    }\n\n    Util(Vue);\n\n    Vue.url = Url;\n    Vue.http = Http;\n    Vue.resource = Resource;\n    Vue.Promise = Promise;\n\n    Object.defineProperties(Vue.prototype, {\n\n        $url: {\n            get() {\n                return options(Vue.url, this, this.$options.url);\n            }\n        },\n\n        $http: {\n            get() {\n                return options(Vue.http, this, this.$options.http);\n            }\n        },\n\n        $resource: {\n            get() {\n                return Vue.resource.bind(this);\n            }\n        },\n\n        $promise: {\n            get() {\n                return (executor) => new Vue.Promise(executor, this);\n            }\n        }\n\n    });\n}\n\nif (typeof window !== 'undefined' && window.Vue && !window.Vue.resource) {\n    window.Vue.use(plugin);\n}\n\nexport default plugin;\n"
  },
  {
    "path": "src/lib/promise.js",
    "content": "/**\n * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)\n */\n\nconst RESOLVED = 0;\nconst REJECTED = 1;\nconst PENDING = 2;\n\nimport {nextTick} from '../util';\n\nexport default function Promise(executor) {\n\n    this.state = PENDING;\n    this.value = undefined;\n    this.deferred = [];\n\n    var promise = this;\n\n    try {\n        executor(function (x) {\n            promise.resolve(x);\n        }, function (r) {\n            promise.reject(r);\n        });\n    } catch (e) {\n        promise.reject(e);\n    }\n}\n\nPromise.reject = function (r) {\n    return new Promise(function (resolve, reject) {\n        reject(r);\n    });\n};\n\nPromise.resolve = function (x) {\n    return new Promise(function (resolve, reject) {\n        resolve(x);\n    });\n};\n\nPromise.all = function all(iterable) {\n    return new Promise(function (resolve, reject) {\n        var count = 0, result = [];\n\n        if (iterable.length === 0) {\n            resolve(result);\n        }\n\n        function resolver(i) {\n            return function (x) {\n                result[i] = x;\n                count += 1;\n\n                if (count === iterable.length) {\n                    resolve(result);\n                }\n            };\n        }\n\n        for (var i = 0; i < iterable.length; i += 1) {\n            Promise.resolve(iterable[i]).then(resolver(i), reject);\n        }\n    });\n};\n\nPromise.race = function race(iterable) {\n    return new Promise(function (resolve, reject) {\n        for (var i = 0; i < iterable.length; i += 1) {\n            Promise.resolve(iterable[i]).then(resolve, reject);\n        }\n    });\n};\n\nvar p = Promise.prototype;\n\np.resolve = function resolve(x) {\n    var promise = this;\n\n    if (promise.state === PENDING) {\n        if (x === promise) {\n            throw new TypeError('Promise settled with itself.');\n        }\n\n        var called = false;\n\n        try {\n            var then = x && x['then'];\n\n            if (x !== null && typeof x === 'object' && typeof then === 'function') {\n                then.call(x, function (x) {\n                    if (!called) {\n                        promise.resolve(x);\n                    }\n                    called = true;\n\n                }, function (r) {\n                    if (!called) {\n                        promise.reject(r);\n                    }\n                    called = true;\n                });\n                return;\n            }\n        } catch (e) {\n            if (!called) {\n                promise.reject(e);\n            }\n            return;\n        }\n\n        promise.state = RESOLVED;\n        promise.value = x;\n        promise.notify();\n    }\n};\n\np.reject = function reject(reason) {\n    var promise = this;\n\n    if (promise.state === PENDING) {\n        if (reason === promise) {\n            throw new TypeError('Promise settled with itself.');\n        }\n\n        promise.state = REJECTED;\n        promise.value = reason;\n        promise.notify();\n    }\n};\n\np.notify = function notify() {\n    var promise = this;\n\n    nextTick(function () {\n        if (promise.state !== PENDING) {\n            while (promise.deferred.length) {\n                var deferred = promise.deferred.shift(),\n                    onResolved = deferred[0],\n                    onRejected = deferred[1],\n                    resolve = deferred[2],\n                    reject = deferred[3];\n\n                try {\n                    if (promise.state === RESOLVED) {\n                        if (typeof onResolved === 'function') {\n                            resolve(onResolved.call(undefined, promise.value));\n                        } else {\n                            resolve(promise.value);\n                        }\n                    } else if (promise.state === REJECTED) {\n                        if (typeof onRejected === 'function') {\n                            resolve(onRejected.call(undefined, promise.value));\n                        } else {\n                            reject(promise.value);\n                        }\n                    }\n                } catch (e) {\n                    reject(e);\n                }\n            }\n        }\n    });\n};\n\np.then = function then(onResolved, onRejected) {\n    var promise = this;\n\n    return new Promise(function (resolve, reject) {\n        promise.deferred.push([onResolved, onRejected, resolve, reject]);\n        promise.notify();\n    });\n};\n\np.catch = function (onRejected) {\n    return this.then(undefined, onRejected);\n};\n"
  },
  {
    "path": "src/lib/url-template.js",
    "content": "/**\n * URL Template v2.0.6 (https://github.com/bramstein/url-template)\n */\n\nexport function expand(url, params, variables) {\n\n    var tmpl = parse(url), expanded = tmpl.expand(params);\n\n    if (variables) {\n        variables.push.apply(variables, tmpl.vars);\n    }\n\n    return expanded;\n}\n\nexport function parse(template) {\n\n    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];\n\n    return {\n        vars: variables,\n        expand(context) {\n            return template.replace(/\\{([^{}]+)\\}|([^{}]+)/g, (_, expression, literal) => {\n                if (expression) {\n\n                    var operator = null, values = [];\n\n                    if (operators.indexOf(expression.charAt(0)) !== -1) {\n                        operator = expression.charAt(0);\n                        expression = expression.substr(1);\n                    }\n\n                    expression.split(/,/g).forEach((variable) => {\n                        var tmp = /([^:*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n                        variables.push(tmp[1]);\n                    });\n\n                    if (operator && operator !== '+') {\n\n                        var separator = ',';\n\n                        if (operator === '?') {\n                            separator = '&';\n                        } else if (operator !== '#') {\n                            separator = operator;\n                        }\n\n                        return (values.length !== 0 ? operator : '') + values.join(separator);\n                    } else {\n                        return values.join(',');\n                    }\n\n                } else {\n                    return encodeReserved(literal);\n                }\n            });\n        }\n    };\n}\n\nfunction getValues(context, operator, key, modifier) {\n\n    var value = context[key], result = [];\n\n    if (isDefined(value) && value !== '') {\n        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n            value = value.toString();\n\n            if (modifier && modifier !== '*') {\n                value = value.substring(0, parseInt(modifier, 10));\n            }\n\n            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n        } else {\n            if (modifier === '*') {\n                if (Array.isArray(value)) {\n                    value.filter(isDefined).forEach((value) => {\n                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));\n                    });\n                } else {\n                    Object.keys(value).forEach((k) => {\n                        if (isDefined(value[k])) {\n                            result.push(encodeValue(operator, value[k], k));\n                        }\n                    });\n                }\n            } else {\n                var tmp = [];\n\n                if (Array.isArray(value)) {\n                    value.filter(isDefined).forEach((value) => {\n                        tmp.push(encodeValue(operator, value));\n                    });\n                } else {\n                    Object.keys(value).forEach((k) => {\n                        if (isDefined(value[k])) {\n                            tmp.push(encodeURIComponent(k));\n                            tmp.push(encodeValue(operator, value[k].toString()));\n                        }\n                    });\n                }\n\n                if (isKeyOperator(operator)) {\n                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));\n                } else if (tmp.length !== 0) {\n                    result.push(tmp.join(','));\n                }\n            }\n        }\n    } else {\n        if (operator === ';') {\n            result.push(encodeURIComponent(key));\n        } else if (value === '' && (operator === '&' || operator === '?')) {\n            result.push(encodeURIComponent(key) + '=');\n        } else if (value === '') {\n            result.push('');\n        }\n    }\n\n    return result;\n}\n\nfunction isDefined(value) {\n    return value !== undefined && value !== null;\n}\n\nfunction isKeyOperator(operator) {\n    return operator === ';' || operator === '&' || operator === '?';\n}\n\nfunction encodeValue(operator, value, key) {\n\n    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);\n\n    if (key) {\n        return encodeURIComponent(key) + '=' + value;\n    } else {\n        return value;\n    }\n}\n\nfunction encodeReserved(str) {\n    return str.split(/(%[0-9A-Fa-f]{2})/g).map((part) => {\n        if (!/%[0-9A-Fa-f]/.test(part)) {\n            part = encodeURI(part);\n        }\n        return part;\n    }).join('');\n}\n"
  },
  {
    "path": "src/promise.js",
    "content": "/**\n * Promise adapter.\n */\n\nimport PromiseLib from './lib/promise';\n\nif (typeof Promise === 'undefined') {\n    window.Promise = PromiseLib;\n}\n\nexport default function PromiseObj(executor, context) {\n\n    if (executor instanceof Promise) {\n        this.promise = executor;\n    } else {\n        this.promise = new Promise(executor.bind(context));\n    }\n\n    this.context = context;\n}\n\nPromiseObj.all = function (iterable, context) {\n    return new PromiseObj(Promise.all(iterable), context);\n};\n\nPromiseObj.resolve = function (value, context) {\n    return new PromiseObj(Promise.resolve(value), context);\n};\n\nPromiseObj.reject = function (reason, context) {\n    return new PromiseObj(Promise.reject(reason), context);\n};\n\nPromiseObj.race = function (iterable, context) {\n    return new PromiseObj(Promise.race(iterable), context);\n};\n\nvar p = PromiseObj.prototype;\n\np.bind = function (context) {\n    this.context = context;\n    return this;\n};\n\np.then = function (fulfilled, rejected) {\n\n    if (fulfilled && fulfilled.bind && this.context) {\n        fulfilled = fulfilled.bind(this.context);\n    }\n\n    if (rejected && rejected.bind && this.context) {\n        rejected = rejected.bind(this.context);\n    }\n\n    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);\n};\n\np.catch = function (rejected) {\n\n    if (rejected && rejected.bind && this.context) {\n        rejected = rejected.bind(this.context);\n    }\n\n    return new PromiseObj(this.promise.catch(rejected), this.context);\n};\n\np.finally = function (callback) {\n\n    return this.then(function (value) {\n        callback.call(this);\n        return value;\n    }, function (reason) {\n        callback.call(this);\n        return Promise.reject(reason);\n    }\n    );\n};\n"
  },
  {
    "path": "src/resource.js",
    "content": "/**\n * Service for interacting with RESTful services.\n */\n\nimport Http from './http/index';\nimport {assign, each, merge} from './util';\n\nexport default function Resource(url, params, actions, options) {\n\n    var self = this || {}, resource = {};\n\n    actions = assign({},\n        Resource.actions,\n        actions\n    );\n\n    each(actions, (action, name) => {\n\n        action = merge({url, params: assign({}, params)}, options, action);\n\n        resource[name] = function () {\n            return (self.$http || Http)(opts(action, arguments));\n        };\n    });\n\n    return resource;\n}\n\nfunction opts(action, args) {\n\n    var options = assign({}, action), params = {}, body;\n\n    switch (args.length) {\n\n        case 2:\n\n            params = args[0];\n            body = args[1];\n\n            break;\n\n        case 1:\n\n            if (/^(POST|PUT|PATCH)$/i.test(options.method)) {\n                body = args[0];\n            } else {\n                params = args[0];\n            }\n\n            break;\n\n        case 0:\n\n            break;\n\n        default:\n\n            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';\n    }\n\n    options.body = body;\n    options.params = assign({}, options.params, params);\n\n    return options;\n}\n\nResource.actions = {\n\n    get: {method: 'GET'},\n    save: {method: 'POST'},\n    query: {method: 'GET'},\n    update: {method: 'PUT'},\n    remove: {method: 'DELETE'},\n    delete: {method: 'DELETE'}\n\n};\n"
  },
  {
    "path": "src/url/index.js",
    "content": "/**\n * Service for URL templating.\n */\n\nimport root from './root';\nimport query from './query';\nimport template from './template';\nimport {each, merge, isArray, isFunction, isObject, isPlainObject, isString} from '../util';\n\nexport default function Url(url, params) {\n\n    var self = this || {}, options = url, transform;\n\n    if (isString(url)) {\n        options = {url, params};\n    }\n\n    options = merge({}, Url.options, self.$options, options);\n\n    Url.transforms.forEach(handler => {\n\n        if (isString(handler)) {\n            handler = Url.transform[handler];\n        }\n\n        if (isFunction(handler)) {\n            transform = factory(handler, transform, self.$vm);\n        }\n\n    });\n\n    return transform(options);\n}\n\n/**\n * Url options.\n */\n\nUrl.options = {\n    url: '',\n    root: null,\n    params: {}\n};\n\n/**\n * Url transforms.\n */\n\nUrl.transform = {template, query, root};\nUrl.transforms = ['template', 'query', 'root'];\n\n/**\n * Encodes a Url parameter string.\n *\n * @param {Object} obj\n */\n\nUrl.params = function (obj) {\n\n    var params = [], escape = encodeURIComponent;\n\n    params.add = function (key, value) {\n\n        if (isFunction(value)) {\n            value = value();\n        }\n\n        if (value === null) {\n            value = '';\n        }\n\n        this.push(escape(key) + '=' + escape(value));\n    };\n\n    serialize(params, obj);\n\n    return params.join('&').replace(/%20/g, '+');\n};\n\n/**\n * Parse a URL and return its components.\n *\n * @param {String} url\n */\n\nUrl.parse = function (url) {\n\n    var el = document.createElement('a');\n\n    if (document.documentMode) {\n        el.href = url;\n        url = el.href;\n    }\n\n    el.href = url;\n\n    return {\n        href: el.href,\n        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',\n        port: el.port,\n        host: el.host,\n        hostname: el.hostname,\n        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,\n        search: el.search ? el.search.replace(/^\\?/, '') : '',\n        hash: el.hash ? el.hash.replace(/^#/, '') : ''\n    };\n};\n\nfunction factory(handler, next, vm) {\n    return options => {\n        return handler.call(vm, options, next);\n    };\n}\n\nfunction serialize(params, obj, scope) {\n\n    var array = isArray(obj), plain = isPlainObject(obj), hash;\n\n    each(obj, (value, key) => {\n\n        hash = isObject(value) || isArray(value);\n\n        if (scope) {\n            key = scope + '[' + (plain || hash ? key : '') + ']';\n        }\n\n        if (!scope && array) {\n            params.add(value.name, value.value);\n        } else if (hash) {\n            serialize(params, value, key);\n        } else {\n            params.add(key, value);\n        }\n    });\n}\n"
  },
  {
    "path": "src/url/query.js",
    "content": "/**\n * Query Parameter Transform.\n */\n\nimport Url from './index';\nimport {each} from '../util';\n\nexport default function (options, next) {\n\n    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options);\n\n    each(options.params, (value, key) => {\n        if (urlParams.indexOf(key) === -1) {\n            query[key] = value;\n        }\n    });\n\n    query = Url.params(query);\n\n    if (query) {\n        url += (url.indexOf('?') == -1 ? '?' : '&') + query;\n    }\n\n    return url;\n}\n"
  },
  {
    "path": "src/url/root.js",
    "content": "/**\n * Root Prefix Transform.\n */\n\nimport {isString, trimEnd} from '../util';\n\nexport default function (options, next) {\n\n    var url = next(options);\n\n    if (isString(options.root) && !/^(https?:)?\\//.test(url)) {\n        url = trimEnd(options.root, '/') + '/' + url;\n    }\n\n    return url;\n}\n"
  },
  {
    "path": "src/url/template.js",
    "content": "/**\n * URL Template (RFC 6570) Transform.\n */\n\nimport {expand} from '../lib/url-template';\n\nexport default function (options) {\n\n    var variables = [], url = expand(options.url, options.params, variables);\n\n    variables.forEach((key) => {\n        delete options.params[key];\n    });\n\n    return url;\n}\n"
  },
  {
    "path": "src/util.js",
    "content": "/**\n * Utility functions.\n */\n\nimport Promise from './promise';\n\nvar {hasOwnProperty} = {}, {slice} = [], debug = false, ntick;\n\nexport const inBrowser = typeof window !== 'undefined';\n\nexport default function ({config, nextTick}) {\n    ntick = nextTick;\n    debug = config.debug || !config.silent;\n}\n\nexport function warn(msg) {\n    if (typeof console !== 'undefined' && debug) {\n        console.warn('[VueResource warn]: ' + msg);\n    }\n}\n\nexport function error(msg) {\n    if (typeof console !== 'undefined') {\n        console.error(msg);\n    }\n}\n\nexport function nextTick(cb, ctx) {\n    return ntick(cb, ctx);\n}\n\nexport function trim(str) {\n    return str ? str.replace(/^\\s*|\\s*$/g, '') : '';\n}\n\nexport function trimEnd(str, chars) {\n\n    if (str && chars === undefined) {\n        return str.replace(/\\s+$/, '');\n    }\n\n    if (!str || !chars) {\n        return str;\n    }\n\n    return str.replace(new RegExp(`[${chars}]+$`), '');\n}\n\nexport function toLower(str) {\n    return str ? str.toLowerCase() : '';\n}\n\nexport function toUpper(str) {\n    return str ? str.toUpperCase() : '';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val) {\n    return typeof val === 'string';\n}\n\nexport function isBoolean(val) {\n    return val === true || val === false;\n}\n\nexport function isFunction(val) {\n    return typeof val === 'function';\n}\n\nexport function isObject(obj) {\n    return obj !== null && typeof obj === 'object';\n}\n\nexport function isPlainObject(obj) {\n    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;\n}\n\nexport function isBlob(obj) {\n    return typeof Blob !== 'undefined' && obj instanceof Blob;\n}\n\nexport function isFormData(obj) {\n    return typeof FormData !== 'undefined' && obj instanceof FormData;\n}\n\nexport function when(value, fulfilled, rejected) {\n\n    var promise = Promise.resolve(value);\n\n    if (arguments.length < 2) {\n        return promise;\n    }\n\n    return promise.then(fulfilled, rejected);\n}\n\nexport function options(fn, obj, opts) {\n\n    opts = opts || {};\n\n    if (isFunction(opts)) {\n        opts = opts.call(obj);\n    }\n\n    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});\n}\n\nexport function each(obj, iterator) {\n\n    var i, key;\n\n    if (isArray(obj)) {\n        for (i = 0; i < obj.length; i++) {\n            iterator.call(obj[i], obj[i], i);\n        }\n    } else if (isObject(obj)) {\n        for (key in obj) {\n            if (hasOwnProperty.call(obj, key)) {\n                iterator.call(obj[key], obj[key], key);\n            }\n        }\n    }\n\n    return obj;\n}\n\nexport const assign = Object.assign || _assign;\n\nexport function merge(target) {\n\n    var args = slice.call(arguments, 1);\n\n    args.forEach(source => {\n        _merge(target, source, true);\n    });\n\n    return target;\n}\n\nexport function defaults(target) {\n\n    var args = slice.call(arguments, 1);\n\n    args.forEach(source => {\n\n        for (var key in source) {\n            if (target[key] === undefined) {\n                target[key] = source[key];\n            }\n        }\n\n    });\n\n    return target;\n}\n\nfunction _assign(target) {\n\n    var args = slice.call(arguments, 1);\n\n    args.forEach(source => {\n        _merge(target, source);\n    });\n\n    return target;\n}\n\nfunction _merge(target, source, deep) {\n    for (var key in source) {\n        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {\n                target[key] = {};\n            }\n            if (isArray(source[key]) && !isArray(target[key])) {\n                target[key] = [];\n            }\n            _merge(target[key], source[key], deep);\n        } else if (source[key] !== undefined) {\n            target[key] = source[key];\n        }\n    }\n}\n"
  },
  {
    "path": "test/data/invalid.json",
    "content": "invalid"
  },
  {
    "path": "test/data/text.txt",
    "content": "text"
  },
  {
    "path": "test/data/valid.json",
    "content": "{\"foo\": \"bar\"}"
  },
  {
    "path": "test/http.js",
    "content": "import Vue from 'vue';\n\ndescribe('Vue.http', function () {\n\n    it('get(\"data/text.txt\")', done => {\n\n        Vue.http.get('data/text.txt').then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(res.body).toBe('text');\n            expect(res.data).toBe(res.body);\n            expect(res.headers.get('Content-Type')).toBe('text/plain');\n\n            done();\n        });\n\n    });\n\n    it('get(\"data/valid.json\")', done => {\n\n        Vue.http.get('data/valid.json').then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(typeof res.body).toBe('object');\n            expect(res.body.foo).toBe('bar');\n\n            done();\n        });\n\n    });\n\n    it('get(\"data/invalid.json\")', done => {\n\n        Vue.http.get('data/invalid.json').then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(res.body).toBeNull();\n\n            done();\n        });\n\n    });\n\n    it('get(\"github.com/avatar\")', done => {\n\n        Vue.http.get('https://avatars1.githubusercontent.com/u/6128107', {responseType: 'blob'}).then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(res.body instanceof Blob).toBe(true);\n            expect(res.body.type).toBe('image/png');\n\n            done();\n        });\n\n    });\n\n    it('get(\"cors-api.appspot.com\")', done => {\n\n        Vue.http.get('http://server.cors-api.appspot.com/server?id=1&enable=true').then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(typeof res.body).toBe('object');\n            expect(res.body.shift().requestType).toBe('cors');\n\n            if (res.headers.get('Content-Type')) {\n                expect(res.headers.get('Content-Type')).toBe('application/json');\n            }\n\n            done();\n        });\n\n    });\n\n    it('jsonp(\"jsfiddle.net/jsonp\")', done => {\n\n        Vue.http.jsonp('http://jsfiddle.net/echo/jsonp/', {params: {foo: 'bar'}}).then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(typeof res.body).toBe('object');\n            expect(res.body.foo).toBe('bar');\n\n            done();\n        });\n\n    });\n\n});\n\ndescribe('this.$http', function () {\n\n    it('get(\"data/valid.json\")', done => {\n\n        var vm = new Vue({\n\n            created() {\n\n                this.$http.get('data/valid.json').then(res => {\n\n                    expect(this).toBe(vm);\n                    expect(res.ok).toBe(true);\n                    expect(res.status).toBe(200);\n                    expect(typeof res.body).toBe('object');\n                    expect(res.body.foo).toBe('bar');\n\n                    done();\n\n                });\n\n            }\n\n        });\n\n    });\n\n    it('get(\"data/valid.json\") with timeout', done => {\n\n        var vm = new Vue({\n\n            created() {\n\n                var random = Math.random().toString(36).substr(2);\n\n                this.$http.get(`data/valid.json?${random}`, {timeout: 1}).then(res => {\n\n                    fail('Callback has been called');\n\n                }, res => {\n\n                    expect(res.ok).toBe(false);\n                    expect(res.status).toBe(0);\n\n                    done();\n\n                });\n\n            }\n\n        });\n\n    });\n\n    it('get(\"data/valid.json\") with abort()', done => {\n\n        var vm = new Vue({\n\n            created() {\n\n                var random = Math.random().toString(36).substr(2);\n\n                this.$http.get(`data/valid.json?${random}`, {\n\n                    before(req) {\n                        setTimeout(() => {\n\n                            expect(typeof req.abort).toBe('function');\n\n                            req.abort();\n\n                        }, 0);\n                    }\n\n                }).then(res => {\n                    fail('Callback has been called');\n                }, res => {\n                    done();\n                });\n            }\n\n        });\n\n    });\n\n    it('get(\"data/notfound.json\") using catch()', done => {\n\n        var vm = new Vue({\n\n            created() {\n\n                this.$http.get('data/notfound.json').catch(res => {\n\n                    expect(this).toBe(vm);\n                    expect(res.ok).toBe(false);\n                    expect(res.status).toBe(404);\n\n                    done();\n                });\n\n            }\n\n        });\n\n    });\n\n});"
  },
  {
    "path": "test/http.test.js",
    "content": "var Vue = require('vue');\nvar VueResource = require('../dist/vue-resource.common.js');\n\nVue.use(VueResource);\n\ndescribe('Vue.http', function () {\n\n    it('post(\"jsfiddle.net/html\")', () => {\n\n        return Vue.http.post('http://jsfiddle.net/echo/html/', {html: 'text'}, {emulateJSON: true}).then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(typeof res.body).toBe('string');\n            expect(res.body).toBe('text');\n\n        });\n\n    });\n\n    it('post(\"jsfiddle.net/json\")', () => {\n\n        return Vue.http.post('http://jsfiddle.net/echo/json/', {json: JSON.stringify({foo: 'bar'})}, {emulateJSON: true}).then(res => {\n\n            expect(res.ok).toBe(true);\n            expect(res.status).toBe(200);\n            expect(typeof res.body).toBe('object');\n            expect(res.body.foo).toBe('bar');\n\n        });\n\n    });\n\n});\n"
  },
  {
    "path": "test/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Vue Resource - Jasmine</title>\n\n  <link rel=\"shortcut icon\" type=\"image/png\" href=\"../node_modules/jasmine-core/images/jasmine_favicon.png\">\n  <link rel=\"stylesheet\" href=\"../node_modules/jasmine-core/lib/jasmine-core/jasmine.css\">\n\n  <script src=\"../node_modules/jasmine-core/lib/jasmine-core/jasmine.js\"></script>\n  <script src=\"../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js\"></script>\n  <script src=\"../node_modules/jasmine-core/lib/jasmine-core/boot.js\"></script>\n  <script src=\"specs.js\"></script>\n\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "test/index.js",
    "content": "import Vue from 'vue';\nimport VueResource from '../src/index';\n\nVue.use(VueResource);\n\nrequire('./url');\nrequire('./http');\nrequire('./resource');\nrequire('./promise');\n"
  },
  {
    "path": "test/karma.conf.js",
    "content": "module.exports = config => {\n\n  config.set({\n\n    basePath: __dirname,\n\n    frameworks: ['jasmine'],\n\n    browsers: ['Chrome', 'Safari', 'Firefox'],\n\n    files: [\n      'index.js', {\n        pattern: 'data/*',\n        included: false\n      },\n    ],\n\n    preprocessors: {\n      'index.js': ['webpack']\n    },\n\n    proxies: {\n      '/data/': '/base/data/'\n    },\n\n    webpack: {\n      mode: 'development'\n    },\n\n  });\n\n};\n"
  },
  {
    "path": "test/promise.js",
    "content": "import Promise from '../src/promise';\n\ndescribe('Vue.promise ' + (window.Promise !== undefined ? '(native)' : '(polyfill)'), function () {\n\n    it('then fulfill', function (done) {\n\n        Promise.resolve(1).then(function (value) {\n            expect(value).toBe(1);\n            done();\n        });\n\n    });\n\n    it('then reject', function (done) {\n\n        Promise.reject(1).then(undefined, function (value) {\n            expect(value).toBe(1);\n            done();\n        });\n\n    });\n\n    it('catch', function (done) {\n\n        Promise.reject(1).catch(function (value) {\n            expect(value).toBe(1);\n            done();\n        });\n\n    });\n\n    it('finally fulfill', function (done) {\n\n        Promise.resolve(1).finally(function (arg) {\n            expect(arg).toBe(undefined);\n        }).then(function (arg) {\n            expect(arg).toBe(1);\n            done();\n        });\n\n    });\n\n    it('finally reject', function (done) {\n\n        Promise.reject(1).finally(function (arg) {\n            expect(arg).toBe(undefined);\n        }).catch(function (arg) {\n            expect(arg).toBe(1);\n            done();\n        });\n\n    });\n\n    it('all', function (done) {\n\n        Promise.all([\n\n            Promise.resolve(1),\n            Promise.resolve(2)\n\n        ]).then(function (values) {\n            expect(values[0]).toBe(1);\n            expect(values[1]).toBe(2);\n            done();\n        });\n\n    });\n\n    it('duplicate', function (done) {\n\n        Promise.all([\n\n            Promise.resolve(1).then(function (value) {\n                expect(value).toBe(1);\n            }),\n\n            Promise.resolve(2).then(function (value) {\n                expect(value).toBe(2);\n            })\n\n        ]).then(done);\n\n    });\n\n    it('context', function (done) {\n\n        var context = {foo: 'bar'};\n\n        Promise.resolve().bind(context).then(function () {\n            expect(this).toBe(context);\n            done();\n        });\n\n    });\n\n    it('context chain fulfill', function (done) {\n\n        var context = {foo: 'bar'};\n\n        Promise.resolve().bind(context).catch(undefined).finally(function () {\n            expect(this).toBe(context);\n        }).then(function () {\n            expect(this).toBe(context);\n            done();\n        });\n\n    });\n\n    it('context chain reject', function (done) {\n\n        var context = {foo: 'bar'};\n\n        Promise.reject().bind(context).catch(function () {\n            expect(this).toBe(context);\n            return Promise.reject();\n        }).finally(function () {\n            expect(this).toBe(context);\n        }).catch(function () {\n            expect(this).toBe(context);\n            done();\n        });\n\n    });\n\n});\n"
  },
  {
    "path": "test/resource.js",
    "content": "import Vue from 'vue';\n\ndescribe('this.$resource', function () {\n\n    it('get({file: \"valid.json\"})', (done) => {\n\n        var vm = new Vue({\n\n            created() {\n\n                var resource = this.$resource('data{/file}');\n\n                resource.get({file: 'valid.json'}).then((res) => {\n\n                    expect(res.ok).toBe(true);\n                    expect(res.status).toBe(200);\n                    expect(res.data.foo).toBe('bar');\n\n                    done();\n                });\n\n            }\n\n        });\n\n    });\n\n    it('save({file: \"valid.json\"}, {foo: \"bar\"})', (done) => {\n\n        var vm = new Vue({\n\n            created() {\n\n                var resource = this.$resource('data{/file}');\n\n                resource.save({file: 'valid.json'}, {foo: 'bar'}).then((res) => {\n\n                    expect(res.ok).toBe(true);\n                    expect(res.status).toBe(200);\n                    expect(res.data.foo).toBe('bar');\n\n                    done();\n                });\n\n            }\n\n        });\n\n    });\n\n});\n"
  },
  {
    "path": "test/url.js",
    "content": "import Vue from 'vue';\n\ndescribe('Vue.url', function () {\n\n    it('data{/id}', function () {\n\n        expect(Vue.url('data{/id}')).toBe('data');\n        expect(Vue.url('data{/id}', {id: 1})).toBe('data/1');\n\n    });\n\n    it('data{/array}', function () {\n\n        expect(Vue.url('data{?array}')).toBe('data');\n        expect(Vue.url('data{?array}', {array: [1,2,3]})).toBe('data?array=1,2,3');\n\n    });\n\n    it('{+path}data', function () {\n\n        expect(Vue.url('{+path}data')).toBe('data');\n        expect(Vue.url('{+path}data', {path: 'path1/path2/'})).toBe('path1/path2/data');\n\n    });\n\n    it('{+base}data', function () {\n\n        Vue.url.options.params.base = 'base/path/';\n        expect(Vue.url('{+base}data')).toBe('base/path/data');\n\n    });\n\n});\n"
  },
  {
    "path": "test/webpack.config.js",
    "content": "module.exports = {\n\n    mode: 'development',\n\n    entry: __dirname + '/index.js',\n\n    output: {\n        path: __dirname + '/',\n        filename: 'specs.js'\n    },\n\n    module: {\n        rules: [\n            {\n                test: /\\.js$/,\n                exclude: /node_modules/,\n                use: 'babel-loader'\n            }\n        ]\n    }\n\n};\n"
  },
  {
    "path": "types/index.d.ts",
    "content": "import * as VueResource from './vue_resource';\nexport default VueResource"
  },
  {
    "path": "types/vue.d.ts",
    "content": "/**\n * Extends interfaces in Vue.js\n */\n\nimport Vue from \"vue\";\nimport { HttpHeaders, HttpOptions, HttpResponse, $http, $resource } from \"./vue_resource\";\n\ndeclare module \"vue/types/options\" {\n    interface ComponentOptions<V extends Vue> {\n        http?: (HttpOptions & { headers?: HttpHeaders } & { [key: string]: any })\n    }\n}\n\ndeclare module \"vue/types/vue\" {\n    interface Vue {\n        $http: {\n            (options: HttpOptions): PromiseLike<HttpResponse>;\n            get: $http;\n            post: $http;\n            put: $http;\n            patch: $http;\n            delete: $http;\n            jsonp: $http;\n        };\n        $resource: $resource;\n    }\n}\n"
  },
  {
    "path": "types/vue_resource.ts",
    "content": "import _Vue from 'vue';\n\n// augment typings of Vue.js\nimport './vue';\n\nexport interface HttpHeaders {\n    put?: { [key: string]: string };\n    post?: { [key: string]: string };\n    patch?: { [key: string]: string };\n    delete?: { [key: string]: string };\n    common?: { [key: string]: string };\n    custom?: { [key: string]: string };\n    [key: string]: any;\n}\n\nexport interface HttpResponse {\n    data: any;\n    ok: boolean;\n    status: number;\n    statusText: string;\n    headers: Function;\n    text(): string;\n    json(): any;\n    blob(): Blob;\n}\n\nexport interface HttpOptions {\n    url?: string;\n    method?: string;\n    body?: any;\n    params?: any;\n    headers?: any;\n    before?(request: any): any;\n    progress?(event: any): any;\n    credentials?: boolean;\n    emulateHTTP?: boolean;\n    emulateJSON?: boolean;\n}\n\nexport interface $http {\n    (url: string, data?: any, options?: HttpOptions): PromiseLike<HttpResponse>;\n    (url: string, options?: HttpOptions): PromiseLike<HttpResponse>;\n}\n\nexport interface HttpInterceptor {\n    request?(request: HttpOptions): HttpOptions;\n    response?(response: HttpResponse): HttpResponse;\n}\n\nexport interface Http {\n    options: HttpOptions & { root: string };\n    headers: HttpHeaders;\n    interceptors: (HttpInterceptor | (() => HttpInterceptor))[];\n    get: $http;\n    post: $http;\n    put: $http;\n    patch: $http;\n    delete: $http;\n    jsonp: $http;\n}\n\nexport interface ResourceActions {\n    get: { method: string };\n    save: { method: string };\n    query: { method: string };\n    update: { method: string };\n    remove: { method: string };\n    delete: { method: string };\n}\n\nexport interface ResourceMethod {\n    (params: any, data?: any, success?: Function, error?: Function): PromiseLike<HttpResponse>;\n    (params: any, success?: Function, error?: Function): PromiseLike<HttpResponse>;\n    (success?: Function, error?: Function): PromiseLike<HttpResponse>;\n}\n\nexport interface ResourceMethods {\n    get: ResourceMethod;\n    save: ResourceMethod;\n    query: ResourceMethod;\n    update: ResourceMethod;\n    remove: ResourceMethod;\n    delete: ResourceMethod;\n}\n\nexport interface $resource {\n    (url: string, params?: any, actions?: any, options?: HttpOptions): ResourceMethods;\n}\n\nexport interface Resource extends $resource {\n    actions: ResourceActions;\n}\n\nexport declare function install(vue: typeof _Vue): void;\n"
  }
]