From 83b7d5652d72b01299a5411ffce735ea99e2fb0b Mon Sep 17 00:00:00 2001 From: Mora Date: Tue, 10 May 2016 11:09:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B8=85=E9=99=A4=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E4=BA=86=E7=9A=84=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/elegant-api.js | 21 ++++++++++++++++----- dist/elegant-api.js.map | 2 +- dist/elegant-api.min.js | 2 +- src/ElegantApi.jsx | 11 ++++++++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/dist/elegant-api.js b/dist/elegant-api.js index 12c4e02..9b555ad 100644 --- a/dist/elegant-api.js +++ b/dist/elegant-api.js @@ -597,7 +597,9 @@ return /******/ (function(modules) { // webpackBootstrap }; ElegantApi.prototype._getCache = function _getCache(route) { - var cacheMap = this.globals.cacheMap; + var _globals2 = this.globals; + var cacheMap = _globals2.cacheMap; + var cacheStack = _globals2.cacheStack; var name = route.name; var http = route.http;var key = undefined; @@ -613,6 +615,15 @@ return /******/ (function(modules) { // webpackBootstrap var expire = data.expire; if (expire !== 0 && expire < +new Date()) { exists = false; + + // 删除缓存中的数据 + delete cacheMap[key]; + for (var i = 0; i < cacheStack.length; i++) { + if (cacheStack[i][0] === name && cacheStack[i][1] === key) { + cacheStack.splice(i, 1); + break; + } + } } else { value = data.value; } @@ -624,10 +635,10 @@ return /******/ (function(modules) { // webpackBootstrap }; ElegantApi.prototype._setCache = function _setCache(route, value) { - var _globals2 = this.globals; - var cacheSize = _globals2.cacheSize; - var cacheMap = _globals2.cacheMap; - var cacheStack = _globals2.cacheStack; + var _globals3 = this.globals; + var cacheSize = _globals3.cacheSize; + var cacheMap = _globals3.cacheMap; + var cacheStack = _globals3.cacheStack; var name = route.name; var http = route.http; diff --git a/dist/elegant-api.js.map b/dist/elegant-api.js.map index f1245e7..a3327cd 100644 --- a/dist/elegant-api.js.map +++ b/dist/elegant-api.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 19acc90c85f3a6b4c382","webpack:///./src/index.jsx","webpack:///./src/libs/util.jsx","webpack:///./src/ElegantApi.jsx","webpack:///./~/naming-transform/build/index.js","webpack:///./src/libs/defaultOptions.jsx","webpack:///./src/libs/mockHelper.jsx","webpack:///./src/libs/Formater.jsx","webpack:///./plugins/mock.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sEAAqE,aAAa;AAClF;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAc;AACd,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wC;;;;;;AClDA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,eAAe;AAC3B,aAAY,SAAS;AACrB;AACA;AACA;AACA,oBAAmB,gBAAgB;AACnC;AACA;AACA,IAAG;AACH;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,SAAS;AACrB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA,aAAY,mCAAmC;AAC/C,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,aAAa;AACzB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA,+BAA8B;AAC9B;;AAEA,kBAAiB,iBAAiB;AAClC;;AAEA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA,iDAAgD,IAAI;AACpD,E;;;;;;ACnOA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,uCAAuC,kBAAkB;;AAE/F,kDAAiD,0CAA0C,0DAA0D,EAAE;;AAEvJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;AACA,uFAAsF,aAAa;AACnG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2CAA0C;;AAE1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA,MAAK,IAAI;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA,wDAAuD,gCAAgC;AACvF,mBAAkB;AAClB,MAAK,IAAI;AACT;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+CAA8C;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB,eAAc,SAAS;AACvB,eAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,aAAa;AAC3B;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA,2BAA0B;;AAE1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA,yEAAwE,4CAA4C;;AAEpH,aAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAkC;AAClC;;AAEA,4DAA2D,+BAA+B;;AAE1F;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB,eAAc,SAAS;AACvB,eAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,yCAAwC,0BAA0B;AAClE;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,wCAAuC;AACvC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0FAAyF,mCAAmC;;AAE5H;;AAEA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uBAAsB,uCAAuC;AAC7D,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL,qBAAoB,aAAa;AACjC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,qCAAoC;AACpC,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yDAAwD;;AAExD;AACA;AACA;AACA;;AAEA;AACA,sGAAqG,mGAAmG;;AAExM;AACA;;AAEA;AACA;AACA;AACA,gCAA+B;AAC/B;AACA,UAAS;AACT,QAAO;AACP,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,yDAAwD;AACxD,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;;AAEA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;AACL;AACA,IAAG;;AAEH;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL,IAAG;AACH,E;;;;;;AC7nBA;;AAEA;;AAEA;AACA,sEAAqE;;AAErE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA,aAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,oBAAmB,iBAAiB;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;;;;;;ACvHA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,sBAAsB;AAClC,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C;AAC3C;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,gBAAe;AACf;AACA,G;;;;;;AC7FA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,wDAAuD;AACvD;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO,IAAI;AACX,MAAK;AACL;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH,E;;;;;;ACxDA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB,mGAAmG;;AAE1H;;AAEA;AACA,cAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA,cAAa,MAAM;AACnB;AACA,KAAI,6BAA6B;AACjC;AACA;;AAEA;AACA,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa,MAAM;AACnB;AACA,6DAA4D;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kBAAiB;AACjB;;AAEA,+DAA8D;;AAE9D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA,aAAY,cAAc;AAC1B,aAAY;AACZ;AACA;AACA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,YAAY;AACxB,aAAY,OAAO;AACnB,cAAa;AACb;AACA;AACA;AACA,kCAAiC;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB,iBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA,kEAAiE,qGAAqG;AACtK,IAAG;AACH,kCAAiC,2CAA2C;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,6CAA6C;AACzD,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;;AAEA;AACA,mBAAkB;AAClB;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA,+BAA8B;AAC9B,mCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA,qCAAoC;;AAEpC,0EAAyE;AACzE,6EAA4E;AAC5E;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA,4CAA2C,6BAA6B;AACxE;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,gDAAgD;AAC/D;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA,oBAAmB;AACnB;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA,oBAAmB;AACnB,IAAG;;AAEH;AACA,E;;;;;;AC3fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,MAAK;AACL;AACA","file":"elegant-api.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"elegantApi\"] = factory();\n\telse\n\t\troot[\"elegantApi\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 19acc90c85f3a6b4c382\n **/","'use strict';\n\nvar util = require('./libs/util');\nvar ElegantApi = require('./ElegantApi');\n\nmodule.exports = function (httpOptions, mockOptions) {\n var ea = new ElegantApi(httpOptions, mockOptions);\n var result = {};\n\n util.objectKeys(ea.routes).forEach(function (key) {\n result[key] = function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return ea.request.apply(ea, [key].concat(args));\n };\n });\n\n result.$ea = ea;\n result.$request = function () {\n return ea.request.apply(ea, arguments);\n };\n result.$r = result.$resource = function (key) {\n var res = ea.resources[key];\n return res ? Object.keys(res).reduce(function (result, key) {\n var val = res[key].defaultValue;\n result[key] = val === undefined ? null : val;\n return result;\n }, {}) : {};\n };\n\n result.$cache = function (cache) {\n var ref = cache || ea.globals;\n var cacheMap = ref.cacheMap;\n var cacheStack = ref.cacheStack;\n\n if (!cache) {\n return { cacheMap: cacheMap, cacheStack: cacheStack };\n } else {\n if (cacheMap && cacheStack) {\n ea.globals.cacheMap = cacheMap;\n ea.globals.cacheStack = cacheStack;\n }\n }\n };\n\n return result;\n};\n\nmodule.exports.ElegantApi = ElegantApi;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/index.jsx\n ** module id = 0\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports.emptyFunction = emptyFunction;\nexports.objectKeys = objectKeys;\nexports.toString = toString;\nexports.isObject = isObject;\nexports.isArray = isArray;\nexports.objectify = objectify;\nexports.each = each;\nexports.mapObject = mapObject;\nexports.deepClone = deepClone;\nexports.omit = omit;\nexports.extend = extend;\nexports.buildQuery = buildQuery;\nexports.urlNormalize = urlNormalize;\nexports.appendQuery = appendQuery;\nvar isServer = exports.isServer = typeof window === 'undefined';\n\n/**\n * 只是一个空函数,什么也不做\n */\nfunction emptyFunction() {}\n\n/**\n * 获取对象中的 keys,兼容 IE 7/8\n *\n * @param {Object} obj\n * @return {Array}\n */\nfunction objectKeys(obj) {\n return obj ? Object.keys(obj) : [];\n}\n\n/**\n * 调用 Object 原型链上的 toString 方法来获取任意变量的原生的 string 形式\n * @param {*} o 任意变量\n * @return {String}\n */\nfunction toString(o) {\n return Object.prototype.toString.call(o);\n}\n\n/**\n * 判断某一变量是否是一个 Object\n * @param {*} o\n * @return {Boolean}\n */\nfunction isObject(o) {\n return toString(o) === '[object Object]';\n}\n\n/**\n * 判断某一变量是否是一个 Array\n * @param {*} o\n * @return {Boolean}\n */\nfunction isArray(o) {\n return Array.isArray(o);\n}\n\n/**\n * 确保变量是一个 Object,如果不是,则返回空 Object\n * @param {*} o\n * @return {Boolean}\n */\nfunction objectify(o) {\n return isObject(o) ? o : {};\n}\n\n/**\n * 遍历对象或数组,如果是其它数据类型,直接忽略\n * @param {Object|Array|*} obj\n * @param {Function} cb\n */\nfunction each(obj, cb) {\n if (isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n cb(obj[i], i, obj);\n }\n } else if (isObject(obj)) {\n objectKeys(obj).forEach(function (key) {\n return cb(obj[key], key, obj);\n });\n }\n}\n\n/**\n * 将一个对象转化成另一个对象,keys 不变\n * @param {Object} obj\n * @param {Function} fn - 遍历函数,参数是 (item, key, obj)\n * @return {Object}\n */\nfunction mapObject(obj, fn) {\n return objectKeys(obj).reduce(function (result, key) {\n result[key] = fn(obj[key], key, obj);\n return result;\n }, {});\n}\n\n/**\n * 深度克隆任意参数,主要针对于 Object|Array 和基本数据类型\n * @param {Object|Array|Number|String|Boolean} obj\n * @return {Object|Array|Number|String|Boolean}\n */\nfunction deepClone(obj) {\n var result = undefined;\n if (isObject(obj)) {\n result = {};\n } else if (Array.isArray(obj)) {\n result = [];\n } else {\n return obj;\n }\n\n each(obj, function (val, key) {\n return result[key] = deepClone(val);\n });\n return result;\n}\n\n/**\n * 从一个对象中忽略指定的 keys, 并将剩下的 keys 组成的一个新的 Object\n * @param {Object} obj\n * @param {Array|String} keys\n * @return {Object}\n */\nfunction omit(obj, keys) {\n keys = [].concat(keys);\n return Object.keys(obj).reduce(function (res, key) {\n if (keys.indexOf(key) < 0) res[key] = obj[key];\n return res;\n }, {});\n}\n\n/**\n * 对象继承\n * @param {Boolean} [deep] 是否深度继承\n * @param {Object} src\n * @param {Object} target...\n * @return {Object}\n */\nfunction extend() {\n var deep = false,\n args = [].slice.call(arguments);\n if (typeof args[0] === 'boolean') deep = args.shift();\n\n var src = args.shift() || {},\n target = undefined;\n\n for (var i = 0; i < args.length; i++) {\n target = args[i];\n\n if (!isObject(target) && !isArray(target)) continue;\n\n if (toString(src) !== toString(target)) {\n src = deepClone(target);\n } else {\n /*eslint-disable */\n each(target, function (val, key) {\n if (deep && (isObject(val) || isArray(val))) {\n src[key] = extend(deep, src[key], val);\n } else {\n src[key] = val;\n }\n });\n /*eslint-enable */\n }\n }\n\n return src;\n}\n\n/**\n * 将对象转化成 url 的 query string\n * @param {Object} query\n * @return {String}\n */\nfunction buildQuery(query) {\n var params = [];\n params.add = function (key, value) {\n if (value == null) value = '';\n this.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n };\n _serialize(params, query);\n return params.join('&');\n}\n\nfunction _serialize(params, obj, scope) {\n var array = isArray(obj),\n plain = isObject(obj),\n hash = undefined;\n\n each(obj, function (value, key) {\n hash = isObject(value) || isArray(value);\n\n if (scope) key = scope + '[' + (plain || hash ? key : '') + ']';\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 * 更正 url:主要就是去除多余的 /\n * @param {String} url\n * @return {String}\n */\nfunction urlNormalize(url) {\n return url.replace(/(?:[^:])\\/\\//g, '\\/');\n}\n\n/**\n * 给 URL 添加 query 字符串\n * @param {String} url\n * @param {String} query\n * @return {String}\n */\nfunction appendQuery(url, query) {\n if (query === '') return url;\n var parts = url.split('#');\n return (parts[0] + '&' + query).replace(/[&?]{1,2}/, '?') + (parts.length === 2 ? '#' + parts[1] : '');\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/util.jsx\n ** module id = 1\n ** module chunks = 0\n **/","'use strict';\n\nvar _namingTransform = require('naming-transform');\n\nvar _namingTransform2 = _interopRequireDefault(_namingTransform);\n\nvar _defaultOptions = require('./libs/defaultOptions');\n\nvar _defaultOptions2 = _interopRequireDefault(_defaultOptions);\n\nvar _mockHelper = require('./libs/mockHelper');\n\nvar _Formater = require('./libs/Formater');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar util = require('./libs/util');\nvar mockResponse = require('../plugins/mock');\n\nvar STORAGE = undefined;\ntry {\n // IE 8 下直接调用 window.localStorage 会报错\n localStorage.setItem('_ea', '_ea');\n localStorage.removeItem('_ea');\n STORAGE = localStorage;\n} catch (e) {\n STORAGE = {};\n}\n\nfunction debug(condition) {\n /* istanbul ignore next */\n if (condition && __DEBUG__ && console.debug) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n console.debug.apply(console, args);\n }\n}\n\n/**\n * @class ElegantApi\n */\nmodule.exports = (function () {\n function ElegantApi(options, mockOptions) {\n var _this = this;\n\n _classCallCheck(this, ElegantApi);\n\n var rootOptions = util.extend(true, {}, _defaultOptions2[\"default\"], options);\n\n var _rootOptions = rootOptions;\n var globals = _rootOptions.globals;\n var routes = _rootOptions.routes;\n var resources = _rootOptions.resources;\n var mocks = _rootOptions.mocks;\n\n delete rootOptions.globals;\n delete rootOptions.routes;\n delete rootOptions.resources;\n delete rootOptions.mocks;\n\n rootOptions = (0, _Formater.formatRootOptions)(rootOptions);\n\n this.globals = globals;\n this.mocks = mockOptions || mocks;\n // 支持用户只写 mocks 而不写 routes 的情况\n util.each(this.mocks, function (mock, key) {\n if (!(key in routes && key !== '$default')) routes[key] = {};\n });\n (0, _mockHelper.mixin)(this.mocks);\n\n this.routes = util.mapObject(routes, function (route, key) {\n return (0, _Formater.formatInitialRoute)(key, util.objectify(route), rootOptions);\n });\n this.resources = util.mapObject(resources, _Formater.formatResource);\n this.responseResources = util.mapObject(this.resources, _Formater.reverseResource);\n\n this.apis = {};\n\n // removeCache 之后会将 routeName 写入此对象中,\n // 这样下将再请求此 routeName 时,就会自动在 url 上加上个随机参数(可以避免 IE 6/7 的 GET 缓存)\n this._needReloadRouteNameMap = {};\n\n util.each(this.routes, function (route) {\n return _this.apis[route.name] = _this._generateApi(route);\n });\n\n debug(true, 'You are using a debug version of elegant-api, ' + 'you can switch to production version by using elegant-api.min.js');\n }\n\n // 下面几个以 _apply 全是 _transform 相关的函数\n\n ElegantApi.prototype._apply = function _apply(source, config, type) {\n var _this2 = this;\n\n var order = config.order || ['resource', 'alias', 'computed', 'drop', 'map', 'naming'];\n order.forEach(function (key) {\n var fnKey = '_apply' + key.charAt(0).toUpperCase() + key.slice(1);\n\n if (fnKey in _this2) {\n source = _this2[fnKey](source, config[key], type);\n }\n });\n return source;\n };\n\n ElegantApi.prototype._applyResource = function _applyResource(source, config, type) {\n var _this3 = this;\n\n if (!config) return source;\n\n var map = util.objectKeys(config).reduce(function (map, rKey) {\n var resource = _this3.resources[rKey];\n var paths = [].concat(config[rKey]);\n if (!resource) throw new Error('Resource ' + rKey + ' not exists.');\n\n paths.forEach(function (path) {\n resolveRefs(source, path).forEach(function (ref) {\n if (util.isObject(ref)) _this3['_' + type + 'Resource'](ref, resource, rKey);\n });\n });\n return map;\n }, {});\n return source;\n };\n\n // 不需要返回,obj 是引用\n\n ElegantApi.prototype._requestResource = function _requestResource(obj, resource) {\n var removes = [];\n util.each(resource, function (conf, key) {\n var oldVal = obj[key];\n var aliasKey = key;\n\n if (conf.alias && conf.alias !== key) {\n removes.push(key);\n aliasKey = conf.alias;\n }\n\n if (oldVal === undefined) oldVal = conf.defaultValue;\n\n obj[aliasKey] = conf.write ? conf.write.call(obj, oldVal) : oldVal;\n });\n\n util.each(removes, function (key) {\n return delete obj[key];\n });\n };\n\n ElegantApi.prototype._responseResource = function _responseResource(obj, resource, resourceKey) {\n resource = this.responseResources[resourceKey];\n this._requestResource(obj, resource);\n };\n\n ElegantApi.prototype._applyAlias = function _applyAlias(source, rules) {\n walk(source, rules, function (ref, path, last, ruleValue) {\n if (typeof ruleValue !== 'string') throw new SyntaxError('Expect string value for alias.');\n if (last in ref) {\n ref[ruleValue] = ref[last];\n delete ref[last];\n }\n });\n return source;\n };\n\n ElegantApi.prototype._applyComputed = function _applyComputed(source, rules) {\n walk(source, rules, function (ref, path, last, ruleValue) {\n if (typeof ruleValue !== 'function') throw new SyntaxError('Expect function value for computed.');\n ref[last] = ruleValue.call(ref, ref, source);\n });\n return source;\n };\n\n ElegantApi.prototype._applyDrop = function _applyDrop(source, rules) {\n var _rules;\n\n if (typeof rules === 'string') rules = (_rules = {}, _rules[rules] = true, _rules);else if (util.isArray(rules)) rules = rules.reduce(function (r, k) {\n r[k] = true;return r;\n }, {});\n // @TODO 可能是一个含有数组的对象\n if (util.isObject(rules)) {\n walk(source, rules, function (ref, path, last) {\n /* istanbul ignore else */\n if (last in ref) delete ref[last];\n });\n }\n return source;\n };\n\n ElegantApi.prototype._applyMap = function _applyMap(source, mapFn) {\n return typeof mapFn === 'function' ? mapFn(source) : source;\n };\n\n ElegantApi.prototype._applyNaming = function _applyNaming(source, config) {\n if (typeof config === 'string') config = { 'case': config };\n if (!util.isObject(config)) return source;\n config.naming = config['case'];\n return (0, _namingTransform2[\"default\"])(source, config);\n };\n\n /**\n * 中间件:判断是否需要使用缓存\n * @param {Object} route\n * @param {Function} cb\n * @return {Function}\n * @private\n */\n\n ElegantApi.prototype._cache = function _cache(route, cb) {\n var _this4 = this;\n\n var cache = this._getCache(route);\n if (cache.exists) {\n cb(null, cache.value);\n return false;\n } else {\n return function (err, data) {\n if (!err) {\n _this4._setCache(route, data);\n }\n cb(err, data);\n };\n }\n };\n\n /**\n * 删除指定的 routeNames 上的缓存\n * @param {String|Array} routeNames\n */\n\n ElegantApi.prototype.removeCache = function removeCache(routeNames) {\n var _this5 = this;\n\n if (!routeNames) return false;\n\n var _globals = this.globals;\n var cacheMap = _globals.cacheMap;\n var cacheStack = _globals.cacheStack;\n\n var keys = [].concat(routeNames);\n\n keys.forEach(function (k) {\n _this5._needReloadRouteNameMap[k] = true;\n delete cacheMap[k];\n });\n this.globals.cacheStack = cacheStack.filter(function (c) {\n return keys.indexOf(c[0]) < 0;\n });\n };\n\n ElegantApi.prototype._getCache = function _getCache(route) {\n var cacheMap = this.globals.cacheMap;\n var name = route.name;\n var http = route.http;var key = undefined;\n\n var exists = false,\n value = null,\n data = undefined;\n\n if (name in cacheMap) {\n cacheMap = cacheMap[name];\n key = JSON.stringify([http.params, http.query]);\n exists = key in cacheMap;\n data = cacheMap[key] || {};\n var expire = data.expire;\n if (expire !== 0 && expire < +new Date()) {\n exists = false;\n } else {\n value = data.value;\n }\n }\n\n debug(route.mock.debug, 'EA:(cache) check %s %o, %sexists!', name, { key: key, keys: util.objectKeys(cacheMap) }, exists ? '' : 'not ');\n\n return { exists: exists, value: value };\n };\n\n ElegantApi.prototype._setCache = function _setCache(route, value) {\n var _globals2 = this.globals;\n var cacheSize = _globals2.cacheSize;\n var cacheMap = _globals2.cacheMap;\n var cacheStack = _globals2.cacheStack;\n var name = route.name;\n var http = route.http;\n\n var ref = cacheMap[name] || {},\n key = JSON.stringify([http.params, util.omit(http.query, ['__ea', '__eaData'])]);\n\n debug(route.mock.debug, 'EA:(cache) set %s %o', name, { key: key, cacheMap: cacheMap });\n\n var expire = route.cache.expireSeconds * 1000;\n if (expire > 0) expire += +new Date();\n ref[key] = { value: value, expire: expire };\n cacheMap[name] = ref;\n cacheStack.push([name, key]);\n\n if (cacheSize > 0 && cacheStack.length > cacheSize) {\n var _cacheStack$shift = cacheStack.shift();\n\n var n = _cacheStack$shift[0];\n var k = _cacheStack$shift[1];\n\n cacheMap[n] && delete cacheMap[n][k];\n }\n };\n\n /**\n * 中间件:对 request 的 data 和 response 的 data 进行转化\n * @param {Object} route\n * @param {Function} cb\n * @return {Function}\n * @private\n */\n\n ElegantApi.prototype._transform = function _transform(route, cb) {\n var _this6 = this;\n\n var http = route.http;\n http.data = this._apply(http.data, route.request, 'request');\n\n return function (err, data) {\n if (err) return cb(err, data);\n try {\n // 要深拷贝,防止用户修改返回的数据\n data = _this6._apply(util.deepClone(data), route.response, 'response');\n _this6.removeCache(route.removeCache);\n cb(err, data);\n } catch (err) {\n cb(err);\n }\n };\n };\n\n /**\n * 对 http 对象进行处理\n * @param {Object} route\n * @private\n */\n\n ElegantApi.prototype._emulate = function _emulate(route) {\n var mock = route.mock;\n var http = route.http;\n var name = route.name;\n\n var qs = util.buildQuery(http.query);\n http.url = util.appendQuery(http.path, qs);\n\n if (!route.cache.enable || this._needReloadRouteNameMap[name]) {\n http.url = util.appendQuery(http.url, this.globals.cacheQueryKey + '=' + new Date().getTime());\n delete this._needReloadRouteNameMap[name];\n }\n\n if (mock.server && !/^https?:\\/\\//.test(http.url)) {\n http.crossOrigin = true;\n http.url = util.urlNormalize((mock.server === 'self' ? '' : mock.server) + http.url);\n }\n\n if (route.emulateHTTP && !http.crossOrigin && /^(PUT|PATCH|DELETE)$/.test(http.method)) {\n http.headers['X-HTTP-Method-Override'] = http.method;\n http.method = 'POST';\n }\n\n if (route.emulateJSON) {\n http.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n http.data = util.buildQuery(http.data);\n }\n };\n\n ElegantApi.prototype._generateApi = function _generateApi(initRoute) {\n var _this7 = this;\n\n return function (userArgs, userRoute, cb) {\n var route = undefined;\n // 返回的是一个全新的 route,其中 route.http.{path, params, query, data} 都是计算后的\n try {\n route = (0, _Formater.formatRealtimeRoute)(initRoute, userArgs, userRoute);\n } catch (e) {\n return cb(e);\n }\n\n var _route = route;\n var mock = _route.mock;\n var http = _route.http;\n var dataTransformMethod = _route.dataTransformMethod;\n\n cb = _this7._transform(route, cb);\n\n // cache\n if (route.cache.enable) {\n cb = _this7._cache(route, cb);\n if (cb === false) return false; // 说明直接使用了缓存的数据\n }\n // 下面的步骤不能对 query 和 params 处理,否则会影响 cache, (__ea 和 __eaData 参数除外)\n\n http.body = http.data = (0, _Formater.decodeUserData)(http.data);\n var transformData = _this7._generateApiTransformData(route);\n\n if (!mock.disabled && !mock.memory) {\n transformData = JSON.stringify(transformData);\n http.query.__ea = route.name;\n\n // cookie 不支持跨域,但在 karma 上只能测试到跨域\n if ((!mock.server || mock.server === 'self') && dataTransformMethod === 'cookie' && !util.isServer) {\n var now = new Date();\n now.setTime(now.getTime() + 5000);\n var cookie = '__ea' + route.name + '=' + encodeURIComponent(transformData) + '; expires=' + now.toUTCString() + '; path=/';\n\n debug(mock.debug, 'EA:(request) write cookie %o', cookie);\n\n document.cookie = cookie;\n } else {\n http.query.__eaData = transformData;\n }\n }\n\n _this7._emulate(route);\n _this7._response(route, transformData, cb);\n };\n };\n\n ElegantApi.prototype._response = function _response(route, transformData, cb) {\n var _this8 = this;\n\n var mock = route.mock;\n var http = route.http;\n\n debug(mock.debug, 'EA:(response) route: %o, transformData %o', route, transformData);\n\n var memoryHandle = function memoryHandle() {\n mockResponse(_this8.mocks, route.name, transformData, function (error, data) {\n route.handle({ http: http, error: error, data: data }, cb);\n });\n };\n\n if (mock.memory) {\n // 如果是 0,说明用户不想要异步,这样可以快速得到数据\n if (mock.delay === 0) {\n memoryHandle();\n } else {\n setTimeout(memoryHandle, mock.delay);\n }\n } else {\n route.handle({ http: http }, cb);\n }\n };\n\n ElegantApi.prototype._generateApiTransformData = function _generateApiTransformData(route) {\n var ea = STORAGE.__ea ? JSON.parse(STORAGE.__ea) : {};\n\n var prefix = this.globals.eaQueryPrefix;\n var http = route.http;\n\n var search = '';\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV === 'test') {\n search = route.__search || ''; // only for test\n } else if (!util.isServer) {\n search = location.search.slice(1);\n }\n\n search.split('&').reduce(function (ea, pair) {\n var _pair$split$map = pair.split('=').map(decodeURIComponent);\n\n var key = _pair$split$map[0];\n var value = _pair$split$map[1];\n\n if (key !== prefix && key.indexOf(prefix) === 0) ea[key.substr(prefix.length)] = value;\n return ea;\n }, ea);\n\n STORAGE.__ea = JSON.stringify(ea);\n\n return {\n mock: route.mock,\n params: http.params,\n query: http.query,\n data: http.data,\n ea: ea\n };\n };\n\n ElegantApi.prototype.request = function request(source, params, config, callback) {\n var _this9 = this;\n\n if (typeof params === 'function') callback = params;else if (typeof config === 'function') callback = config;\n\n // 保证参数类型\n params = util.objectify(params);\n config = util.objectify(config);\n if (typeof callback !== 'function') callback = util.emptyFunction;\n\n var end = function end(callback) {\n if (typeof source === 'string') return _this9._singleRequest(source, params, config, callback);else if (util.isArray(source)) return _this9._batchSeriesRequest(source, params, config, callback);else if (util.isObject(source)) return _this9._batchParallelRequest(source, params, config, callback);\n\n callback(new SyntaxError('Illegal arguments.'));\n };\n\n if (typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n end(function (err, data) {\n if (err) reject(err);else resolve(data);\n callback(err, data);\n });\n });\n } else {\n end(callback);\n }\n };\n\n ElegantApi.prototype._singleRequest = function _singleRequest(key, params, config, callback) {\n if (this.apis[key]) return this.apis[key](params, config, callback);\n callback(new Error('Request key \\'' + key + '\\' not exists.'));\n };\n\n // 应该废弃? 可以使用 Promise.then\n\n ElegantApi.prototype._batchSeriesRequest = function _batchSeriesRequest(arr, conf, config, callback) {\n var _this10 = this;\n\n var index = 0;\n\n var lastError = null,\n lastData = null;\n var iterator = conf.iterator /* istanbul ignore next */ || util.emptyFunction;\n var iteratorResult = undefined;\n\n var next = function next() {\n var key = arr[index++];\n if (key) {\n iteratorResult = iterator(key, index - 1, lastError, lastData);\n if (iteratorResult === false) return callback(lastError, lastData);\n\n _this10.request(key, iteratorResult, config[key], function (err, data) {\n lastError = err;\n lastData = data;\n next();\n });\n } else {\n callback(lastError, lastData);\n }\n };\n\n next();\n };\n\n // 应该废弃? 可以使用 Promise.all\n\n ElegantApi.prototype._batchParallelRequest = function _batchParallelRequest(obj, conf, config, callback) {\n var _this11 = this;\n\n var keys = Object.keys(obj),\n len = keys.length;\n\n var errMap = new Error('MAP_ERROR'),\n dataMap = {},\n hasError = false;\n var iterator = conf.iterator || util.emptyFunction;\n\n keys.forEach(function (key) {\n var params = obj[key];\n var requestKey = conf.alias && conf.alias[key] || key;\n _this11.request(requestKey, params, config[requestKey], function (err, data) {\n len--;\n\n iterator(params, key, err, data);\n\n if (err) {\n hasError = true;\n errMap[key] = err;\n /* istanbul ignore next */\n if (err.message) errMap.message = err.message; // 和 single request 一致,方便统一处理错误\n } else {\n dataMap[key] = data;\n }\n\n if (!len) {\n callback(hasError ? errMap : null, dataMap);\n }\n });\n });\n };\n\n return ElegantApi;\n})();\n\n/**\n * 遍历指定的规则,主要用在 _applyAlias 和 _applyComputed 中\n */\nfunction walkRules(rules, cb, prefix) {\n for (var key in rules) {\n var path = prefix ? prefix + '.' + key : key;\n if (util.isObject(rules[key])) {\n walkRules(rules[key], cb, path);\n } else {\n cb(path, rules[key]);\n }\n }\n}\n\nfunction resolveRefs(source, path) {\n var refs = [source];\n if (!path) return refs;\n\n path.split('.').forEach(function (key) {\n var tmp = [];\n refs.forEach(function (r) {\n /* istanbul ignore else */\n if (r) {\n if (key === '[]' && Array.isArray(r)) {\n tmp = tmp.concat(r);\n } else {\n tmp.push(r[key]);\n }\n }\n });\n refs = tmp;\n });\n\n return refs.filter(function (r) {\n return r;\n });\n}\n\nfunction walk(source, rules, cb) {\n walkRules(util.objectify(rules), function (path, ruleValue) {\n var parts = path.split('.');\n var last = parts.pop();\n path = parts.join('.');\n\n resolveRefs(source, path).forEach(function (ref) {\n return cb(ref, path, last, ruleValue);\n });\n });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/ElegantApi.jsx\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (source) {\n var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref$deep = _ref.deep;\n var deep = _ref$deep === undefined ? 0 : _ref$deep;\n var _ref$naming = _ref.naming;\n var naming = _ref$naming === undefined ? 'camel' : _ref$naming;\n\n if (typeof source === 'string') {\n return transform(source, naming, deep, null);\n }\n return walk(source, deep, naming);\n};\n\n/** Used to match words to create compound words. */\nvar reWords = function () {\n var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]',\n lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n\n return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n}();\n\nfunction wrap(str, fn) {\n return str.match(reWords).reduce(fn, '');\n}\n\nvar transformers = {\n camel: function camel(str) {\n return wrap(str, function (result, word, index) {\n var fn = index ? 'toUpperCase' : 'toLowerCase';\n return result + word.charAt(0)[fn]() + word.slice(1);\n });\n },\n cap: function cap(str) {\n return wrap(str, function (result, word, index) {\n return result + word.charAt(0).toUpperCase() + word.slice(1);\n });\n },\n kebab: function kebab(str) {\n return wrap(str, function (result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n },\n snake: function snake(str) {\n return wrap(str, function (result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n }\n};\n\nvar camel = transformers.camel;\nvar cap = transformers.cap;\nvar kebab = transformers.kebab;\nvar snake = transformers.snake;\nexports.camel = camel;\nexports.cap = cap;\nexports.kebab = kebab;\nexports.snake = snake;\n\n/**\n *\n * 将 source 中的 Object 的 keys 的命名风格全部转换成指定的 naming 命名风格\n *\n * @param {Object} source 要处理的对象\n * @param {Number} [options.deep = 0] 处理的深度\n *\n * @param {String|Function} [options.naming = 'camel']\n * 命名风格,支持 camel, cap, kebab, snake,或自定义方法\n *\n * 如果指定了函数,函数得到的参数会是 (key, deep, currentObject),函数需要返回 newKey\n * 如果函数返回 false,则忽略更新此时的 key,\n *\n * @return {Object} 转化后的对象,原对象不会被破坏\n */\n\nfunction walk(node, deep, naming) {\n var result = node;\n\n if (isObject(node)) {\n result = {};\n for (var key in node) {\n if (node.hasOwnProperty(key)) {\n result[transform(key, naming, deep, node)] = deep === 1 ? node[key] : walk(node[key], deep > 1 ? deep - 1 : deep, naming);\n }\n }\n } else if (isArray(node)) {\n result = [];\n for (var i = 0; i < node.length; i++) {\n result.push(walk(node[i], deep, naming));\n }\n }\n\n return result;\n}\n\nfunction transform(key, naming, deep, currentObject) {\n if (typeof naming === 'string' && naming in transformers) {\n return transformers[naming](key);\n } else if (typeof naming === 'function') {\n var newKey = naming(key, deep, currentObject);\n if (!newKey) return key;\n if (typeof newKey === 'string') return newKey;\n throw new Error('Transform naming function should return a valid string value!');\n }\n throw new Error('Not supported transform naming type, only support `string` and `function`');\n}\n\nfunction getType(target) {\n return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();\n}\nfunction isArray(target) {\n return getType(target) === 'array';\n}\nfunction isObject(target) {\n return getType(target) === 'object';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/naming-transform/build/index.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports[\"default\"] = {\n debug: false, // 开启调试模式\n base: '', // 指定基准路径,这样在单独的 route 中只要指定不同的部分即可\n path: '',\n // query: 'a=:aa&b=', // 需要参数 `aa` and `b`\n // data: 'c&d=&e=eee', // 需要参数 `d`,参数 `c` 是可选的,参数 `e` 的默认值是 \"eee\"\n\n // 来自于 vue-resource\n emulateJSON: false,\n emulateHTTP: false,\n\n // 只有 GET 请求才会缓存,另外可以单独在 route 中指定 true 或者 false\n // 也可以设置成对象的形式: { enable: 'smart'/true/false, expireSeconds: number }\n cache: 'smart',\n\n mock: {\n // disabled: false, // 是否禁用 mock\n memory: true, // 是否使用缓存来 mock\n\n // 指定独立的 mock 服务器, e.g: http://domain.com/\n // 需要指定 memory 为 false,另外其值可以指定为 'self',表示使用当前域名)\n server: null,\n proxy: null, // 指定代理的服务器(不推荐使用,需要 memory 为 false)\n delay: { min: 200, max: 1000 } // 或者指定为一个具体的数字\n },\n dataTransformMethod: 'query', // query/cookie cookie 只能用在没有独立的 mock server 的情况下,因为 cookie 无法跨域\n\n // 这里的设置不会被单独的 route 覆盖\n globals: {\n eaQueryPrefix: '__',\n cacheQueryKey: '_t', // 如果声明了 cache 为 false,则会在 url 上带上此参数,其值是当前的时间的毫秒数\n cacheSize: 100,\n cacheMap: {},\n cacheStack: []\n },\n\n http: {\n method: 'GET',\n crossOrigin: false,\n credentials: 'same-origin', // fetch 函数需要使用的参数\n dataType: 'json',\n // url: null, // url 不用设置,会根据配置自动生成合适的值\n // body: null, // fetch api 标准是用 body\n data: null, // 而 jquery 用的是 data,这里兼容两者,设置的时候只需要设置 data 就行,系统会自动同步数据到 body\n headers: {\n // 'Content-Type': 'application/json;charset=utf-8',\n // 'Content-Type': 'application/x-www-form-urlencoded',\n }\n },\n\n request: {\n naming: null\n // 数组也会 extend,所以没有在这里定义,而是写在函数中\n // order: ['resource', 'alias', 'computed', 'drop', 'map', 'naming']\n },\n\n response: {\n naming: {\n 'case': 'camel', // 命名风格,可以为 camel/kebab/snake/cap 或自己实现,即指定一个 function\n deep: 0 // deep 默认就是 0,忽略此参数时,可以直接写成 naming: 'camel'\n }\n },\n\n // 可能需要实现的一个方法,默认是调用 jquery 中的 ajax 方法的\n handle: function handle(target, callback) {\n if (this.mock.memory) return callback(target.error, target.data);\n\n var ajax = window.jQuery && window.jQuery.ajax;\n if (ajax) {\n return ajax(target.http).success(function (data) {\n return callback(null, data);\n }).error(function (xhr) {\n return callback(xhr);\n });\n }\n\n throw new Error('Need implement handler function in options');\n },\n\n mocks: {\n /* 全局默认的 mock\n $default: {\n status: 0\n data: null\n message: ''\n }\n */\n },\n resources: {},\n routes: {}\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/defaultOptions.jsx\n ** module id = 4\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports.mixin = mixin;\n\nvar _util = require('./util');\n\nfunction mixin(context) {\n\n context.$objectify = function (target, key) {\n return promisify(context, key, target, true);\n };\n\n context.$objectifyAll = function (target, keys) {\n return Promise.all([].concat(keys).map(function (key) {\n return context.$objectify(target, key);\n }));\n };\n\n context.$fetch = function (target, key, conf) {\n if (conf && conf.body) {\n conf.data = conf.body;\n delete conf.body;\n }\n return promisify(context, key, (0, _util.extend)({}, target, conf));\n };\n\n context.$fetchAll = function (target, obj) {\n var keys = (0, _util.objectKeys)(obj);\n\n return Promise.all(keys.map(function (key) {\n return context.$fetch(target, key, obj[key]);\n })).then(function (list) {\n return Promise.resolve(keys.reduce(function (all, key, index) {\n all[key] = list[index];\n return all;\n }, {}));\n });\n };\n} // 依赖于 Promise\n\nfunction promisify(context, key, target, save) {\n return new Promise(function (resolve, reject) {\n if (typeof context[key] !== 'function') {\n return resolve(context[key]);\n }\n\n context[key](target, function (err, data) {\n if (err) {\n reject(err);\n } else {\n if (save) context[key] = data;\n resolve(data);\n }\n });\n });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/mockHelper.jsx\n ** module id = 5\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports.formatRootOptions = formatRootOptions;\nexports.formatInitialRoute = formatInitialRoute;\nexports.encodeUserData = encodeUserData;\nexports.decodeUserData = decodeUserData;\nexports.formatRealtimeRoute = formatRealtimeRoute;\nexports.formatResource = formatResource;\nexports.reverseResource = reverseResource;\n\nfunction _typeof(obj) { return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; }\n\nvar util = require('./util');\n\n/**\n * @typedef {Array} SUPPORT_RESOURCE_TYPES\n *\n * 可以设置在 resource.type 中的类型\n */\nvar SUPPORT_RESOURCE_TYPES = [Number, String, Boolean];\n\n/**\n * @typedef {Array} SUPPORT_RESOURCE_TYPE_VALUES\n *\n * {@link SUPPORT_RESOURCE_TYPES} 对应的默认值\n */\nvar SUPPORT_RESOURCE_TYPE_VALUES = [0, '', false];\n\n/**\n * @typedef {Array} SMART_CACHE_HTTP_METHODS\n *\n * 如果指定 cache 为 \"smart\" 时,当 http method 为此字段中之一时,\n * 会自动将 cache 设置为 true,否则设置为 false\n */\nvar SMART_CACHE_HTTP_METHODS = ['GET', 'HEAD'];\n\n/**\n * @typedef {Array} NO_DATA_HTTP_METHODS\n *\n * 当 http method 为下面字段之一时, http requres 的内容应该为空,即 `data = {}`\n */\nvar NO_BODY_CONTENT_HTTP_METHODS = ['GET', 'HEAD'];\n\n/**\n * 当用 JSON 提交数据时,用户可以提交任何格式的数据,而不是 Object\n * 但此框架设计时候只考虑了 Object,所以为了支持这种格式,需要将这些变化\n * 的数据转化成 Object,所以需要一个 key 来识别\n *\n * @type {String}\n */\nvar USER_DATA_RAW_KEY = '__raw_data_v1';\n\n/**\n * 解析像 url query 那样的字符串\n * @param {String} target\n * @return {Object}\n * @example\n * \"fo=:foo&bar=&version=1\" =>\n *\n * {\n * fo: {\n * required: true,\n * alias: \"foo\"\n * },\n * bar: {\n * required: true\n * },\n * version: {\n * value: '1'\n * }\n * }\n *\n * @private\n */\nfunction formatQueryString(target) {\n if (util.isObject(target)) return target;\n if (typeof target !== 'string') return {};\n\n return target.split('&').reduce(function (result, qs) {\n var _qs$split$map = qs.split('=').map(decodeURIComponent);\n\n var key = _qs$split$map[0];\n var val = _qs$split$map[1];\n\n var conf = {},\n alias = undefined;\n\n if (val && val[0] === ':' && val[1]) alias = val.slice(1);else if (val) conf.value = val;\n\n if (val === '' || alias) conf.required = true;\n\n if (alias) {\n conf.alias = key;\n key = alias;\n }\n\n result[key] = conf;\n return result;\n }, {});\n}\n\n/**\n * 格式化配置中的 http 选项\n * @private\n */\nfunction formatRouteHttpOption(route) {\n // 将 route 中的属性 copy 到 route.http 中(只 copy route.http 中支持的 keys)\n var http = route.http;\n\n for (var key in http) {\n if (key in route) http[key] = route[key];\n }\n\n http.path = util.urlNormalize(route.base + route.path);\n http.method = http.method.toUpperCase();\n\n return route.http;\n}\n\n/**\n * 格式化配置中的 mock 选项\n * @private\n */\nfunction formatRouteMockOption(route) {\n var mock = route.mock;\n\n if (!util.isObject(mock)) {\n mock = route.mock = { disabled: !mock };\n }\n\n // debug\n if (!('debug' in mock)) mock.debug = route.debug;\n\n if (mock.disabled) {\n delete mock.memory;\n }\n if (mock.disabled || mock.memory) {\n delete mock.server;\n delete mock.proxy;\n }\n\n return route.mock;\n}\n\n/**\n * 格式化配置中的 cache 选项\n * @private\n */\nfunction formatRouteCacheOption(route) {\n var cache = route.cache,\n enable = undefined,\n expireSeconds = 0;\n\n if (!util.isObject(cache)) {\n enable = cache;\n } else {\n enable = cache.enable;\n expireSeconds = cache.expireSeconds || 0;\n }\n\n enable = enable === 'smart' && SMART_CACHE_HTTP_METHODS.indexOf(route.http.method) >= 0 || enable === true;\n\n if (expireSeconds < 0) enable = false;\n\n route.cache = { enable: enable, expireSeconds: expireSeconds };\n\n return route.cache;\n}\n\n/**\n * 对用户提供的 rootOptions 格式化\n * @param {Object} rootOptions 用户配置(不应该包括 routes/resorces/mocks/globals\n * @return {Object} 返回格式化之后的 rootOptions(这个 rootOptions 和原 rootOptions 是同一个)\n */\nfunction formatRootOptions(rootOptions) {\n rootOptions.query = formatQueryString(rootOptions.query);\n rootOptions.data = formatQueryString(rootOptions.data);\n\n return rootOptions;\n}\n\n/**\n * 在用户还没有使用 request(routeKey, userArgs, callback) 之前,对 route 进行一些基本的格式化\n * @param {String} routeKey\n * @param {Object} route\n * @param {Object} formatedRootOptions\n * @return {Object} 返回格式化之后的 route(这个 route 是原 route 的一个深拷贝)\n */\nfunction formatInitialRoute(routeKey, route, formatedRootOptions) {\n if (!route.name) route.name = routeKey;\n route.query = formatQueryString(route.query);\n route.data = formatQueryString(route.data);\n\n // 创建一个全新的 route,不要污染原有的\n route = util.extend(true, {}, formatedRootOptions, route);\n\n formatRouteHttpOption(route);\n formatRouteMockOption(route);\n formatRouteCacheOption(route);\n\n return route;\n}\n\n/**\n * 获取 path 中的变量,如 /api/user/:uid,就会返回 [\"uid\"]\n * @param {String} path - url 的路径\n * @return {Array} 此路径中的所有的变量\n * @private\n */\nfunction getParamKeysFromPath(path) {\n var params = [];\n path.replace(/\\/:([-\\w]+)/g, function (r, key) {\n params.push(key);\n });\n return params;\n}\n\n/**\n * 将 path 中的变量替换成真实用户提供的值\n * @param {String} path 带变量的 path\n * @param {Object} params\n * @return {String}\n * @private\n */\nfunction getFullPathFromParams(path, params) {\n return path.replace(/\\/:([-\\w]+)/g, function (r, key) {\n return '/' + params[key];\n });\n}\n\n/**\n * 获取请求延迟的时间\n * @param {Object|Number} delay 用户配置的数据\n * @return {Number}\n */\nfunction getDelayTime(delay) {\n if (util.isObject(delay)) {\n delay = util.extend({ min: 200, max: 3000 }, delay);\n delay = Math.floor(Math.random() * (delay.max - delay.min) + delay.min);\n }\n delay = parseInt(delay, 10);\n return delay && delay > 0 ? delay : 0;\n}\n\n/**\n * 根据现有的 route 信息,来将 userArgs 分成三类:params, query 和 data,三者都应该是 null 或 Object\n * - params 是 url.path 上的参数\n * - query 是 url.search 上的参数\n * - data 是 请求体的内容\n *\n * 用户提供 userArgs 可能是将这三者里的参数合并在一个对象中提供的,所以需要将这些参数拆开,\n * 另外用户也有可能提供一些多余的参数,也需要把这些参数去掉\n *\n * @param {Object|null} userArgs\n * @param {Object} route\n * @return {{params: Object, query: Object, data: Object}}\n * @private\n */\nfunction parseUserArgs(userArgs, route) {\n userArgs = util.extend(true, {}, userArgs);\n var keys = util.objectKeys(userArgs);\n var http = route.http;\n\n var allows = ['params', 'query', 'data'];\n\n var noBodyContent = NO_BODY_CONTENT_HTTP_METHODS.indexOf(http.method) >= 0;\n if (keys.every(function (k) {\n return allows.indexOf(k) >= 0;\n })) {\n if ('data' in userArgs) userArgs.data = encodeUserData(userArgs.data);\n allows.forEach(function (k) {\n return userArgs[k] = util.objectify(userArgs[k]);\n });\n if (noBodyContent) userArgs.data = {};\n return validateParsedUserArgs(userArgs, route);\n }\n\n // query 和 data 可能有 alias 字段\n var queryKeys = util.objectKeys(route.query);\n var paramKeys = getParamKeysFromPath(http.path);\n var params = {},\n query = {},\n data = {};\n\n var rQuery = route.query,\n rData = route.data;\n keys.forEach(function (key) {\n // 注意优先级不能换\n if (paramKeys.indexOf(key) >= 0) params[key] = userArgs[key];else if (queryKeys.indexOf(key) >= 0) query[rQuery[key] && rQuery[key].alias || key] = userArgs[key];else if (!noBodyContent) data[rData[key] && rData[key].alias || key] = userArgs[key];\n });\n return validateParsedUserArgs({ params: params, query: query, data: data }, route);\n}\n\n/**\n * 验证处理后的 userArgs\n *\n * 注意: validate 的时候,也有可能会将配置的默认值赋值到原参数上\n *\n * @param {{params: Object, query: Object, data: Object}} userArgs\n * @param {Object} route\n * @throws\n * @private\n */\nfunction validateParsedUserArgs(userArgs, route) {\n var path = route.http.path;\n var paramKeys = getParamKeysFromPath(path);\n var label = route.name;\n\n // 先验证 params\n paramKeys.forEach(function (k) {\n if (!(k in userArgs.params)) throw new SyntaxError('Route ' + label + ' missing params parameter: ' + k + '.');\n });\n\n // query 和 data 的验证方法是一样的\n ['query', 'data'].forEach(function (key) {\n var ref = userArgs[key];\n var rules = route[key];\n util.each(rules, function (rule, ruleKey) {\n var argKey = rule.alias || ruleKey;\n var argValue = ref[argKey];\n var exists = argKey in ref;\n\n if (rule.required && !exists) throw new SyntaxError('Route ' + label + ' missing ' + key + ' parameter: ' + ruleKey + '.');\n if (rule.validate && exists) {\n if (typeof rule.validate === 'function' && !rule.validate(argValue) || rule.validate instanceof RegExp && !rule.validate.test(argValue)) {\n throw new SyntaxError('Route ' + label + ' ' + key + ' parameter \\'' + argKey + '\\' validate error.');\n }\n }\n\n if ('value' in rule && !exists) ref[argKey] = rule.value;\n });\n });\n\n return userArgs;\n}\n\n/**\n * 对非 Object 的 data 做处理,转化成 Object\n * @param {*} data\n * @return {Object}\n */\nfunction encodeUserData(data) {\n var _ref;\n\n if (util.isObject(data)) return data;\n return _ref = {}, _ref[USER_DATA_RAW_KEY] = data, _ref;\n}\n\n/**\n * 恢复 data\n * @param {Object} data\n * @return {*}\n */\nfunction decodeUserData(data) {\n return USER_DATA_RAW_KEY in data ? data[USER_DATA_RAW_KEY] : data;\n}\n\n/**\n * 在用户调用 request(routeKey, userArgs, callback, userRoute) 时,合成一个全新的 route\n * @param {Object} route\n * @param {Object} userArgs\n * @param {Object} userRoute\n * - http (不支持在 route 外层设置 http 属性)\n * - mock\n * - debug\n * - cache\n *\n * @return {Object}\n */\nfunction formatRealtimeRoute(route, userArgs, userRoute) {\n route = util.extend(true, {}, route);\n userRoute = util.extend(true, {}, userRoute);\n var http = route.http,\n userHttp = userRoute.http || {};\n\n // path, method 需要特殊处理\n if (userHttp.path) userHttp.path = util.urlNormalize(route.base + userHttp.path);\n if (userHttp.method) userHttp.method = userHttp.method.toUpperCase();\n util.extend(true, http, userHttp); // http 用继承\n\n if ('mock' in userRoute) route.mock = formatRouteMockOption(userRoute); // mock 直接覆盖\n if ('cache' in userRoute) route.cache = formatRouteCacheOption(userRoute); // cache 也直接覆盖\n if ('debug' in userRoute) route.mock.debug = userRoute.debug;\n\n var _parseUserArgs = parseUserArgs(userArgs, route);\n\n var params = _parseUserArgs.params;\n var query = _parseUserArgs.query;\n var data = _parseUserArgs.data;\n\n // 保证 query 是字符串\n\n util.each(query, function (val, key, query) {\n return query[key] = String(val);\n });\n\n http.path = getFullPathFromParams(http.path, params);\n http.params = params;\n http.query = query;\n http.data = data;\n\n // 每次都计算,主要是用户可能配置了一个时间范围\n route.mock.delay = route.mock.memory ? getDelayTime(route.mock.delay) : 0;\n\n return route;\n}\n\n/**\n * 对用户配置的 resource 格式化\n *\n * @param {Object} resource 用户对某个 resource 的实体的定义,里面是 key, value 对,其中 value 有以下几种情况\n * - 当为 String 时,把它当作 alias\n * - 当为 Function 时,判断是否在 {@link SUPPORT_RESOURCE_TYPES} 之中,\n * 是的话把它当作 type,否作抛出异常\n * - 当为 Object 时,检查它内部的这些变量\n * `type, alias, defaultValue, read, write`\n * @param {Strint} resourceKey\n * @return {Object}\n *\n * @example\n *\n * user: {\n * uid: Number,\n * username: 'user_name',\n * gender: { type: String, defaultValue: 'M', alias: 'sex' },\n * age: {\n * type: Number,\n * read() {\n * return new Date().getFullYear() - this.age;\n * },\n * write() {\n * this.year = new Date().getFullYear() - this.age;\n * delete this.age\n * }\n * }\n * }\n */\nfunction formatResource(resource, resourceKey) {\n return util.objectKeys(resource).reduce(function (result, key) {\n\n var definition = resource[key],\n definitionType = typeof definition === 'undefined' ? 'undefined' : _typeof(definition);\n\n var type = undefined,\n alias = undefined,\n defaultValue = undefined,\n read = undefined,\n write = undefined;\n\n if (definitionType === 'string') {\n alias = definition;\n } else if (definitionType === 'function') {\n type = definition;\n } else if (definition) {\n type = definition.type;\n alias = definition.alias;\n defaultValue = definition.defaultValue;\n read = definition.read;\n write = definition.write;\n }\n\n var typeIndex = SUPPORT_RESOURCE_TYPES.indexOf(type);\n if (typeIndex >= 0) {\n if (typeof defaultValue === 'undefined') defaultValue = SUPPORT_RESOURCE_TYPE_VALUES[typeIndex];\n } else if (type) {\n throw new Error('Not supported resource type for ' + resourceKey + '.' + key);\n } else {\n type = null;\n }\n\n // TODO 验证 read/write 为 function, alias 为字符串 (当它们不为 null 时)\n\n // read 表示从 response 中读取数据, write 当前写入到 request 中\n result[key] = { type: type, alias: alias, defaultValue: defaultValue, read: read, write: write };\n return result;\n }, {});\n}\n\n/**\n * 将 resource 反转\n *\n * 上面函数返回的值是给 resquest 时用的,此函数返回的是给 response 用的\n */\nfunction reverseResource(resource, resourceKey) {\n var result = {};\n\n util.each(resource, function (config, key) {\n var type = config.type;\n var alias = config.alias;\n var defaultValue = config.defaultValue;\n var read = config.read;\n var write = config.write;\n\n if (alias) {\n ;\n var _ref2 = [alias, key];\n key = _ref2[0];\n alias = _ref2[1];\n }var _ref3 = [write, read];\n read = _ref3[0];\n write = _ref3[1];\n\n result[key] = { type: type, alias: alias, defaultValue: defaultValue, read: read, write: write };\n });\n\n return result;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/Formater.jsx\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function (mocks, key, transformData, callback) {\n var mockTarget;\n if (key in mocks || '$default' in mocks) {\n mockTarget = key in mocks ? mocks[key] : mocks.$default;\n transformData.mock.name = key;\n if (typeof mockTarget === 'function') mockTarget.call(mocks, transformData, callback);\n else callback(null, mockTarget);\n } else {\n callback({\n message: 'Not found mock target for `' + key + '`.',\n name: 'ConfigError',\n by: 'ElegantApi'\n });\n }\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./plugins/mock.js\n ** module id = 7\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 678be99b434414b55674","webpack:///./src/index.jsx","webpack:///./src/libs/util.jsx","webpack:///./src/ElegantApi.jsx","webpack:///./~/naming-transform/build/index.js","webpack:///./src/libs/defaultOptions.jsx","webpack:///./src/libs/mockHelper.jsx","webpack:///./src/libs/Formater.jsx","webpack:///./plugins/mock.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sEAAqE,aAAa;AAClF;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAc;AACd,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wC;;;;;;AClDA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,eAAe;AAC3B,aAAY,SAAS;AACrB;AACA;AACA;AACA,oBAAmB,gBAAgB;AACnC;AACA;AACA,IAAG;AACH;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,SAAS;AACrB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA,aAAY,mCAAmC;AAC/C,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,aAAa;AACzB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA,+BAA8B;AAC9B;;AAEA,kBAAiB,iBAAiB;AAClC;;AAEA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA,iDAAgD,IAAI;AACpD,E;;;;;;ACnOA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,uCAAuC,kBAAkB;;AAE/F,kDAAiD,0CAA0C,0DAA0D,EAAE;;AAEvJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;AACA,uFAAsF,aAAa;AACnG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2CAA0C;;AAE1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA,MAAK,IAAI;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA,wDAAuD,gCAAgC;AACvF,mBAAkB;AAClB,MAAK,IAAI;AACT;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+CAA8C;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB,eAAc,SAAS;AACvB,eAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,aAAa;AAC3B;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;;AAE1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAuB,uBAAuB;AAC9C;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA,yEAAwE,4CAA4C;;AAEpH,aAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAkC;AAClC;;AAEA,4DAA2D,+BAA+B;;AAE1F;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB,eAAc,SAAS;AACvB,eAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,yCAAwC,0BAA0B;AAClE;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,wCAAuC;AACvC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0FAAyF,mCAAmC;;AAE5H;;AAEA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uBAAsB,uCAAuC;AAC7D,QAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL,qBAAoB,aAAa;AACjC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,qCAAoC;AACpC,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yDAAwD;;AAExD;AACA;AACA;AACA;;AAEA;AACA,sGAAqG,mGAAmG;;AAExM;AACA;;AAEA;AACA;AACA;AACA,gCAA+B;AAC/B;AACA,UAAS;AACT,QAAO;AACP,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,yDAAwD;AACxD,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;;AAEA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;AACL;AACA,IAAG;;AAEH;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL,IAAG;AACH,E;;;;;;ACxoBA;;AAEA;;AAEA;AACA,sEAAqE;;AAErE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA,aAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,oBAAmB,iBAAiB;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;;;;;;ACvHA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,sBAAsB;AAClC,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C;AAC3C;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,gBAAe;AACf;AACA,G;;;;;;AC7FA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,wDAAuD;AACvD;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO,IAAI;AACX,MAAK;AACL;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH,E;;;;;;ACxDA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB,mGAAmG;;AAE1H;;AAEA;AACA,cAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA,cAAa,MAAM;AACnB;AACA,KAAI,6BAA6B;AACjC;AACA;;AAEA;AACA,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa,MAAM;AACnB;AACA,6DAA4D;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kBAAiB;AACjB;;AAEA,+DAA8D;;AAE9D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA,aAAY,cAAc;AAC1B,aAAY;AACZ;AACA;AACA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,YAAY;AACxB,aAAY,OAAO;AACnB,cAAa;AACb;AACA;AACA;AACA,kCAAiC;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAiB;AACjB,iBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA,kEAAiE,qGAAqG;AACtK,IAAG;AACH,kCAAiC,2CAA2C;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,6CAA6C;AACzD,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;;AAEA;AACA;AACA,aAAY,EAAE;AACd,aAAY;AACZ;AACA;AACA;;AAEA;AACA,mBAAkB;AAClB;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA,+BAA8B;AAC9B,mCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA,qCAAoC;;AAEpC,0EAAyE;AACzE,6EAA4E;AAC5E;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA,4CAA2C,6BAA6B;AACxE;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,gDAAgD;AAC/D;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA,oBAAmB;AACnB;AACA,IAAG,IAAI;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA,oBAAmB;AACnB,IAAG;;AAEH;AACA,E;;;;;;AC3fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,MAAK;AACL;AACA","file":"elegant-api.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"elegantApi\"] = factory();\n\telse\n\t\troot[\"elegantApi\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 678be99b434414b55674\n **/","'use strict';\n\nvar util = require('./libs/util');\nvar ElegantApi = require('./ElegantApi');\n\nmodule.exports = function (httpOptions, mockOptions) {\n var ea = new ElegantApi(httpOptions, mockOptions);\n var result = {};\n\n util.objectKeys(ea.routes).forEach(function (key) {\n result[key] = function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return ea.request.apply(ea, [key].concat(args));\n };\n });\n\n result.$ea = ea;\n result.$request = function () {\n return ea.request.apply(ea, arguments);\n };\n result.$r = result.$resource = function (key) {\n var res = ea.resources[key];\n return res ? Object.keys(res).reduce(function (result, key) {\n var val = res[key].defaultValue;\n result[key] = val === undefined ? null : val;\n return result;\n }, {}) : {};\n };\n\n result.$cache = function (cache) {\n var ref = cache || ea.globals;\n var cacheMap = ref.cacheMap;\n var cacheStack = ref.cacheStack;\n\n if (!cache) {\n return { cacheMap: cacheMap, cacheStack: cacheStack };\n } else {\n if (cacheMap && cacheStack) {\n ea.globals.cacheMap = cacheMap;\n ea.globals.cacheStack = cacheStack;\n }\n }\n };\n\n return result;\n};\n\nmodule.exports.ElegantApi = ElegantApi;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/index.jsx\n ** module id = 0\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports.emptyFunction = emptyFunction;\nexports.objectKeys = objectKeys;\nexports.toString = toString;\nexports.isObject = isObject;\nexports.isArray = isArray;\nexports.objectify = objectify;\nexports.each = each;\nexports.mapObject = mapObject;\nexports.deepClone = deepClone;\nexports.omit = omit;\nexports.extend = extend;\nexports.buildQuery = buildQuery;\nexports.urlNormalize = urlNormalize;\nexports.appendQuery = appendQuery;\nvar isServer = exports.isServer = typeof window === 'undefined';\n\n/**\n * 只是一个空函数,什么也不做\n */\nfunction emptyFunction() {}\n\n/**\n * 获取对象中的 keys,兼容 IE 7/8\n *\n * @param {Object} obj\n * @return {Array}\n */\nfunction objectKeys(obj) {\n return obj ? Object.keys(obj) : [];\n}\n\n/**\n * 调用 Object 原型链上的 toString 方法来获取任意变量的原生的 string 形式\n * @param {*} o 任意变量\n * @return {String}\n */\nfunction toString(o) {\n return Object.prototype.toString.call(o);\n}\n\n/**\n * 判断某一变量是否是一个 Object\n * @param {*} o\n * @return {Boolean}\n */\nfunction isObject(o) {\n return toString(o) === '[object Object]';\n}\n\n/**\n * 判断某一变量是否是一个 Array\n * @param {*} o\n * @return {Boolean}\n */\nfunction isArray(o) {\n return Array.isArray(o);\n}\n\n/**\n * 确保变量是一个 Object,如果不是,则返回空 Object\n * @param {*} o\n * @return {Boolean}\n */\nfunction objectify(o) {\n return isObject(o) ? o : {};\n}\n\n/**\n * 遍历对象或数组,如果是其它数据类型,直接忽略\n * @param {Object|Array|*} obj\n * @param {Function} cb\n */\nfunction each(obj, cb) {\n if (isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n cb(obj[i], i, obj);\n }\n } else if (isObject(obj)) {\n objectKeys(obj).forEach(function (key) {\n return cb(obj[key], key, obj);\n });\n }\n}\n\n/**\n * 将一个对象转化成另一个对象,keys 不变\n * @param {Object} obj\n * @param {Function} fn - 遍历函数,参数是 (item, key, obj)\n * @return {Object}\n */\nfunction mapObject(obj, fn) {\n return objectKeys(obj).reduce(function (result, key) {\n result[key] = fn(obj[key], key, obj);\n return result;\n }, {});\n}\n\n/**\n * 深度克隆任意参数,主要针对于 Object|Array 和基本数据类型\n * @param {Object|Array|Number|String|Boolean} obj\n * @return {Object|Array|Number|String|Boolean}\n */\nfunction deepClone(obj) {\n var result = undefined;\n if (isObject(obj)) {\n result = {};\n } else if (Array.isArray(obj)) {\n result = [];\n } else {\n return obj;\n }\n\n each(obj, function (val, key) {\n return result[key] = deepClone(val);\n });\n return result;\n}\n\n/**\n * 从一个对象中忽略指定的 keys, 并将剩下的 keys 组成的一个新的 Object\n * @param {Object} obj\n * @param {Array|String} keys\n * @return {Object}\n */\nfunction omit(obj, keys) {\n keys = [].concat(keys);\n return Object.keys(obj).reduce(function (res, key) {\n if (keys.indexOf(key) < 0) res[key] = obj[key];\n return res;\n }, {});\n}\n\n/**\n * 对象继承\n * @param {Boolean} [deep] 是否深度继承\n * @param {Object} src\n * @param {Object} target...\n * @return {Object}\n */\nfunction extend() {\n var deep = false,\n args = [].slice.call(arguments);\n if (typeof args[0] === 'boolean') deep = args.shift();\n\n var src = args.shift() || {},\n target = undefined;\n\n for (var i = 0; i < args.length; i++) {\n target = args[i];\n\n if (!isObject(target) && !isArray(target)) continue;\n\n if (toString(src) !== toString(target)) {\n src = deepClone(target);\n } else {\n /*eslint-disable */\n each(target, function (val, key) {\n if (deep && (isObject(val) || isArray(val))) {\n src[key] = extend(deep, src[key], val);\n } else {\n src[key] = val;\n }\n });\n /*eslint-enable */\n }\n }\n\n return src;\n}\n\n/**\n * 将对象转化成 url 的 query string\n * @param {Object} query\n * @return {String}\n */\nfunction buildQuery(query) {\n var params = [];\n params.add = function (key, value) {\n if (value == null) value = '';\n this.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n };\n _serialize(params, query);\n return params.join('&');\n}\n\nfunction _serialize(params, obj, scope) {\n var array = isArray(obj),\n plain = isObject(obj),\n hash = undefined;\n\n each(obj, function (value, key) {\n hash = isObject(value) || isArray(value);\n\n if (scope) key = scope + '[' + (plain || hash ? key : '') + ']';\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 * 更正 url:主要就是去除多余的 /\n * @param {String} url\n * @return {String}\n */\nfunction urlNormalize(url) {\n return url.replace(/(?:[^:])\\/\\//g, '\\/');\n}\n\n/**\n * 给 URL 添加 query 字符串\n * @param {String} url\n * @param {String} query\n * @return {String}\n */\nfunction appendQuery(url, query) {\n if (query === '') return url;\n var parts = url.split('#');\n return (parts[0] + '&' + query).replace(/[&?]{1,2}/, '?') + (parts.length === 2 ? '#' + parts[1] : '');\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/util.jsx\n ** module id = 1\n ** module chunks = 0\n **/","'use strict';\n\nvar _namingTransform = require('naming-transform');\n\nvar _namingTransform2 = _interopRequireDefault(_namingTransform);\n\nvar _defaultOptions = require('./libs/defaultOptions');\n\nvar _defaultOptions2 = _interopRequireDefault(_defaultOptions);\n\nvar _mockHelper = require('./libs/mockHelper');\n\nvar _Formater = require('./libs/Formater');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar util = require('./libs/util');\nvar mockResponse = require('../plugins/mock');\n\nvar STORAGE = undefined;\ntry {\n // IE 8 下直接调用 window.localStorage 会报错\n localStorage.setItem('_ea', '_ea');\n localStorage.removeItem('_ea');\n STORAGE = localStorage;\n} catch (e) {\n STORAGE = {};\n}\n\nfunction debug(condition) {\n /* istanbul ignore next */\n if (condition && __DEBUG__ && console.debug) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n console.debug.apply(console, args);\n }\n}\n\n/**\n * @class ElegantApi\n */\nmodule.exports = (function () {\n function ElegantApi(options, mockOptions) {\n var _this = this;\n\n _classCallCheck(this, ElegantApi);\n\n var rootOptions = util.extend(true, {}, _defaultOptions2[\"default\"], options);\n\n var _rootOptions = rootOptions;\n var globals = _rootOptions.globals;\n var routes = _rootOptions.routes;\n var resources = _rootOptions.resources;\n var mocks = _rootOptions.mocks;\n\n delete rootOptions.globals;\n delete rootOptions.routes;\n delete rootOptions.resources;\n delete rootOptions.mocks;\n\n rootOptions = (0, _Formater.formatRootOptions)(rootOptions);\n\n this.globals = globals;\n this.mocks = mockOptions || mocks;\n // 支持用户只写 mocks 而不写 routes 的情况\n util.each(this.mocks, function (mock, key) {\n if (!(key in routes && key !== '$default')) routes[key] = {};\n });\n (0, _mockHelper.mixin)(this.mocks);\n\n this.routes = util.mapObject(routes, function (route, key) {\n return (0, _Formater.formatInitialRoute)(key, util.objectify(route), rootOptions);\n });\n this.resources = util.mapObject(resources, _Formater.formatResource);\n this.responseResources = util.mapObject(this.resources, _Formater.reverseResource);\n\n this.apis = {};\n\n // removeCache 之后会将 routeName 写入此对象中,\n // 这样下将再请求此 routeName 时,就会自动在 url 上加上个随机参数(可以避免 IE 6/7 的 GET 缓存)\n this._needReloadRouteNameMap = {};\n\n util.each(this.routes, function (route) {\n return _this.apis[route.name] = _this._generateApi(route);\n });\n\n debug(true, 'You are using a debug version of elegant-api, ' + 'you can switch to production version by using elegant-api.min.js');\n }\n\n // 下面几个以 _apply 全是 _transform 相关的函数\n\n ElegantApi.prototype._apply = function _apply(source, config, type) {\n var _this2 = this;\n\n var order = config.order || ['resource', 'alias', 'computed', 'drop', 'map', 'naming'];\n order.forEach(function (key) {\n var fnKey = '_apply' + key.charAt(0).toUpperCase() + key.slice(1);\n\n if (fnKey in _this2) {\n source = _this2[fnKey](source, config[key], type);\n }\n });\n return source;\n };\n\n ElegantApi.prototype._applyResource = function _applyResource(source, config, type) {\n var _this3 = this;\n\n if (!config) return source;\n\n var map = util.objectKeys(config).reduce(function (map, rKey) {\n var resource = _this3.resources[rKey];\n var paths = [].concat(config[rKey]);\n if (!resource) throw new Error('Resource ' + rKey + ' not exists.');\n\n paths.forEach(function (path) {\n resolveRefs(source, path).forEach(function (ref) {\n if (util.isObject(ref)) _this3['_' + type + 'Resource'](ref, resource, rKey);\n });\n });\n return map;\n }, {});\n return source;\n };\n\n // 不需要返回,obj 是引用\n\n ElegantApi.prototype._requestResource = function _requestResource(obj, resource) {\n var removes = [];\n util.each(resource, function (conf, key) {\n var oldVal = obj[key];\n var aliasKey = key;\n\n if (conf.alias && conf.alias !== key) {\n removes.push(key);\n aliasKey = conf.alias;\n }\n\n if (oldVal === undefined) oldVal = conf.defaultValue;\n\n obj[aliasKey] = conf.write ? conf.write.call(obj, oldVal) : oldVal;\n });\n\n util.each(removes, function (key) {\n return delete obj[key];\n });\n };\n\n ElegantApi.prototype._responseResource = function _responseResource(obj, resource, resourceKey) {\n resource = this.responseResources[resourceKey];\n this._requestResource(obj, resource);\n };\n\n ElegantApi.prototype._applyAlias = function _applyAlias(source, rules) {\n walk(source, rules, function (ref, path, last, ruleValue) {\n if (typeof ruleValue !== 'string') throw new SyntaxError('Expect string value for alias.');\n if (last in ref) {\n ref[ruleValue] = ref[last];\n delete ref[last];\n }\n });\n return source;\n };\n\n ElegantApi.prototype._applyComputed = function _applyComputed(source, rules) {\n walk(source, rules, function (ref, path, last, ruleValue) {\n if (typeof ruleValue !== 'function') throw new SyntaxError('Expect function value for computed.');\n ref[last] = ruleValue.call(ref, ref, source);\n });\n return source;\n };\n\n ElegantApi.prototype._applyDrop = function _applyDrop(source, rules) {\n var _rules;\n\n if (typeof rules === 'string') rules = (_rules = {}, _rules[rules] = true, _rules);else if (util.isArray(rules)) rules = rules.reduce(function (r, k) {\n r[k] = true;return r;\n }, {});\n // @TODO 可能是一个含有数组的对象\n if (util.isObject(rules)) {\n walk(source, rules, function (ref, path, last) {\n /* istanbul ignore else */\n if (last in ref) delete ref[last];\n });\n }\n return source;\n };\n\n ElegantApi.prototype._applyMap = function _applyMap(source, mapFn) {\n return typeof mapFn === 'function' ? mapFn(source) : source;\n };\n\n ElegantApi.prototype._applyNaming = function _applyNaming(source, config) {\n if (typeof config === 'string') config = { 'case': config };\n if (!util.isObject(config)) return source;\n config.naming = config['case'];\n return (0, _namingTransform2[\"default\"])(source, config);\n };\n\n /**\n * 中间件:判断是否需要使用缓存\n * @param {Object} route\n * @param {Function} cb\n * @return {Function}\n * @private\n */\n\n ElegantApi.prototype._cache = function _cache(route, cb) {\n var _this4 = this;\n\n var cache = this._getCache(route);\n if (cache.exists) {\n cb(null, cache.value);\n return false;\n } else {\n return function (err, data) {\n if (!err) {\n _this4._setCache(route, data);\n }\n cb(err, data);\n };\n }\n };\n\n /**\n * 删除指定的 routeNames 上的缓存\n * @param {String|Array} routeNames\n */\n\n ElegantApi.prototype.removeCache = function removeCache(routeNames) {\n var _this5 = this;\n\n if (!routeNames) return false;\n\n var _globals = this.globals;\n var cacheMap = _globals.cacheMap;\n var cacheStack = _globals.cacheStack;\n\n var keys = [].concat(routeNames);\n\n keys.forEach(function (k) {\n _this5._needReloadRouteNameMap[k] = true;\n delete cacheMap[k];\n });\n this.globals.cacheStack = cacheStack.filter(function (c) {\n return keys.indexOf(c[0]) < 0;\n });\n };\n\n ElegantApi.prototype._getCache = function _getCache(route) {\n var _globals2 = this.globals;\n var cacheMap = _globals2.cacheMap;\n var cacheStack = _globals2.cacheStack;\n var name = route.name;\n var http = route.http;var key = undefined;\n\n var exists = false,\n value = null,\n data = undefined;\n\n if (name in cacheMap) {\n cacheMap = cacheMap[name];\n key = JSON.stringify([http.params, http.query]);\n exists = key in cacheMap;\n data = cacheMap[key] || {};\n var expire = data.expire;\n if (expire !== 0 && expire < +new Date()) {\n exists = false;\n\n // 删除缓存中的数据\n delete cacheMap[key];\n for (var i = 0; i < cacheStack.length; i++) {\n if (cacheStack[i][0] === name && cacheStack[i][1] === key) {\n cacheStack.splice(i, 1);\n break;\n }\n }\n } else {\n value = data.value;\n }\n }\n\n debug(route.mock.debug, 'EA:(cache) check %s %o, %sexists!', name, { key: key, keys: util.objectKeys(cacheMap) }, exists ? '' : 'not ');\n\n return { exists: exists, value: value };\n };\n\n ElegantApi.prototype._setCache = function _setCache(route, value) {\n var _globals3 = this.globals;\n var cacheSize = _globals3.cacheSize;\n var cacheMap = _globals3.cacheMap;\n var cacheStack = _globals3.cacheStack;\n var name = route.name;\n var http = route.http;\n\n var ref = cacheMap[name] || {},\n key = JSON.stringify([http.params, util.omit(http.query, ['__ea', '__eaData'])]);\n\n debug(route.mock.debug, 'EA:(cache) set %s %o', name, { key: key, cacheMap: cacheMap });\n\n var expire = route.cache.expireSeconds * 1000;\n if (expire > 0) expire += +new Date();\n ref[key] = { value: value, expire: expire };\n cacheMap[name] = ref;\n cacheStack.push([name, key]);\n\n if (cacheSize > 0 && cacheStack.length > cacheSize) {\n var _cacheStack$shift = cacheStack.shift();\n\n var n = _cacheStack$shift[0];\n var k = _cacheStack$shift[1];\n\n cacheMap[n] && delete cacheMap[n][k];\n }\n };\n\n /**\n * 中间件:对 request 的 data 和 response 的 data 进行转化\n * @param {Object} route\n * @param {Function} cb\n * @return {Function}\n * @private\n */\n\n ElegantApi.prototype._transform = function _transform(route, cb) {\n var _this6 = this;\n\n var http = route.http;\n http.data = this._apply(http.data, route.request, 'request');\n\n return function (err, data) {\n if (err) return cb(err, data);\n try {\n // 要深拷贝,防止用户修改返回的数据\n data = _this6._apply(util.deepClone(data), route.response, 'response');\n _this6.removeCache(route.removeCache);\n cb(err, data);\n } catch (err) {\n cb(err);\n }\n };\n };\n\n /**\n * 对 http 对象进行处理\n * @param {Object} route\n * @private\n */\n\n ElegantApi.prototype._emulate = function _emulate(route) {\n var mock = route.mock;\n var http = route.http;\n var name = route.name;\n\n var qs = util.buildQuery(http.query);\n http.url = util.appendQuery(http.path, qs);\n\n if (!route.cache.enable || this._needReloadRouteNameMap[name]) {\n http.url = util.appendQuery(http.url, this.globals.cacheQueryKey + '=' + new Date().getTime());\n delete this._needReloadRouteNameMap[name];\n }\n\n if (mock.server && !/^https?:\\/\\//.test(http.url)) {\n http.crossOrigin = true;\n http.url = util.urlNormalize((mock.server === 'self' ? '' : mock.server) + http.url);\n }\n\n if (route.emulateHTTP && !http.crossOrigin && /^(PUT|PATCH|DELETE)$/.test(http.method)) {\n http.headers['X-HTTP-Method-Override'] = http.method;\n http.method = 'POST';\n }\n\n if (route.emulateJSON) {\n http.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n http.data = util.buildQuery(http.data);\n }\n };\n\n ElegantApi.prototype._generateApi = function _generateApi(initRoute) {\n var _this7 = this;\n\n return function (userArgs, userRoute, cb) {\n var route = undefined;\n // 返回的是一个全新的 route,其中 route.http.{path, params, query, data} 都是计算后的\n try {\n route = (0, _Formater.formatRealtimeRoute)(initRoute, userArgs, userRoute);\n } catch (e) {\n return cb(e);\n }\n\n var _route = route;\n var mock = _route.mock;\n var http = _route.http;\n var dataTransformMethod = _route.dataTransformMethod;\n\n cb = _this7._transform(route, cb);\n\n // cache\n if (route.cache.enable) {\n cb = _this7._cache(route, cb);\n if (cb === false) return false; // 说明直接使用了缓存的数据\n }\n // 下面的步骤不能对 query 和 params 处理,否则会影响 cache, (__ea 和 __eaData 参数除外)\n\n http.body = http.data = (0, _Formater.decodeUserData)(http.data);\n var transformData = _this7._generateApiTransformData(route);\n\n if (!mock.disabled && !mock.memory) {\n transformData = JSON.stringify(transformData);\n http.query.__ea = route.name;\n\n // cookie 不支持跨域,但在 karma 上只能测试到跨域\n if ((!mock.server || mock.server === 'self') && dataTransformMethod === 'cookie' && !util.isServer) {\n var now = new Date();\n now.setTime(now.getTime() + 5000);\n var cookie = '__ea' + route.name + '=' + encodeURIComponent(transformData) + '; expires=' + now.toUTCString() + '; path=/';\n\n debug(mock.debug, 'EA:(request) write cookie %o', cookie);\n\n document.cookie = cookie;\n } else {\n http.query.__eaData = transformData;\n }\n }\n\n _this7._emulate(route);\n _this7._response(route, transformData, cb);\n };\n };\n\n ElegantApi.prototype._response = function _response(route, transformData, cb) {\n var _this8 = this;\n\n var mock = route.mock;\n var http = route.http;\n\n debug(mock.debug, 'EA:(response) route: %o, transformData %o', route, transformData);\n\n var memoryHandle = function memoryHandle() {\n mockResponse(_this8.mocks, route.name, transformData, function (error, data) {\n route.handle({ http: http, error: error, data: data }, cb);\n });\n };\n\n if (mock.memory) {\n // 如果是 0,说明用户不想要异步,这样可以快速得到数据\n if (mock.delay === 0) {\n memoryHandle();\n } else {\n setTimeout(memoryHandle, mock.delay);\n }\n } else {\n route.handle({ http: http }, cb);\n }\n };\n\n ElegantApi.prototype._generateApiTransformData = function _generateApiTransformData(route) {\n var ea = STORAGE.__ea ? JSON.parse(STORAGE.__ea) : {};\n\n var prefix = this.globals.eaQueryPrefix;\n var http = route.http;\n\n var search = '';\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV === 'test') {\n search = route.__search || ''; // only for test\n } else if (!util.isServer) {\n search = location.search.slice(1);\n }\n\n search.split('&').reduce(function (ea, pair) {\n var _pair$split$map = pair.split('=').map(decodeURIComponent);\n\n var key = _pair$split$map[0];\n var value = _pair$split$map[1];\n\n if (key !== prefix && key.indexOf(prefix) === 0) ea[key.substr(prefix.length)] = value;\n return ea;\n }, ea);\n\n STORAGE.__ea = JSON.stringify(ea);\n\n return {\n mock: route.mock,\n params: http.params,\n query: http.query,\n data: http.data,\n ea: ea\n };\n };\n\n ElegantApi.prototype.request = function request(source, params, config, callback) {\n var _this9 = this;\n\n if (typeof params === 'function') callback = params;else if (typeof config === 'function') callback = config;\n\n // 保证参数类型\n params = util.objectify(params);\n config = util.objectify(config);\n if (typeof callback !== 'function') callback = util.emptyFunction;\n\n var end = function end(callback) {\n if (typeof source === 'string') return _this9._singleRequest(source, params, config, callback);else if (util.isArray(source)) return _this9._batchSeriesRequest(source, params, config, callback);else if (util.isObject(source)) return _this9._batchParallelRequest(source, params, config, callback);\n\n callback(new SyntaxError('Illegal arguments.'));\n };\n\n if (typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n end(function (err, data) {\n if (err) reject(err);else resolve(data);\n callback(err, data);\n });\n });\n } else {\n end(callback);\n }\n };\n\n ElegantApi.prototype._singleRequest = function _singleRequest(key, params, config, callback) {\n if (this.apis[key]) return this.apis[key](params, config, callback);\n callback(new Error('Request key \\'' + key + '\\' not exists.'));\n };\n\n // 应该废弃? 可以使用 Promise.then\n\n ElegantApi.prototype._batchSeriesRequest = function _batchSeriesRequest(arr, conf, config, callback) {\n var _this10 = this;\n\n var index = 0;\n\n var lastError = null,\n lastData = null;\n var iterator = conf.iterator /* istanbul ignore next */ || util.emptyFunction;\n var iteratorResult = undefined;\n\n var next = function next() {\n var key = arr[index++];\n if (key) {\n iteratorResult = iterator(key, index - 1, lastError, lastData);\n if (iteratorResult === false) return callback(lastError, lastData);\n\n _this10.request(key, iteratorResult, config[key], function (err, data) {\n lastError = err;\n lastData = data;\n next();\n });\n } else {\n callback(lastError, lastData);\n }\n };\n\n next();\n };\n\n // 应该废弃? 可以使用 Promise.all\n\n ElegantApi.prototype._batchParallelRequest = function _batchParallelRequest(obj, conf, config, callback) {\n var _this11 = this;\n\n var keys = Object.keys(obj),\n len = keys.length;\n\n var errMap = new Error('MAP_ERROR'),\n dataMap = {},\n hasError = false;\n var iterator = conf.iterator || util.emptyFunction;\n\n keys.forEach(function (key) {\n var params = obj[key];\n var requestKey = conf.alias && conf.alias[key] || key;\n _this11.request(requestKey, params, config[requestKey], function (err, data) {\n len--;\n\n iterator(params, key, err, data);\n\n if (err) {\n hasError = true;\n errMap[key] = err;\n /* istanbul ignore next */\n if (err.message) errMap.message = err.message; // 和 single request 一致,方便统一处理错误\n } else {\n dataMap[key] = data;\n }\n\n if (!len) {\n callback(hasError ? errMap : null, dataMap);\n }\n });\n });\n };\n\n return ElegantApi;\n})();\n\n/**\n * 遍历指定的规则,主要用在 _applyAlias 和 _applyComputed 中\n */\nfunction walkRules(rules, cb, prefix) {\n for (var key in rules) {\n var path = prefix ? prefix + '.' + key : key;\n if (util.isObject(rules[key])) {\n walkRules(rules[key], cb, path);\n } else {\n cb(path, rules[key]);\n }\n }\n}\n\nfunction resolveRefs(source, path) {\n var refs = [source];\n if (!path) return refs;\n\n path.split('.').forEach(function (key) {\n var tmp = [];\n refs.forEach(function (r) {\n /* istanbul ignore else */\n if (r) {\n if (key === '[]' && Array.isArray(r)) {\n tmp = tmp.concat(r);\n } else {\n tmp.push(r[key]);\n }\n }\n });\n refs = tmp;\n });\n\n return refs.filter(function (r) {\n return r;\n });\n}\n\nfunction walk(source, rules, cb) {\n walkRules(util.objectify(rules), function (path, ruleValue) {\n var parts = path.split('.');\n var last = parts.pop();\n path = parts.join('.');\n\n resolveRefs(source, path).forEach(function (ref) {\n return cb(ref, path, last, ruleValue);\n });\n });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/ElegantApi.jsx\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (source) {\n var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref$deep = _ref.deep;\n var deep = _ref$deep === undefined ? 0 : _ref$deep;\n var _ref$naming = _ref.naming;\n var naming = _ref$naming === undefined ? 'camel' : _ref$naming;\n\n if (typeof source === 'string') {\n return transform(source, naming, deep, null);\n }\n return walk(source, deep, naming);\n};\n\n/** Used to match words to create compound words. */\nvar reWords = function () {\n var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]',\n lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n\n return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n}();\n\nfunction wrap(str, fn) {\n return str.match(reWords).reduce(fn, '');\n}\n\nvar transformers = {\n camel: function camel(str) {\n return wrap(str, function (result, word, index) {\n var fn = index ? 'toUpperCase' : 'toLowerCase';\n return result + word.charAt(0)[fn]() + word.slice(1);\n });\n },\n cap: function cap(str) {\n return wrap(str, function (result, word, index) {\n return result + word.charAt(0).toUpperCase() + word.slice(1);\n });\n },\n kebab: function kebab(str) {\n return wrap(str, function (result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n },\n snake: function snake(str) {\n return wrap(str, function (result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n }\n};\n\nvar camel = transformers.camel;\nvar cap = transformers.cap;\nvar kebab = transformers.kebab;\nvar snake = transformers.snake;\nexports.camel = camel;\nexports.cap = cap;\nexports.kebab = kebab;\nexports.snake = snake;\n\n/**\n *\n * 将 source 中的 Object 的 keys 的命名风格全部转换成指定的 naming 命名风格\n *\n * @param {Object} source 要处理的对象\n * @param {Number} [options.deep = 0] 处理的深度\n *\n * @param {String|Function} [options.naming = 'camel']\n * 命名风格,支持 camel, cap, kebab, snake,或自定义方法\n *\n * 如果指定了函数,函数得到的参数会是 (key, deep, currentObject),函数需要返回 newKey\n * 如果函数返回 false,则忽略更新此时的 key,\n *\n * @return {Object} 转化后的对象,原对象不会被破坏\n */\n\nfunction walk(node, deep, naming) {\n var result = node;\n\n if (isObject(node)) {\n result = {};\n for (var key in node) {\n if (node.hasOwnProperty(key)) {\n result[transform(key, naming, deep, node)] = deep === 1 ? node[key] : walk(node[key], deep > 1 ? deep - 1 : deep, naming);\n }\n }\n } else if (isArray(node)) {\n result = [];\n for (var i = 0; i < node.length; i++) {\n result.push(walk(node[i], deep, naming));\n }\n }\n\n return result;\n}\n\nfunction transform(key, naming, deep, currentObject) {\n if (typeof naming === 'string' && naming in transformers) {\n return transformers[naming](key);\n } else if (typeof naming === 'function') {\n var newKey = naming(key, deep, currentObject);\n if (!newKey) return key;\n if (typeof newKey === 'string') return newKey;\n throw new Error('Transform naming function should return a valid string value!');\n }\n throw new Error('Not supported transform naming type, only support `string` and `function`');\n}\n\nfunction getType(target) {\n return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();\n}\nfunction isArray(target) {\n return getType(target) === 'array';\n}\nfunction isObject(target) {\n return getType(target) === 'object';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/naming-transform/build/index.js\n ** module id = 3\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports[\"default\"] = {\n debug: false, // 开启调试模式\n base: '', // 指定基准路径,这样在单独的 route 中只要指定不同的部分即可\n path: '',\n // query: 'a=:aa&b=', // 需要参数 `aa` and `b`\n // data: 'c&d=&e=eee', // 需要参数 `d`,参数 `c` 是可选的,参数 `e` 的默认值是 \"eee\"\n\n // 来自于 vue-resource\n emulateJSON: false,\n emulateHTTP: false,\n\n // 只有 GET 请求才会缓存,另外可以单独在 route 中指定 true 或者 false\n // 也可以设置成对象的形式: { enable: 'smart'/true/false, expireSeconds: number }\n cache: 'smart',\n\n mock: {\n // disabled: false, // 是否禁用 mock\n memory: true, // 是否使用缓存来 mock\n\n // 指定独立的 mock 服务器, e.g: http://domain.com/\n // 需要指定 memory 为 false,另外其值可以指定为 'self',表示使用当前域名)\n server: null,\n proxy: null, // 指定代理的服务器(不推荐使用,需要 memory 为 false)\n delay: { min: 200, max: 1000 } // 或者指定为一个具体的数字\n },\n dataTransformMethod: 'query', // query/cookie cookie 只能用在没有独立的 mock server 的情况下,因为 cookie 无法跨域\n\n // 这里的设置不会被单独的 route 覆盖\n globals: {\n eaQueryPrefix: '__',\n cacheQueryKey: '_t', // 如果声明了 cache 为 false,则会在 url 上带上此参数,其值是当前的时间的毫秒数\n cacheSize: 100,\n cacheMap: {},\n cacheStack: []\n },\n\n http: {\n method: 'GET',\n crossOrigin: false,\n credentials: 'same-origin', // fetch 函数需要使用的参数\n dataType: 'json',\n // url: null, // url 不用设置,会根据配置自动生成合适的值\n // body: null, // fetch api 标准是用 body\n data: null, // 而 jquery 用的是 data,这里兼容两者,设置的时候只需要设置 data 就行,系统会自动同步数据到 body\n headers: {\n // 'Content-Type': 'application/json;charset=utf-8',\n // 'Content-Type': 'application/x-www-form-urlencoded',\n }\n },\n\n request: {\n naming: null\n // 数组也会 extend,所以没有在这里定义,而是写在函数中\n // order: ['resource', 'alias', 'computed', 'drop', 'map', 'naming']\n },\n\n response: {\n naming: {\n 'case': 'camel', // 命名风格,可以为 camel/kebab/snake/cap 或自己实现,即指定一个 function\n deep: 0 // deep 默认就是 0,忽略此参数时,可以直接写成 naming: 'camel'\n }\n },\n\n // 可能需要实现的一个方法,默认是调用 jquery 中的 ajax 方法的\n handle: function handle(target, callback) {\n if (this.mock.memory) return callback(target.error, target.data);\n\n var ajax = window.jQuery && window.jQuery.ajax;\n if (ajax) {\n return ajax(target.http).success(function (data) {\n return callback(null, data);\n }).error(function (xhr) {\n return callback(xhr);\n });\n }\n\n throw new Error('Need implement handler function in options');\n },\n\n mocks: {\n /* 全局默认的 mock\n $default: {\n status: 0\n data: null\n message: ''\n }\n */\n },\n resources: {},\n routes: {}\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/defaultOptions.jsx\n ** module id = 4\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports.mixin = mixin;\n\nvar _util = require('./util');\n\nfunction mixin(context) {\n\n context.$objectify = function (target, key) {\n return promisify(context, key, target, true);\n };\n\n context.$objectifyAll = function (target, keys) {\n return Promise.all([].concat(keys).map(function (key) {\n return context.$objectify(target, key);\n }));\n };\n\n context.$fetch = function (target, key, conf) {\n if (conf && conf.body) {\n conf.data = conf.body;\n delete conf.body;\n }\n return promisify(context, key, (0, _util.extend)({}, target, conf));\n };\n\n context.$fetchAll = function (target, obj) {\n var keys = (0, _util.objectKeys)(obj);\n\n return Promise.all(keys.map(function (key) {\n return context.$fetch(target, key, obj[key]);\n })).then(function (list) {\n return Promise.resolve(keys.reduce(function (all, key, index) {\n all[key] = list[index];\n return all;\n }, {}));\n });\n };\n} // 依赖于 Promise\n\nfunction promisify(context, key, target, save) {\n return new Promise(function (resolve, reject) {\n if (typeof context[key] !== 'function') {\n return resolve(context[key]);\n }\n\n context[key](target, function (err, data) {\n if (err) {\n reject(err);\n } else {\n if (save) context[key] = data;\n resolve(data);\n }\n });\n });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/mockHelper.jsx\n ** module id = 5\n ** module chunks = 0\n **/","'use strict';\n\nexports.__esModule = true;\nexports.formatRootOptions = formatRootOptions;\nexports.formatInitialRoute = formatInitialRoute;\nexports.encodeUserData = encodeUserData;\nexports.decodeUserData = decodeUserData;\nexports.formatRealtimeRoute = formatRealtimeRoute;\nexports.formatResource = formatResource;\nexports.reverseResource = reverseResource;\n\nfunction _typeof(obj) { return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; }\n\nvar util = require('./util');\n\n/**\n * @typedef {Array} SUPPORT_RESOURCE_TYPES\n *\n * 可以设置在 resource.type 中的类型\n */\nvar SUPPORT_RESOURCE_TYPES = [Number, String, Boolean];\n\n/**\n * @typedef {Array} SUPPORT_RESOURCE_TYPE_VALUES\n *\n * {@link SUPPORT_RESOURCE_TYPES} 对应的默认值\n */\nvar SUPPORT_RESOURCE_TYPE_VALUES = [0, '', false];\n\n/**\n * @typedef {Array} SMART_CACHE_HTTP_METHODS\n *\n * 如果指定 cache 为 \"smart\" 时,当 http method 为此字段中之一时,\n * 会自动将 cache 设置为 true,否则设置为 false\n */\nvar SMART_CACHE_HTTP_METHODS = ['GET', 'HEAD'];\n\n/**\n * @typedef {Array} NO_DATA_HTTP_METHODS\n *\n * 当 http method 为下面字段之一时, http requres 的内容应该为空,即 `data = {}`\n */\nvar NO_BODY_CONTENT_HTTP_METHODS = ['GET', 'HEAD'];\n\n/**\n * 当用 JSON 提交数据时,用户可以提交任何格式的数据,而不是 Object\n * 但此框架设计时候只考虑了 Object,所以为了支持这种格式,需要将这些变化\n * 的数据转化成 Object,所以需要一个 key 来识别\n *\n * @type {String}\n */\nvar USER_DATA_RAW_KEY = '__raw_data_v1';\n\n/**\n * 解析像 url query 那样的字符串\n * @param {String} target\n * @return {Object}\n * @example\n * \"fo=:foo&bar=&version=1\" =>\n *\n * {\n * fo: {\n * required: true,\n * alias: \"foo\"\n * },\n * bar: {\n * required: true\n * },\n * version: {\n * value: '1'\n * }\n * }\n *\n * @private\n */\nfunction formatQueryString(target) {\n if (util.isObject(target)) return target;\n if (typeof target !== 'string') return {};\n\n return target.split('&').reduce(function (result, qs) {\n var _qs$split$map = qs.split('=').map(decodeURIComponent);\n\n var key = _qs$split$map[0];\n var val = _qs$split$map[1];\n\n var conf = {},\n alias = undefined;\n\n if (val && val[0] === ':' && val[1]) alias = val.slice(1);else if (val) conf.value = val;\n\n if (val === '' || alias) conf.required = true;\n\n if (alias) {\n conf.alias = key;\n key = alias;\n }\n\n result[key] = conf;\n return result;\n }, {});\n}\n\n/**\n * 格式化配置中的 http 选项\n * @private\n */\nfunction formatRouteHttpOption(route) {\n // 将 route 中的属性 copy 到 route.http 中(只 copy route.http 中支持的 keys)\n var http = route.http;\n\n for (var key in http) {\n if (key in route) http[key] = route[key];\n }\n\n http.path = util.urlNormalize(route.base + route.path);\n http.method = http.method.toUpperCase();\n\n return route.http;\n}\n\n/**\n * 格式化配置中的 mock 选项\n * @private\n */\nfunction formatRouteMockOption(route) {\n var mock = route.mock;\n\n if (!util.isObject(mock)) {\n mock = route.mock = { disabled: !mock };\n }\n\n // debug\n if (!('debug' in mock)) mock.debug = route.debug;\n\n if (mock.disabled) {\n delete mock.memory;\n }\n if (mock.disabled || mock.memory) {\n delete mock.server;\n delete mock.proxy;\n }\n\n return route.mock;\n}\n\n/**\n * 格式化配置中的 cache 选项\n * @private\n */\nfunction formatRouteCacheOption(route) {\n var cache = route.cache,\n enable = undefined,\n expireSeconds = 0;\n\n if (!util.isObject(cache)) {\n enable = cache;\n } else {\n enable = cache.enable;\n expireSeconds = cache.expireSeconds || 0;\n }\n\n enable = enable === 'smart' && SMART_CACHE_HTTP_METHODS.indexOf(route.http.method) >= 0 || enable === true;\n\n if (expireSeconds < 0) enable = false;\n\n route.cache = { enable: enable, expireSeconds: expireSeconds };\n\n return route.cache;\n}\n\n/**\n * 对用户提供的 rootOptions 格式化\n * @param {Object} rootOptions 用户配置(不应该包括 routes/resorces/mocks/globals\n * @return {Object} 返回格式化之后的 rootOptions(这个 rootOptions 和原 rootOptions 是同一个)\n */\nfunction formatRootOptions(rootOptions) {\n rootOptions.query = formatQueryString(rootOptions.query);\n rootOptions.data = formatQueryString(rootOptions.data);\n\n return rootOptions;\n}\n\n/**\n * 在用户还没有使用 request(routeKey, userArgs, callback) 之前,对 route 进行一些基本的格式化\n * @param {String} routeKey\n * @param {Object} route\n * @param {Object} formatedRootOptions\n * @return {Object} 返回格式化之后的 route(这个 route 是原 route 的一个深拷贝)\n */\nfunction formatInitialRoute(routeKey, route, formatedRootOptions) {\n if (!route.name) route.name = routeKey;\n route.query = formatQueryString(route.query);\n route.data = formatQueryString(route.data);\n\n // 创建一个全新的 route,不要污染原有的\n route = util.extend(true, {}, formatedRootOptions, route);\n\n formatRouteHttpOption(route);\n formatRouteMockOption(route);\n formatRouteCacheOption(route);\n\n return route;\n}\n\n/**\n * 获取 path 中的变量,如 /api/user/:uid,就会返回 [\"uid\"]\n * @param {String} path - url 的路径\n * @return {Array} 此路径中的所有的变量\n * @private\n */\nfunction getParamKeysFromPath(path) {\n var params = [];\n path.replace(/\\/:([-\\w]+)/g, function (r, key) {\n params.push(key);\n });\n return params;\n}\n\n/**\n * 将 path 中的变量替换成真实用户提供的值\n * @param {String} path 带变量的 path\n * @param {Object} params\n * @return {String}\n * @private\n */\nfunction getFullPathFromParams(path, params) {\n return path.replace(/\\/:([-\\w]+)/g, function (r, key) {\n return '/' + params[key];\n });\n}\n\n/**\n * 获取请求延迟的时间\n * @param {Object|Number} delay 用户配置的数据\n * @return {Number}\n */\nfunction getDelayTime(delay) {\n if (util.isObject(delay)) {\n delay = util.extend({ min: 200, max: 3000 }, delay);\n delay = Math.floor(Math.random() * (delay.max - delay.min) + delay.min);\n }\n delay = parseInt(delay, 10);\n return delay && delay > 0 ? delay : 0;\n}\n\n/**\n * 根据现有的 route 信息,来将 userArgs 分成三类:params, query 和 data,三者都应该是 null 或 Object\n * - params 是 url.path 上的参数\n * - query 是 url.search 上的参数\n * - data 是 请求体的内容\n *\n * 用户提供 userArgs 可能是将这三者里的参数合并在一个对象中提供的,所以需要将这些参数拆开,\n * 另外用户也有可能提供一些多余的参数,也需要把这些参数去掉\n *\n * @param {Object|null} userArgs\n * @param {Object} route\n * @return {{params: Object, query: Object, data: Object}}\n * @private\n */\nfunction parseUserArgs(userArgs, route) {\n userArgs = util.extend(true, {}, userArgs);\n var keys = util.objectKeys(userArgs);\n var http = route.http;\n\n var allows = ['params', 'query', 'data'];\n\n var noBodyContent = NO_BODY_CONTENT_HTTP_METHODS.indexOf(http.method) >= 0;\n if (keys.every(function (k) {\n return allows.indexOf(k) >= 0;\n })) {\n if ('data' in userArgs) userArgs.data = encodeUserData(userArgs.data);\n allows.forEach(function (k) {\n return userArgs[k] = util.objectify(userArgs[k]);\n });\n if (noBodyContent) userArgs.data = {};\n return validateParsedUserArgs(userArgs, route);\n }\n\n // query 和 data 可能有 alias 字段\n var queryKeys = util.objectKeys(route.query);\n var paramKeys = getParamKeysFromPath(http.path);\n var params = {},\n query = {},\n data = {};\n\n var rQuery = route.query,\n rData = route.data;\n keys.forEach(function (key) {\n // 注意优先级不能换\n if (paramKeys.indexOf(key) >= 0) params[key] = userArgs[key];else if (queryKeys.indexOf(key) >= 0) query[rQuery[key] && rQuery[key].alias || key] = userArgs[key];else if (!noBodyContent) data[rData[key] && rData[key].alias || key] = userArgs[key];\n });\n return validateParsedUserArgs({ params: params, query: query, data: data }, route);\n}\n\n/**\n * 验证处理后的 userArgs\n *\n * 注意: validate 的时候,也有可能会将配置的默认值赋值到原参数上\n *\n * @param {{params: Object, query: Object, data: Object}} userArgs\n * @param {Object} route\n * @throws\n * @private\n */\nfunction validateParsedUserArgs(userArgs, route) {\n var path = route.http.path;\n var paramKeys = getParamKeysFromPath(path);\n var label = route.name;\n\n // 先验证 params\n paramKeys.forEach(function (k) {\n if (!(k in userArgs.params)) throw new SyntaxError('Route ' + label + ' missing params parameter: ' + k + '.');\n });\n\n // query 和 data 的验证方法是一样的\n ['query', 'data'].forEach(function (key) {\n var ref = userArgs[key];\n var rules = route[key];\n util.each(rules, function (rule, ruleKey) {\n var argKey = rule.alias || ruleKey;\n var argValue = ref[argKey];\n var exists = argKey in ref;\n\n if (rule.required && !exists) throw new SyntaxError('Route ' + label + ' missing ' + key + ' parameter: ' + ruleKey + '.');\n if (rule.validate && exists) {\n if (typeof rule.validate === 'function' && !rule.validate(argValue) || rule.validate instanceof RegExp && !rule.validate.test(argValue)) {\n throw new SyntaxError('Route ' + label + ' ' + key + ' parameter \\'' + argKey + '\\' validate error.');\n }\n }\n\n if ('value' in rule && !exists) ref[argKey] = rule.value;\n });\n });\n\n return userArgs;\n}\n\n/**\n * 对非 Object 的 data 做处理,转化成 Object\n * @param {*} data\n * @return {Object}\n */\nfunction encodeUserData(data) {\n var _ref;\n\n if (util.isObject(data)) return data;\n return _ref = {}, _ref[USER_DATA_RAW_KEY] = data, _ref;\n}\n\n/**\n * 恢复 data\n * @param {Object} data\n * @return {*}\n */\nfunction decodeUserData(data) {\n return USER_DATA_RAW_KEY in data ? data[USER_DATA_RAW_KEY] : data;\n}\n\n/**\n * 在用户调用 request(routeKey, userArgs, callback, userRoute) 时,合成一个全新的 route\n * @param {Object} route\n * @param {Object} userArgs\n * @param {Object} userRoute\n * - http (不支持在 route 外层设置 http 属性)\n * - mock\n * - debug\n * - cache\n *\n * @return {Object}\n */\nfunction formatRealtimeRoute(route, userArgs, userRoute) {\n route = util.extend(true, {}, route);\n userRoute = util.extend(true, {}, userRoute);\n var http = route.http,\n userHttp = userRoute.http || {};\n\n // path, method 需要特殊处理\n if (userHttp.path) userHttp.path = util.urlNormalize(route.base + userHttp.path);\n if (userHttp.method) userHttp.method = userHttp.method.toUpperCase();\n util.extend(true, http, userHttp); // http 用继承\n\n if ('mock' in userRoute) route.mock = formatRouteMockOption(userRoute); // mock 直接覆盖\n if ('cache' in userRoute) route.cache = formatRouteCacheOption(userRoute); // cache 也直接覆盖\n if ('debug' in userRoute) route.mock.debug = userRoute.debug;\n\n var _parseUserArgs = parseUserArgs(userArgs, route);\n\n var params = _parseUserArgs.params;\n var query = _parseUserArgs.query;\n var data = _parseUserArgs.data;\n\n // 保证 query 是字符串\n\n util.each(query, function (val, key, query) {\n return query[key] = String(val);\n });\n\n http.path = getFullPathFromParams(http.path, params);\n http.params = params;\n http.query = query;\n http.data = data;\n\n // 每次都计算,主要是用户可能配置了一个时间范围\n route.mock.delay = route.mock.memory ? getDelayTime(route.mock.delay) : 0;\n\n return route;\n}\n\n/**\n * 对用户配置的 resource 格式化\n *\n * @param {Object} resource 用户对某个 resource 的实体的定义,里面是 key, value 对,其中 value 有以下几种情况\n * - 当为 String 时,把它当作 alias\n * - 当为 Function 时,判断是否在 {@link SUPPORT_RESOURCE_TYPES} 之中,\n * 是的话把它当作 type,否作抛出异常\n * - 当为 Object 时,检查它内部的这些变量\n * `type, alias, defaultValue, read, write`\n * @param {Strint} resourceKey\n * @return {Object}\n *\n * @example\n *\n * user: {\n * uid: Number,\n * username: 'user_name',\n * gender: { type: String, defaultValue: 'M', alias: 'sex' },\n * age: {\n * type: Number,\n * read() {\n * return new Date().getFullYear() - this.age;\n * },\n * write() {\n * this.year = new Date().getFullYear() - this.age;\n * delete this.age\n * }\n * }\n * }\n */\nfunction formatResource(resource, resourceKey) {\n return util.objectKeys(resource).reduce(function (result, key) {\n\n var definition = resource[key],\n definitionType = typeof definition === 'undefined' ? 'undefined' : _typeof(definition);\n\n var type = undefined,\n alias = undefined,\n defaultValue = undefined,\n read = undefined,\n write = undefined;\n\n if (definitionType === 'string') {\n alias = definition;\n } else if (definitionType === 'function') {\n type = definition;\n } else if (definition) {\n type = definition.type;\n alias = definition.alias;\n defaultValue = definition.defaultValue;\n read = definition.read;\n write = definition.write;\n }\n\n var typeIndex = SUPPORT_RESOURCE_TYPES.indexOf(type);\n if (typeIndex >= 0) {\n if (typeof defaultValue === 'undefined') defaultValue = SUPPORT_RESOURCE_TYPE_VALUES[typeIndex];\n } else if (type) {\n throw new Error('Not supported resource type for ' + resourceKey + '.' + key);\n } else {\n type = null;\n }\n\n // TODO 验证 read/write 为 function, alias 为字符串 (当它们不为 null 时)\n\n // read 表示从 response 中读取数据, write 当前写入到 request 中\n result[key] = { type: type, alias: alias, defaultValue: defaultValue, read: read, write: write };\n return result;\n }, {});\n}\n\n/**\n * 将 resource 反转\n *\n * 上面函数返回的值是给 resquest 时用的,此函数返回的是给 response 用的\n */\nfunction reverseResource(resource, resourceKey) {\n var result = {};\n\n util.each(resource, function (config, key) {\n var type = config.type;\n var alias = config.alias;\n var defaultValue = config.defaultValue;\n var read = config.read;\n var write = config.write;\n\n if (alias) {\n ;\n var _ref2 = [alias, key];\n key = _ref2[0];\n alias = _ref2[1];\n }var _ref3 = [write, read];\n read = _ref3[0];\n write = _ref3[1];\n\n result[key] = { type: type, alias: alias, defaultValue: defaultValue, read: read, write: write };\n });\n\n return result;\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/libs/Formater.jsx\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = function (mocks, key, transformData, callback) {\n var mockTarget;\n if (key in mocks || '$default' in mocks) {\n mockTarget = key in mocks ? mocks[key] : mocks.$default;\n transformData.mock.name = key;\n if (typeof mockTarget === 'function') mockTarget.call(mocks, transformData, callback);\n else callback(null, mockTarget);\n } else {\n callback({\n message: 'Not found mock target for `' + key + '`.',\n name: 'ConfigError',\n by: 'ElegantApi'\n });\n }\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./plugins/mock.js\n ** module id = 7\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/elegant-api.min.js b/dist/elegant-api.min.js index f8de5b8..6d75547 100644 --- a/dist/elegant-api.min.js +++ b/dist/elegant-api.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.elegantApi=t():e.elegantApi=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";var n=r(1),o=r(2);e.exports=function(e,t){var r=new o(e,t),a={};return n.objectKeys(r.routes).forEach(function(e){a[e]=function(){for(var t=arguments.length,n=Array(t),o=0;t>o;o++)n[o]=arguments[o];return r.request.apply(r,[e].concat(n))}}),a.$ea=r,a.$request=function(){return r.request.apply(r,arguments)},a.$r=a.$resource=function(e){var t=r.resources[e];return t?Object.keys(t).reduce(function(e,r){var n=t[r].defaultValue;return e[r]=void 0===n?null:n,e},{}):{}},a.$cache=function(e){var t=e||r.globals,n=t.cacheMap,o=t.cacheStack;return e?void(n&&o&&(r.globals.cacheMap=n,r.globals.cacheStack=o)):{cacheMap:n,cacheStack:o}},a},e.exports.ElegantApi=o},function(e,t){"use strict";function r(){}function n(e){return e?Object.keys(e):[]}function o(e){return Object.prototype.toString.call(e)}function a(e){return"[object Object]"===o(e)}function i(e){return Array.isArray(e)}function u(e){return a(e)?e:{}}function c(e,t){if(i(e))for(var r=0;r0&&(l+=+new Date),s[f]={value:t,expire:l},o[u]=s,i.push([u,f]),n>0&&i.length>n){var p=i.shift(),d=p[0],h=p[1];o[d]&&delete o[d][h]}},e.prototype._transform=function(e,t){var r=this,n=e.http;return n.data=this._apply(n.data,e.request,"request"),function(n,o){if(n)return t(n,o);try{o=r._apply(m.deepClone(o),e.response,"response"),r.removeCache(e.removeCache),t(n,o)}catch(n){t(n)}}},e.prototype._emulate=function(e){var t=e.mock,r=e.http,n=e.name,o=m.buildQuery(r.query);r.url=m.appendQuery(r.path,o),(!e.cache.enable||this._needReloadRouteNameMap[n])&&(r.url=m.appendQuery(r.url,this.globals.cacheQueryKey+"="+(new Date).getTime()),delete this._needReloadRouteNameMap[n]),t.server&&!/^https?:\/\//.test(r.url)&&(r.crossOrigin=!0,r.url=m.urlNormalize(("self"===t.server?"":t.server)+r.url)),e.emulateHTTP&&!r.crossOrigin&&/^(PUT|PATCH|DELETE)$/.test(r.method)&&(r.headers["X-HTTP-Method-Override"]=r.method,r.method="POST"),e.emulateJSON&&(r.headers["Content-Type"]="application/x-www-form-urlencoded",r.data=m.buildQuery(r.data))},e.prototype._generateApi=function(e){var t=this;return function(r,n,o){var i=void 0;try{i=(0,h.formatRealtimeRoute)(e,r,n)}catch(u){return o(u)}var c=i,s=c.mock,f=c.http,l=c.dataTransformMethod;if(o=t._transform(i,o),i.cache.enable&&(o=t._cache(i,o),o===!1))return!1;f.body=f.data=(0,h.decodeUserData)(f.data);var p=t._generateApiTransformData(i);if(!s.disabled&&!s.memory)if(p=JSON.stringify(p),f.query.__ea=i.name,s.server&&"self"!==s.server||"cookie"!==l||m.isServer)f.query.__eaData=p;else{var d=new Date;d.setTime(d.getTime()+5e3);var y="__ea"+i.name+"="+encodeURIComponent(p)+"; expires="+d.toUTCString()+"; path=/";a(s.debug,"EA:(request) write cookie %o",y),document.cookie=y}t._emulate(i),t._response(i,p,o)}},e.prototype._response=function(e,t,r){var n=this,o=e.mock,i=e.http;a(o.debug,"EA:(response) route: %o, transformData %o",e,t);var u=function(){y(n.mocks,e.name,t,function(t,n){e.handle({http:i,error:t,data:n},r)})};o.memory?0===o.delay?u():setTimeout(u,o.delay):e.handle({http:i},r)},e.prototype._generateApiTransformData=function(e){var t=v.__ea?JSON.parse(v.__ea):{},r=this.globals.eaQueryPrefix,n=e.http,o="";return m.isServer||(o=location.search.slice(1)),o.split("&").reduce(function(e,t){var n=t.split("=").map(decodeURIComponent),o=n[0],a=n[1];return o!==r&&0===o.indexOf(r)&&(e[o.substr(r.length)]=a),e},t),v.__ea=JSON.stringify(t),{mock:e.mock,params:n.params,query:n.query,data:n.data,ea:t}},e.prototype.request=function(e,t,r,n){var o=this;"function"==typeof t?n=t:"function"==typeof r&&(n=r),t=m.objectify(t),r=m.objectify(r),"function"!=typeof n&&(n=m.emptyFunction);var a=function(n){return"string"==typeof e?o._singleRequest(e,t,r,n):m.isArray(e)?o._batchSeriesRequest(e,t,r,n):m.isObject(e)?o._batchParallelRequest(e,t,r,n):void n(new SyntaxError("Illegal arguments."))};return"undefined"!=typeof Promise?new Promise(function(e,t){a(function(r,o){r?t(r):e(o),n(r,o)})}):void a(n)},e.prototype._singleRequest=function(e,t,r,n){return this.apis[e]?this.apis[e](t,r,n):void n(new Error("Request key '"+e+"' not exists."))},e.prototype._batchSeriesRequest=function(e,t,r,n){var o=this,a=0,i=null,u=null,c=t.iterator||m.emptyFunction,s=void 0,f=function l(){var t=e[a++];if(t){if(s=c(t,a-1,i,u),s===!1)return n(i,u);o.request(t,s,r[t],function(e,t){i=e,u=t,l()})}else n(i,u)};f()},e.prototype._batchParallelRequest=function(e,t,r,n){var o=this,a=Object.keys(e),i=a.length,u=new Error("MAP_ERROR"),c={},s=!1,f=t.iterator||m.emptyFunction;a.forEach(function(a){var l=e[a],p=t.alias&&t.alias[a]||a;o.request(p,l,r[p],function(e,t){i--,f(l,a,e,t),e?(s=!0,u[a]=e,e.message&&(u.message=e.message)):c[a]=t,i||n(s?u:null,c)})})},e}()},function(e,t,r){"use strict";function n(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function o(e){return _.isObject(e)?e:"string"!=typeof e?{}:e.split("&").reduce(function(e,t){var r=t.split("=").map(decodeURIComponent),n=r[0],o=r[1],a={},i=void 0;return o&&":"===o[0]&&o[1]?i=o.slice(1):o&&(a.value=o),(""===o||i)&&(a.required=!0),i&&(a.alias=n,n=i),e[n]=a,e},{})}function a(e){var t=e.http;for(var r in t)r in e&&(t[r]=e[r]);return t.path=_.urlNormalize(e.base+e.path),t.method=t.method.toUpperCase(),e.http}function i(e){var t=e.mock;return _.isObject(t)||(t=e.mock={disabled:!t}),"debug"in t||(t.debug=e.debug),t.disabled&&delete t.memory,(t.disabled||t.memory)&&(delete t.server,delete t.proxy),e.mock}function u(e){var t=e.cache,r=void 0,n=0;return _.isObject(t)?(r=t.enable,n=t.expireSeconds||0):r=t,r="smart"===r&&k.indexOf(e.http.method)>=0||r===!0,0>n&&(r=!1),e.cache={enable:r,expireSeconds:n},e.cache}function c(e){return e.query=o(e.query),e.data=o(e.data),e}function s(e,t,r){return t.name||(t.name=e),t.query=o(t.query),t.data=o(t.data),t=_.extend(!0,{},r,t),a(t),i(t),u(t),t}function f(e){var t=[];return e.replace(/\/:([-\w]+)/g,function(e,r){t.push(r)}),t}function l(e,t){return e.replace(/\/:([-\w]+)/g,function(e,r){return"/"+t[r]})}function p(e){return _.isObject(e)&&(e=_.extend({min:200,max:3e3},e),e=Math.floor(Math.random()*(e.max-e.min)+e.min)),e=parseInt(e,10),e&&e>0?e:0}function d(e,t){e=_.extend(!0,{},e);var r=_.objectKeys(e),n=t.http,o=["params","query","data"],a=j.indexOf(n.method)>=0;if(r.every(function(e){return o.indexOf(e)>=0}))return"data"in e&&(e.data=m(e.data)),o.forEach(function(t){return e[t]=_.objectify(e[t])}),a&&(e.data={}),h(e,t);var i=_.objectKeys(t.query),u=f(n.path),c={},s={},l={},p=t.query,d=t.data;return r.forEach(function(t){u.indexOf(t)>=0?c[t]=e[t]:i.indexOf(t)>=0?s[p[t]&&p[t].alias||t]=e[t]:a||(l[d[t]&&d[t].alias||t]=e[t])}),h({params:c,query:s,data:l},t)}function h(e,t){var r=t.http.path,n=f(r),o=t.name;return n.forEach(function(t){if(!(t in e.params))throw new SyntaxError("Route "+o+" missing params parameter: "+t+".")}),["query","data"].forEach(function(r){var n=e[r],a=t[r];_.each(a,function(e,t){var a=e.alias||t,i=n[a],u=a in n;if(e.required&&!u)throw new SyntaxError("Route "+o+" missing "+r+" parameter: "+t+".");if(e.validate&&u&&("function"==typeof e.validate&&!e.validate(i)||e.validate instanceof RegExp&&!e.validate.test(i)))throw new SyntaxError("Route "+o+" "+r+" parameter '"+a+"' validate error.");"value"in e&&!u&&(n[a]=e.value)})}),e}function m(e){var t;return _.isObject(e)?e:(t={},t[E]=e,t)}function y(e){return E in e?e[E]:e}function v(e,t,r){e=_.extend(!0,{},e),r=_.extend(!0,{},r);var n=e.http,o=r.http||{};o.path&&(o.path=_.urlNormalize(e.base+o.path)),o.method&&(o.method=o.method.toUpperCase()),_.extend(!0,n,o),"mock"in r&&(e.mock=i(r)),"cache"in r&&(e.cache=u(r)),"debug"in r&&(e.mock.debug=r.debug);var a=d(t,e),c=a.params,s=a.query,f=a.data;return _.each(s,function(e,t,r){return r[t]=String(e)}),n.path=l(n.path,c),n.params=c,n.query=s,n.data=f,e.mock.delay=e.mock.memory?p(e.mock.delay):0,e}function g(e,t){return _.objectKeys(e).reduce(function(r,o){var a=e[o],i="undefined"==typeof a?"undefined":n(a),u=void 0,c=void 0,s=void 0,f=void 0,l=void 0;"string"===i?c=a:"function"===i?u=a:a&&(u=a.type,c=a.alias,s=a.defaultValue,f=a.read,l=a.write);var p=x.indexOf(u);if(p>=0)"undefined"==typeof s&&(s=w[p]);else{if(u)throw new Error("Not supported resource type for "+t+"."+o);u=null}return r[o]={type:u,alias:c,defaultValue:s,read:f,write:l},r},{})}function b(e,t){var r={};return _.each(e,function(e,t){var n=e.type,o=e.alias,a=e.defaultValue,i=e.read,u=e.write;if(o){var c=[o,t];t=c[0],o=c[1]}var s=[u,i];i=s[0],u=s[1],r[t]={type:n,alias:o,defaultValue:a,read:i,write:u}}),r}t.__esModule=!0,t.formatRootOptions=c,t.formatInitialRoute=s,t.encodeUserData=m,t.decodeUserData=y,t.formatRealtimeRoute=v,t.formatResource=g,t.reverseResource=b;var _=r(1),x=[Number,String,Boolean],w=[0,"",!1],k=["GET","HEAD"],j=["GET","HEAD"],E="__raw_data_v1"},function(e,t){"use strict";t.__esModule=!0,t["default"]={debug:!1,base:"",path:"",emulateJSON:!1,emulateHTTP:!1,cache:"smart",mock:{memory:!0,server:null,proxy:null,delay:{min:200,max:1e3}},dataTransformMethod:"query",globals:{eaQueryPrefix:"__",cacheQueryKey:"_t",cacheSize:100,cacheMap:{},cacheStack:[]},http:{method:"GET",crossOrigin:!1,credentials:"same-origin",dataType:"json",data:null,headers:{}},request:{naming:null},response:{naming:{"case":"camel",deep:0}},handle:function(e,t){if(this.mock.memory)return t(e.error,e.data);var r=window.jQuery&&window.jQuery.ajax;if(r)return r(e.http).success(function(e){return t(null,e)}).error(function(e){return t(e)});throw new Error("Need implement handler function in options")},mocks:{},resources:{},routes:{}}},function(e,t,r){"use strict";function n(e){e.$objectify=function(t,r){return o(e,r,t,!0)},e.$objectifyAll=function(t,r){return Promise.all([].concat(r).map(function(r){return e.$objectify(t,r)}))},e.$fetch=function(t,r,n){return n&&n.body&&(n.data=n.body,delete n.body),o(e,r,(0,a.extend)({},t,n))},e.$fetchAll=function(t,r){var n=(0,a.objectKeys)(r);return Promise.all(n.map(function(n){return e.$fetch(t,n,r[n])})).then(function(e){return Promise.resolve(n.reduce(function(t,r,n){return t[r]=e[n],t},{}))})}}function o(e,t,r,n){return new Promise(function(o,a){return"function"!=typeof e[t]?o(e[t]):void e[t](r,function(r,i){r?a(r):(n&&(e[t]=i),o(i))})})}t.__esModule=!0,t.mixin=n;var a=r(1)},function(e,t){"use strict";function r(e,t){return e.match(c).reduce(t,"")}function n(e,t,r){var a=e;if(u(e)){a={};for(var c in e)e.hasOwnProperty(c)&&(a[o(c,r,t,e)]=1===t?e[c]:n(e[c],t>1?t-1:t,r))}else if(i(e)){a=[];for(var s=0;so;o++)n[o]=arguments[o];return r.request.apply(r,[e].concat(n))}}),a.$ea=r,a.$request=function(){return r.request.apply(r,arguments)},a.$r=a.$resource=function(e){var t=r.resources[e];return t?Object.keys(t).reduce(function(e,r){var n=t[r].defaultValue;return e[r]=void 0===n?null:n,e},{}):{}},a.$cache=function(e){var t=e||r.globals,n=t.cacheMap,o=t.cacheStack;return e?void(n&&o&&(r.globals.cacheMap=n,r.globals.cacheStack=o)):{cacheMap:n,cacheStack:o}},a},e.exports.ElegantApi=o},function(e,t){"use strict";function r(){}function n(e){return e?Object.keys(e):[]}function o(e){return Object.prototype.toString.call(e)}function a(e){return"[object Object]"===o(e)}function i(e){return Array.isArray(e)}function u(e){return a(e)?e:{}}function c(e,t){if(i(e))for(var r=0;r0&&(l+=+new Date),s[f]={value:t,expire:l},o[u]=s,i.push([u,f]),n>0&&i.length>n){var p=i.shift(),d=p[0],h=p[1];o[d]&&delete o[d][h]}},e.prototype._transform=function(e,t){var r=this,n=e.http;return n.data=this._apply(n.data,e.request,"request"),function(n,o){if(n)return t(n,o);try{o=r._apply(m.deepClone(o),e.response,"response"),r.removeCache(e.removeCache),t(n,o)}catch(n){t(n)}}},e.prototype._emulate=function(e){var t=e.mock,r=e.http,n=e.name,o=m.buildQuery(r.query);r.url=m.appendQuery(r.path,o),(!e.cache.enable||this._needReloadRouteNameMap[n])&&(r.url=m.appendQuery(r.url,this.globals.cacheQueryKey+"="+(new Date).getTime()),delete this._needReloadRouteNameMap[n]),t.server&&!/^https?:\/\//.test(r.url)&&(r.crossOrigin=!0,r.url=m.urlNormalize(("self"===t.server?"":t.server)+r.url)),e.emulateHTTP&&!r.crossOrigin&&/^(PUT|PATCH|DELETE)$/.test(r.method)&&(r.headers["X-HTTP-Method-Override"]=r.method,r.method="POST"),e.emulateJSON&&(r.headers["Content-Type"]="application/x-www-form-urlencoded",r.data=m.buildQuery(r.data))},e.prototype._generateApi=function(e){var t=this;return function(r,n,o){var i=void 0;try{i=(0,h.formatRealtimeRoute)(e,r,n)}catch(u){return o(u)}var c=i,s=c.mock,f=c.http,l=c.dataTransformMethod;if(o=t._transform(i,o),i.cache.enable&&(o=t._cache(i,o),o===!1))return!1;f.body=f.data=(0,h.decodeUserData)(f.data);var p=t._generateApiTransformData(i);if(!s.disabled&&!s.memory)if(p=JSON.stringify(p),f.query.__ea=i.name,s.server&&"self"!==s.server||"cookie"!==l||m.isServer)f.query.__eaData=p;else{var d=new Date;d.setTime(d.getTime()+5e3);var y="__ea"+i.name+"="+encodeURIComponent(p)+"; expires="+d.toUTCString()+"; path=/";a(s.debug,"EA:(request) write cookie %o",y),document.cookie=y}t._emulate(i),t._response(i,p,o)}},e.prototype._response=function(e,t,r){var n=this,o=e.mock,i=e.http;a(o.debug,"EA:(response) route: %o, transformData %o",e,t);var u=function(){y(n.mocks,e.name,t,function(t,n){e.handle({http:i,error:t,data:n},r)})};o.memory?0===o.delay?u():setTimeout(u,o.delay):e.handle({http:i},r)},e.prototype._generateApiTransformData=function(e){var t=v.__ea?JSON.parse(v.__ea):{},r=this.globals.eaQueryPrefix,n=e.http,o="";return m.isServer||(o=location.search.slice(1)),o.split("&").reduce(function(e,t){var n=t.split("=").map(decodeURIComponent),o=n[0],a=n[1];return o!==r&&0===o.indexOf(r)&&(e[o.substr(r.length)]=a),e},t),v.__ea=JSON.stringify(t),{mock:e.mock,params:n.params,query:n.query,data:n.data,ea:t}},e.prototype.request=function(e,t,r,n){var o=this;"function"==typeof t?n=t:"function"==typeof r&&(n=r),t=m.objectify(t),r=m.objectify(r),"function"!=typeof n&&(n=m.emptyFunction);var a=function(n){return"string"==typeof e?o._singleRequest(e,t,r,n):m.isArray(e)?o._batchSeriesRequest(e,t,r,n):m.isObject(e)?o._batchParallelRequest(e,t,r,n):void n(new SyntaxError("Illegal arguments."))};return"undefined"!=typeof Promise?new Promise(function(e,t){a(function(r,o){r?t(r):e(o),n(r,o)})}):void a(n)},e.prototype._singleRequest=function(e,t,r,n){return this.apis[e]?this.apis[e](t,r,n):void n(new Error("Request key '"+e+"' not exists."))},e.prototype._batchSeriesRequest=function(e,t,r,n){var o=this,a=0,i=null,u=null,c=t.iterator||m.emptyFunction,s=void 0,f=function l(){var t=e[a++];if(t){if(s=c(t,a-1,i,u),s===!1)return n(i,u);o.request(t,s,r[t],function(e,t){i=e,u=t,l()})}else n(i,u)};f()},e.prototype._batchParallelRequest=function(e,t,r,n){var o=this,a=Object.keys(e),i=a.length,u=new Error("MAP_ERROR"),c={},s=!1,f=t.iterator||m.emptyFunction;a.forEach(function(a){var l=e[a],p=t.alias&&t.alias[a]||a;o.request(p,l,r[p],function(e,t){i--,f(l,a,e,t),e?(s=!0,u[a]=e,e.message&&(u.message=e.message)):c[a]=t,i||n(s?u:null,c)})})},e}()},function(e,t,r){"use strict";function n(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function o(e){return _.isObject(e)?e:"string"!=typeof e?{}:e.split("&").reduce(function(e,t){var r=t.split("=").map(decodeURIComponent),n=r[0],o=r[1],a={},i=void 0;return o&&":"===o[0]&&o[1]?i=o.slice(1):o&&(a.value=o),(""===o||i)&&(a.required=!0),i&&(a.alias=n,n=i),e[n]=a,e},{})}function a(e){var t=e.http;for(var r in t)r in e&&(t[r]=e[r]);return t.path=_.urlNormalize(e.base+e.path),t.method=t.method.toUpperCase(),e.http}function i(e){var t=e.mock;return _.isObject(t)||(t=e.mock={disabled:!t}),"debug"in t||(t.debug=e.debug),t.disabled&&delete t.memory,(t.disabled||t.memory)&&(delete t.server,delete t.proxy),e.mock}function u(e){var t=e.cache,r=void 0,n=0;return _.isObject(t)?(r=t.enable,n=t.expireSeconds||0):r=t,r="smart"===r&&k.indexOf(e.http.method)>=0||r===!0,0>n&&(r=!1),e.cache={enable:r,expireSeconds:n},e.cache}function c(e){return e.query=o(e.query),e.data=o(e.data),e}function s(e,t,r){return t.name||(t.name=e),t.query=o(t.query),t.data=o(t.data),t=_.extend(!0,{},r,t),a(t),i(t),u(t),t}function f(e){var t=[];return e.replace(/\/:([-\w]+)/g,function(e,r){t.push(r)}),t}function l(e,t){return e.replace(/\/:([-\w]+)/g,function(e,r){return"/"+t[r]})}function p(e){return _.isObject(e)&&(e=_.extend({min:200,max:3e3},e),e=Math.floor(Math.random()*(e.max-e.min)+e.min)),e=parseInt(e,10),e&&e>0?e:0}function d(e,t){e=_.extend(!0,{},e);var r=_.objectKeys(e),n=t.http,o=["params","query","data"],a=j.indexOf(n.method)>=0;if(r.every(function(e){return o.indexOf(e)>=0}))return"data"in e&&(e.data=m(e.data)),o.forEach(function(t){return e[t]=_.objectify(e[t])}),a&&(e.data={}),h(e,t);var i=_.objectKeys(t.query),u=f(n.path),c={},s={},l={},p=t.query,d=t.data;return r.forEach(function(t){u.indexOf(t)>=0?c[t]=e[t]:i.indexOf(t)>=0?s[p[t]&&p[t].alias||t]=e[t]:a||(l[d[t]&&d[t].alias||t]=e[t])}),h({params:c,query:s,data:l},t)}function h(e,t){var r=t.http.path,n=f(r),o=t.name;return n.forEach(function(t){if(!(t in e.params))throw new SyntaxError("Route "+o+" missing params parameter: "+t+".")}),["query","data"].forEach(function(r){var n=e[r],a=t[r];_.each(a,function(e,t){var a=e.alias||t,i=n[a],u=a in n;if(e.required&&!u)throw new SyntaxError("Route "+o+" missing "+r+" parameter: "+t+".");if(e.validate&&u&&("function"==typeof e.validate&&!e.validate(i)||e.validate instanceof RegExp&&!e.validate.test(i)))throw new SyntaxError("Route "+o+" "+r+" parameter '"+a+"' validate error.");"value"in e&&!u&&(n[a]=e.value)})}),e}function m(e){var t;return _.isObject(e)?e:(t={},t[E]=e,t)}function y(e){return E in e?e[E]:e}function v(e,t,r){e=_.extend(!0,{},e),r=_.extend(!0,{},r);var n=e.http,o=r.http||{};o.path&&(o.path=_.urlNormalize(e.base+o.path)),o.method&&(o.method=o.method.toUpperCase()),_.extend(!0,n,o),"mock"in r&&(e.mock=i(r)),"cache"in r&&(e.cache=u(r)),"debug"in r&&(e.mock.debug=r.debug);var a=d(t,e),c=a.params,s=a.query,f=a.data;return _.each(s,function(e,t,r){return r[t]=String(e)}),n.path=l(n.path,c),n.params=c,n.query=s,n.data=f,e.mock.delay=e.mock.memory?p(e.mock.delay):0,e}function g(e,t){return _.objectKeys(e).reduce(function(r,o){var a=e[o],i="undefined"==typeof a?"undefined":n(a),u=void 0,c=void 0,s=void 0,f=void 0,l=void 0;"string"===i?c=a:"function"===i?u=a:a&&(u=a.type,c=a.alias,s=a.defaultValue,f=a.read,l=a.write);var p=x.indexOf(u);if(p>=0)"undefined"==typeof s&&(s=w[p]);else{if(u)throw new Error("Not supported resource type for "+t+"."+o);u=null}return r[o]={type:u,alias:c,defaultValue:s,read:f,write:l},r},{})}function b(e,t){var r={};return _.each(e,function(e,t){var n=e.type,o=e.alias,a=e.defaultValue,i=e.read,u=e.write;if(o){var c=[o,t];t=c[0],o=c[1]}var s=[u,i];i=s[0],u=s[1],r[t]={type:n,alias:o,defaultValue:a,read:i,write:u}}),r}t.__esModule=!0,t.formatRootOptions=c,t.formatInitialRoute=s,t.encodeUserData=m,t.decodeUserData=y,t.formatRealtimeRoute=v,t.formatResource=g,t.reverseResource=b;var _=r(1),x=[Number,String,Boolean],w=[0,"",!1],k=["GET","HEAD"],j=["GET","HEAD"],E="__raw_data_v1"},function(e,t){"use strict";t.__esModule=!0,t["default"]={debug:!1,base:"",path:"",emulateJSON:!1,emulateHTTP:!1,cache:"smart",mock:{memory:!0,server:null,proxy:null,delay:{min:200,max:1e3}},dataTransformMethod:"query",globals:{eaQueryPrefix:"__",cacheQueryKey:"_t",cacheSize:100,cacheMap:{},cacheStack:[]},http:{method:"GET",crossOrigin:!1,credentials:"same-origin",dataType:"json",data:null,headers:{}},request:{naming:null},response:{naming:{"case":"camel",deep:0}},handle:function(e,t){if(this.mock.memory)return t(e.error,e.data);var r=window.jQuery&&window.jQuery.ajax;if(r)return r(e.http).success(function(e){return t(null,e)}).error(function(e){return t(e)});throw new Error("Need implement handler function in options")},mocks:{},resources:{},routes:{}}},function(e,t,r){"use strict";function n(e){e.$objectify=function(t,r){return o(e,r,t,!0)},e.$objectifyAll=function(t,r){return Promise.all([].concat(r).map(function(r){return e.$objectify(t,r)}))},e.$fetch=function(t,r,n){return n&&n.body&&(n.data=n.body,delete n.body),o(e,r,(0,a.extend)({},t,n))},e.$fetchAll=function(t,r){var n=(0,a.objectKeys)(r);return Promise.all(n.map(function(n){return e.$fetch(t,n,r[n])})).then(function(e){return Promise.resolve(n.reduce(function(t,r,n){return t[r]=e[n],t},{}))})}}function o(e,t,r,n){return new Promise(function(o,a){return"function"!=typeof e[t]?o(e[t]):void e[t](r,function(r,i){r?a(r):(n&&(e[t]=i),o(i))})})}t.__esModule=!0,t.mixin=n;var a=r(1)},function(e,t){"use strict";function r(e,t){return e.match(c).reduce(t,"")}function n(e,t,r){var a=e;if(u(e)){a={};for(var c in e)e.hasOwnProperty(c)&&(a[o(c,r,t,e)]=1===t?e[c]:n(e[c],t>1?t-1:t,r))}else if(i(e)){a=[];for(var s=0;s