├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── auto-polyfill.js ├── formdata.js ├── index.js ├── localstorage.js ├── navigator.js ├── online-offline-events.js ├── package-lock.json ├── package.json ├── websocket.js └── xmlhttprequest.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | insert_final_newline = true 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 LeanCloud 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # weapp-polyfill [![npm](https://img.shields.io/npm/v/weapp-polyfill.svg?style=flat-square)](https://www.npmjs.com/package/weapp-polyfill) 2 | Polyfills for w3c API on top of Weapp API, including: 3 | 4 | - XMLHttpRequest 5 | - FormData 6 | - WebSocket 7 | - localStorage 8 | - online/offline events 9 | 10 | ## Why 11 | 微信小程序设计了一系列 IO 相关的 API,但社区中现存的模块绝大部分使用的是 w3c 标准的 API。本项目通过 polyfill 这些 w3c API 允许开发者在不修改第三方模块代码的情况下直接在小程序中使用这些模块。 12 | 13 | ## Usage 14 | ``` 15 | npm i weapp-polyfill -D 16 | ``` 17 | 18 | 如果你的应用或 SDK 使用打包工具(打包成一个文件后再导入微信开发工具使用),你可以在程序入口的最开始 auto polyfill 所有 API 19 | 20 | ``` 21 | require('weapp-polyfill/auto-polyfill'); 22 | ``` 23 | 24 | 即可在整个项目中直接使用浏览器 API。See a [realworld demo](https://github.com/leancloud/javascript-sdk/blob/35af5a0547b1d48d3d933fac1fae0eaf16083fa9/src/index-weapp.js)。 25 | 26 | weapp-polyfill pacakge 本身 export 了以下对象: 27 | 28 | ``` 29 | const { 30 | XMLHttpRequest,· 31 | FormData, 32 | WebSocket, 33 | localStorage, 34 | polyfill, 35 | } = require('weapp-polyfill'); 36 | ``` 37 | 38 | 不支持不使用打包工具直接在微信开发工具使用。 39 | 40 | ## Caveats 41 | 由于微信 API 与小程序运行时的限制,polyfill 的 API 有以下限制: 42 | 43 | ### XMLHttpRequest 44 | - 不会出现 `HEADERS_RECEIVED` 与 `LOADING` 状态 45 | 46 | ### FormData 47 | - Blob 被定义为一个拥有 `uri` 属性的对象,`uri` 的值为通过微信 API 得到的本地临时文件路径:`{ uri: 'tempFilePath' }` 48 | - 如果一个 FormData append 了多个 blob,只有第一个会被发送 49 | 50 | ### online/offline events 51 | - 仅当使用 auto polyfill 功能时有效。当网络状态变化时,会在当前模块的 global/window 中派发 online/offline 事件。 52 | 53 | ## Changelogs 54 | 55 | #### 3.2.2 56 | - 修复了 WebSocket protocol 参数为 string 类型时在真机最新基础库上报错的问题 57 | 58 | #### 3.2.1 59 | - 修复了 WebSocket protocol 参数不生效的问题 60 | 61 | ### 3.2.0 62 | - WebSocket 支持多实例(需要基础库 >= 1.7.0) 63 | 64 | #### 3.1.2 65 | - 修复了导致 Babel 提供的 Promise 失效的兼容性问题 66 | - 修复了 `WebSocket is not connected` 错误 67 | - 修复小程序中一个 regression 68 | 69 | #### 3.1.1 70 | - 修复 auto-polyfill 在小游戏真机上没有生效的问题 71 | 72 | ### 3.1.0 73 | - 支持微信小游戏 74 | 75 | ### 3.0.0 76 | - WebSocket 增加了以下特性 77 | - 支持 subprotocol 78 | - 支持二进制帧(ArrayBuffer) 79 | - 增加 online/offline events 支持 80 | 81 | #### 2.0.1 82 | - XMLHttpRequest 忽略 response headers key 的大小写。 83 | 84 | ### 2.0.0 85 | - XMLHttpRequest 增加了以下特性 86 | - 支持获取 Response Headers 87 | - 支持通过 xhr.upload 获取文件上传进度 88 | - 支持 abort 89 | -------------------------------------------------------------------------------- /auto-polyfill.js: -------------------------------------------------------------------------------- 1 | var polyfill = require('./index.js').polyfill; 2 | try { 3 | polyfill(); 4 | } catch (e) {} 5 | try { 6 | polyfill(GameGlobal); 7 | } catch (e) {} 8 | try{ 9 | window = window || {}; 10 | polyfill(window); 11 | } catch (e) {} 12 | try { 13 | localStorage = localStorage || require('./localstorage.js'); 14 | } catch (e) {} 15 | try { 16 | XMLHttpRequest = XMLHttpRequest || require('./xmlhttprequest.js'); 17 | } catch (e) {} 18 | try { 19 | FormData = FormData || require('./formdata.js'); 20 | } catch (e) {} 21 | try { 22 | WebSocket = WebSocket || require('./websocket.js'); 23 | } catch (e) {} 24 | try { 25 | navigator = navigator || require('./navigator.js'); 26 | } catch (e) {} 27 | -------------------------------------------------------------------------------- /formdata.js: -------------------------------------------------------------------------------- 1 | class FormData { 2 | constructor() { 3 | this._entries = []; 4 | } 5 | 6 | append(name, value) { 7 | if (typeof name !== 'string') { 8 | throw new TypeError('FormData name must be a string'); 9 | } 10 | if (typeof value !== 'string') { 11 | if (typeof value !== 'object' || typeof value.uri !== 'string') { 12 | throw new TypeError('FormData value must be a string or { uri: tempFilePath }') 13 | } 14 | } 15 | this._entries.push([name, value]); 16 | } 17 | 18 | set(name, value) { 19 | const entry = this.get(name); 20 | if (entry) { 21 | entry[1] = value; 22 | } else { 23 | this.append(name, value); 24 | } 25 | } 26 | 27 | delete(name) { 28 | this._entries = this._entries.filter(entry => entry[0] !== name); 29 | } 30 | 31 | entries() { 32 | return this._entries; 33 | } 34 | 35 | get(name) { 36 | return this._entries.find(entry => entry[0] === name); 37 | } 38 | 39 | getAll(name) { 40 | return this._entries.filter(entry => entry[0] === name); 41 | } 42 | 43 | has(name) { 44 | return this._entries.some(entry => entry[0] === name); 45 | } 46 | 47 | keys() { 48 | return this._entries.map(entry => entry[0]); 49 | } 50 | 51 | values() { 52 | return this._entries.map(entry => entry[1]); 53 | } 54 | } 55 | 56 | module.exports = FormData; 57 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var localStorage = require('./localstorage.js'); 2 | var XMLHttpRequest = require('./xmlhttprequest.js'); 3 | var FormData = require('./formdata.js'); 4 | var WebSocket = require('./websocket.js'); 5 | var OnlineOfflineEvents = require('./online-offline-events.js'); 6 | var navigator = require('./navigator'); 7 | 8 | module.exports = { 9 | polyfill(target = global || window) { 10 | if (typeof target !== 'object') { 11 | throw new Error('polyfill target is not an Object'); 12 | } 13 | const polyfills = { 14 | localStorage, 15 | XMLHttpRequest, 16 | FormData, 17 | WebSocket, 18 | Object, 19 | navigator, 20 | }; 21 | for (let k in polyfills) { 22 | if (!target[k]) target[k] = polyfills[k]; 23 | } 24 | OnlineOfflineEvents.polyfill(target); 25 | // 假扮为 React Native,让 axios 认为这是一个 nonStandardBrowserEnv 26 | target.navigator.product = 'ReactNative'; 27 | }, 28 | localStorage, 29 | XMLHttpRequest, 30 | FormData, 31 | WebSocket, 32 | } 33 | -------------------------------------------------------------------------------- /localstorage.js: -------------------------------------------------------------------------------- 1 | class Storage { 2 | getItem(key) { 3 | return wx.getStorageSync(key); 4 | } 5 | 6 | setItem(key, value) { 7 | return wx.setStorageSync(key, value); 8 | } 9 | 10 | removeItem(key) { 11 | return this.setItem(key, ''); 12 | } 13 | 14 | clear() { 15 | return wx.clearStorageSync(); 16 | } 17 | } 18 | 19 | module.exports = new Storage(); 20 | -------------------------------------------------------------------------------- /navigator.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /online-offline-events.js: -------------------------------------------------------------------------------- 1 | const EventTarget = require('event-target-shim'); 2 | 3 | exports.polyfill = target => { 4 | if (!wx.onNetworkStatusChange) return; 5 | if (target.__onlineOfflinePolyfilled) return; 6 | target.__onlineOfflinePolyfilled = true; 7 | const internalEventTarget = new EventTarget(); 8 | if (!target.dispatchEvent) { 9 | target.addEventListener = internalEventTarget.addEventListener.bind(internalEventTarget); 10 | target.removeEventListener = internalEventTarget.removeEventListener.bind(internalEventTarget); 11 | target.dispatchEvent = internalEventTarget.dispatchEvent.bind(internalEventTarget); 12 | // avoid this condition to be true: 13 | // https://github.com/zloirock/core-js/blob/9f051803760c02b306aae2595621bb7ef698fc29/library/modules/_task.js#L61 14 | if (typeof postMessage == 'function' && !target.importScripts) { 15 | target.importScripts = () => { throw new Error('mocked'); }; 16 | } 17 | } 18 | wx.getNetworkType({ 19 | success: ({networkType}) => { 20 | target.onLine = networkType !== 'none'; 21 | wx.onNetworkStatusChange(({isConnected}) => { 22 | if (target.onLine === isConnected) return; 23 | target.onLine = isConnected; 24 | target.dispatchEvent({ 25 | type: isConnected ? 'online' : 'offline', 26 | }); 27 | }); 28 | }, 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "weapp-polyfill", 3 | "version": "3.2.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "JSONStream": { 8 | "version": "1.3.1", 9 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", 10 | "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", 11 | "dev": true, 12 | "requires": { 13 | "jsonparse": "^1.2.0", 14 | "through": ">=2.2.7 <3" 15 | } 16 | }, 17 | "acorn": { 18 | "version": "4.0.13", 19 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 20 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", 21 | "dev": true 22 | }, 23 | "array-filter": { 24 | "version": "0.0.1", 25 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 26 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 27 | "dev": true 28 | }, 29 | "array-map": { 30 | "version": "0.0.0", 31 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 32 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 33 | "dev": true 34 | }, 35 | "array-reduce": { 36 | "version": "0.0.0", 37 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 38 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 39 | "dev": true 40 | }, 41 | "asn1.js": { 42 | "version": "4.10.1", 43 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 44 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 45 | "dev": true, 46 | "requires": { 47 | "bn.js": "^4.0.0", 48 | "inherits": "^2.0.1", 49 | "minimalistic-assert": "^1.0.0" 50 | } 51 | }, 52 | "assert": { 53 | "version": "1.4.1", 54 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", 55 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", 56 | "dev": true, 57 | "requires": { 58 | "util": "0.10.3" 59 | }, 60 | "dependencies": { 61 | "inherits": { 62 | "version": "2.0.1", 63 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 64 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 65 | "dev": true 66 | }, 67 | "util": { 68 | "version": "0.10.3", 69 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 70 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 71 | "dev": true, 72 | "requires": { 73 | "inherits": "2.0.1" 74 | } 75 | } 76 | } 77 | }, 78 | "astw": { 79 | "version": "2.2.0", 80 | "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", 81 | "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", 82 | "dev": true, 83 | "requires": { 84 | "acorn": "^4.0.3" 85 | } 86 | }, 87 | "balanced-match": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 90 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 91 | "dev": true 92 | }, 93 | "base64-js": { 94 | "version": "1.3.0", 95 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 96 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", 97 | "dev": true 98 | }, 99 | "bn.js": { 100 | "version": "4.11.8", 101 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 102 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", 103 | "dev": true 104 | }, 105 | "brace-expansion": { 106 | "version": "1.1.11", 107 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 108 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 109 | "dev": true, 110 | "requires": { 111 | "balanced-match": "^1.0.0", 112 | "concat-map": "0.0.1" 113 | } 114 | }, 115 | "brorand": { 116 | "version": "1.1.0", 117 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 118 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 119 | "dev": true 120 | }, 121 | "browser-pack": { 122 | "version": "6.0.2", 123 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", 124 | "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", 125 | "dev": true, 126 | "requires": { 127 | "JSONStream": "^1.0.3", 128 | "combine-source-map": "~0.7.1", 129 | "defined": "^1.0.0", 130 | "through2": "^2.0.0", 131 | "umd": "^3.0.0" 132 | } 133 | }, 134 | "browser-resolve": { 135 | "version": "1.11.2", 136 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", 137 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 138 | "dev": true, 139 | "requires": { 140 | "resolve": "1.1.7" 141 | }, 142 | "dependencies": { 143 | "resolve": { 144 | "version": "1.1.7", 145 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 146 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 147 | "dev": true 148 | } 149 | } 150 | }, 151 | "browserify": { 152 | "version": "13.3.0", 153 | "resolved": "http://registry.npmjs.org/browserify/-/browserify-13.3.0.tgz", 154 | "integrity": "sha1-tanJAgJD8McORnW+yCI7xifkFc4=", 155 | "dev": true, 156 | "requires": { 157 | "JSONStream": "^1.0.3", 158 | "assert": "^1.4.0", 159 | "browser-pack": "^6.0.1", 160 | "browser-resolve": "^1.11.0", 161 | "browserify-zlib": "~0.1.2", 162 | "buffer": "^4.1.0", 163 | "cached-path-relative": "^1.0.0", 164 | "concat-stream": "~1.5.1", 165 | "console-browserify": "^1.1.0", 166 | "constants-browserify": "~1.0.0", 167 | "crypto-browserify": "^3.0.0", 168 | "defined": "^1.0.0", 169 | "deps-sort": "^2.0.0", 170 | "domain-browser": "~1.1.0", 171 | "duplexer2": "~0.1.2", 172 | "events": "~1.1.0", 173 | "glob": "^7.1.0", 174 | "has": "^1.0.0", 175 | "htmlescape": "^1.1.0", 176 | "https-browserify": "~0.0.0", 177 | "inherits": "~2.0.1", 178 | "insert-module-globals": "^7.0.0", 179 | "labeled-stream-splicer": "^2.0.0", 180 | "module-deps": "^4.0.8", 181 | "os-browserify": "~0.1.1", 182 | "parents": "^1.0.1", 183 | "path-browserify": "~0.0.0", 184 | "process": "~0.11.0", 185 | "punycode": "^1.3.2", 186 | "querystring-es3": "~0.2.0", 187 | "read-only-stream": "^2.0.0", 188 | "readable-stream": "^2.0.2", 189 | "resolve": "^1.1.4", 190 | "shasum": "^1.0.0", 191 | "shell-quote": "^1.6.1", 192 | "stream-browserify": "^2.0.0", 193 | "stream-http": "^2.0.0", 194 | "string_decoder": "~0.10.0", 195 | "subarg": "^1.0.0", 196 | "syntax-error": "^1.1.1", 197 | "through2": "^2.0.0", 198 | "timers-browserify": "^1.0.1", 199 | "tty-browserify": "~0.0.0", 200 | "url": "~0.11.0", 201 | "util": "~0.10.1", 202 | "vm-browserify": "~0.0.1", 203 | "xtend": "^4.0.0" 204 | } 205 | }, 206 | "browserify-aes": { 207 | "version": "1.2.0", 208 | "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 209 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 210 | "dev": true, 211 | "requires": { 212 | "buffer-xor": "^1.0.3", 213 | "cipher-base": "^1.0.0", 214 | "create-hash": "^1.1.0", 215 | "evp_bytestokey": "^1.0.3", 216 | "inherits": "^2.0.1", 217 | "safe-buffer": "^5.0.1" 218 | } 219 | }, 220 | "browserify-cipher": { 221 | "version": "1.0.1", 222 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 223 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 224 | "dev": true, 225 | "requires": { 226 | "browserify-aes": "^1.0.4", 227 | "browserify-des": "^1.0.0", 228 | "evp_bytestokey": "^1.0.0" 229 | } 230 | }, 231 | "browserify-des": { 232 | "version": "1.0.2", 233 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 234 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 235 | "dev": true, 236 | "requires": { 237 | "cipher-base": "^1.0.1", 238 | "des.js": "^1.0.0", 239 | "inherits": "^2.0.1", 240 | "safe-buffer": "^5.1.2" 241 | } 242 | }, 243 | "browserify-rsa": { 244 | "version": "4.0.1", 245 | "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 246 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 247 | "dev": true, 248 | "requires": { 249 | "bn.js": "^4.1.0", 250 | "randombytes": "^2.0.1" 251 | } 252 | }, 253 | "browserify-sign": { 254 | "version": "4.0.4", 255 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 256 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 257 | "dev": true, 258 | "requires": { 259 | "bn.js": "^4.1.1", 260 | "browserify-rsa": "^4.0.0", 261 | "create-hash": "^1.1.0", 262 | "create-hmac": "^1.1.2", 263 | "elliptic": "^6.0.0", 264 | "inherits": "^2.0.1", 265 | "parse-asn1": "^5.0.0" 266 | } 267 | }, 268 | "browserify-zlib": { 269 | "version": "0.1.4", 270 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 271 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 272 | "dev": true, 273 | "requires": { 274 | "pako": "~0.2.0" 275 | } 276 | }, 277 | "buffer": { 278 | "version": "4.9.1", 279 | "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 280 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 281 | "dev": true, 282 | "requires": { 283 | "base64-js": "^1.0.2", 284 | "ieee754": "^1.1.4", 285 | "isarray": "^1.0.0" 286 | } 287 | }, 288 | "buffer-xor": { 289 | "version": "1.0.3", 290 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 291 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 292 | "dev": true 293 | }, 294 | "builtin-status-codes": { 295 | "version": "3.0.0", 296 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 297 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 298 | "dev": true 299 | }, 300 | "cached-path-relative": { 301 | "version": "1.0.2", 302 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", 303 | "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", 304 | "dev": true 305 | }, 306 | "cipher-base": { 307 | "version": "1.0.4", 308 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 309 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 310 | "dev": true, 311 | "requires": { 312 | "inherits": "^2.0.1", 313 | "safe-buffer": "^5.0.1" 314 | } 315 | }, 316 | "combine-source-map": { 317 | "version": "0.7.2", 318 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", 319 | "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", 320 | "dev": true, 321 | "requires": { 322 | "convert-source-map": "~1.1.0", 323 | "inline-source-map": "~0.6.0", 324 | "lodash.memoize": "~3.0.3", 325 | "source-map": "~0.5.3" 326 | } 327 | }, 328 | "concat-map": { 329 | "version": "0.0.1", 330 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 331 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 332 | "dev": true 333 | }, 334 | "concat-stream": { 335 | "version": "1.5.2", 336 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", 337 | "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", 338 | "dev": true, 339 | "requires": { 340 | "inherits": "~2.0.1", 341 | "readable-stream": "~2.0.0", 342 | "typedarray": "~0.0.5" 343 | }, 344 | "dependencies": { 345 | "process-nextick-args": { 346 | "version": "1.0.7", 347 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 348 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 349 | "dev": true 350 | }, 351 | "readable-stream": { 352 | "version": "2.0.6", 353 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 354 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 355 | "dev": true, 356 | "requires": { 357 | "core-util-is": "~1.0.0", 358 | "inherits": "~2.0.1", 359 | "isarray": "~1.0.0", 360 | "process-nextick-args": "~1.0.6", 361 | "string_decoder": "~0.10.x", 362 | "util-deprecate": "~1.0.1" 363 | } 364 | } 365 | } 366 | }, 367 | "console-browserify": { 368 | "version": "1.1.0", 369 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 370 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 371 | "dev": true, 372 | "requires": { 373 | "date-now": "^0.1.4" 374 | } 375 | }, 376 | "constants-browserify": { 377 | "version": "1.0.0", 378 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 379 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 380 | "dev": true 381 | }, 382 | "convert-source-map": { 383 | "version": "1.1.3", 384 | "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 385 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", 386 | "dev": true 387 | }, 388 | "core-util-is": { 389 | "version": "1.0.2", 390 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 391 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 392 | "dev": true 393 | }, 394 | "create-ecdh": { 395 | "version": "4.0.3", 396 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 397 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 398 | "dev": true, 399 | "requires": { 400 | "bn.js": "^4.1.0", 401 | "elliptic": "^6.0.0" 402 | } 403 | }, 404 | "create-hash": { 405 | "version": "1.2.0", 406 | "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 407 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 408 | "dev": true, 409 | "requires": { 410 | "cipher-base": "^1.0.1", 411 | "inherits": "^2.0.1", 412 | "md5.js": "^1.3.4", 413 | "ripemd160": "^2.0.1", 414 | "sha.js": "^2.4.0" 415 | } 416 | }, 417 | "create-hmac": { 418 | "version": "1.1.7", 419 | "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 420 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 421 | "dev": true, 422 | "requires": { 423 | "cipher-base": "^1.0.3", 424 | "create-hash": "^1.1.0", 425 | "inherits": "^2.0.1", 426 | "ripemd160": "^2.0.0", 427 | "safe-buffer": "^5.0.1", 428 | "sha.js": "^2.4.8" 429 | } 430 | }, 431 | "crypto-browserify": { 432 | "version": "3.12.0", 433 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 434 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 435 | "dev": true, 436 | "requires": { 437 | "browserify-cipher": "^1.0.0", 438 | "browserify-sign": "^4.0.0", 439 | "create-ecdh": "^4.0.0", 440 | "create-hash": "^1.1.0", 441 | "create-hmac": "^1.1.0", 442 | "diffie-hellman": "^5.0.0", 443 | "inherits": "^2.0.1", 444 | "pbkdf2": "^3.0.3", 445 | "public-encrypt": "^4.0.0", 446 | "randombytes": "^2.0.0", 447 | "randomfill": "^1.0.3" 448 | } 449 | }, 450 | "date-now": { 451 | "version": "0.1.4", 452 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 453 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 454 | "dev": true 455 | }, 456 | "defined": { 457 | "version": "1.0.0", 458 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 459 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 460 | "dev": true 461 | }, 462 | "deps-sort": { 463 | "version": "2.0.0", 464 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", 465 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", 466 | "dev": true, 467 | "requires": { 468 | "JSONStream": "^1.0.3", 469 | "shasum": "^1.0.0", 470 | "subarg": "^1.0.0", 471 | "through2": "^2.0.0" 472 | } 473 | }, 474 | "des.js": { 475 | "version": "1.0.0", 476 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 477 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 478 | "dev": true, 479 | "requires": { 480 | "inherits": "^2.0.1", 481 | "minimalistic-assert": "^1.0.0" 482 | } 483 | }, 484 | "detective": { 485 | "version": "4.7.1", 486 | "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", 487 | "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", 488 | "dev": true, 489 | "requires": { 490 | "acorn": "^5.2.1", 491 | "defined": "^1.0.0" 492 | }, 493 | "dependencies": { 494 | "acorn": { 495 | "version": "5.7.3", 496 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 497 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", 498 | "dev": true 499 | } 500 | } 501 | }, 502 | "diffie-hellman": { 503 | "version": "5.0.3", 504 | "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 505 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 506 | "dev": true, 507 | "requires": { 508 | "bn.js": "^4.1.0", 509 | "miller-rabin": "^4.0.0", 510 | "randombytes": "^2.0.0" 511 | } 512 | }, 513 | "domain-browser": { 514 | "version": "1.1.7", 515 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", 516 | "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", 517 | "dev": true 518 | }, 519 | "duplexer2": { 520 | "version": "0.1.4", 521 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 522 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 523 | "dev": true, 524 | "requires": { 525 | "readable-stream": "^2.0.2" 526 | } 527 | }, 528 | "elliptic": { 529 | "version": "6.4.1", 530 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", 531 | "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", 532 | "dev": true, 533 | "requires": { 534 | "bn.js": "^4.4.0", 535 | "brorand": "^1.0.1", 536 | "hash.js": "^1.0.0", 537 | "hmac-drbg": "^1.0.0", 538 | "inherits": "^2.0.1", 539 | "minimalistic-assert": "^1.0.0", 540 | "minimalistic-crypto-utils": "^1.0.0" 541 | } 542 | }, 543 | "event-target-shim": { 544 | "version": "1.1.1", 545 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz", 546 | "integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE=" 547 | }, 548 | "events": { 549 | "version": "1.1.1", 550 | "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", 551 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 552 | "dev": true 553 | }, 554 | "evp_bytestokey": { 555 | "version": "1.0.3", 556 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 557 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 558 | "dev": true, 559 | "requires": { 560 | "md5.js": "^1.3.4", 561 | "safe-buffer": "^5.1.1" 562 | } 563 | }, 564 | "fs.realpath": { 565 | "version": "1.0.0", 566 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 567 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 568 | "dev": true 569 | }, 570 | "function-bind": { 571 | "version": "1.1.1", 572 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 573 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 574 | "dev": true 575 | }, 576 | "glob": { 577 | "version": "7.1.2", 578 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 579 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 580 | "dev": true, 581 | "requires": { 582 | "fs.realpath": "^1.0.0", 583 | "inflight": "^1.0.4", 584 | "inherits": "2", 585 | "minimatch": "^3.0.4", 586 | "once": "^1.3.0", 587 | "path-is-absolute": "^1.0.0" 588 | } 589 | }, 590 | "has": { 591 | "version": "1.0.1", 592 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 593 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 594 | "dev": true, 595 | "requires": { 596 | "function-bind": "^1.0.2" 597 | } 598 | }, 599 | "hash-base": { 600 | "version": "3.0.4", 601 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 602 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 603 | "dev": true, 604 | "requires": { 605 | "inherits": "^2.0.1", 606 | "safe-buffer": "^5.0.1" 607 | } 608 | }, 609 | "hash.js": { 610 | "version": "1.1.5", 611 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", 612 | "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", 613 | "dev": true, 614 | "requires": { 615 | "inherits": "^2.0.3", 616 | "minimalistic-assert": "^1.0.1" 617 | } 618 | }, 619 | "hmac-drbg": { 620 | "version": "1.0.1", 621 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 622 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 623 | "dev": true, 624 | "requires": { 625 | "hash.js": "^1.0.3", 626 | "minimalistic-assert": "^1.0.0", 627 | "minimalistic-crypto-utils": "^1.0.1" 628 | } 629 | }, 630 | "htmlescape": { 631 | "version": "1.1.1", 632 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 633 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", 634 | "dev": true 635 | }, 636 | "https-browserify": { 637 | "version": "0.0.1", 638 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", 639 | "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", 640 | "dev": true 641 | }, 642 | "ieee754": { 643 | "version": "1.1.12", 644 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", 645 | "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", 646 | "dev": true 647 | }, 648 | "indexof": { 649 | "version": "0.0.1", 650 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 651 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 652 | "dev": true 653 | }, 654 | "inflight": { 655 | "version": "1.0.6", 656 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 657 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 658 | "dev": true, 659 | "requires": { 660 | "once": "^1.3.0", 661 | "wrappy": "1" 662 | } 663 | }, 664 | "inherits": { 665 | "version": "2.0.3", 666 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 667 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 668 | "dev": true 669 | }, 670 | "inline-source-map": { 671 | "version": "0.6.2", 672 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 673 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 674 | "dev": true, 675 | "requires": { 676 | "source-map": "~0.5.3" 677 | } 678 | }, 679 | "insert-module-globals": { 680 | "version": "7.0.1", 681 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", 682 | "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", 683 | "dev": true, 684 | "requires": { 685 | "JSONStream": "^1.0.3", 686 | "combine-source-map": "~0.7.1", 687 | "concat-stream": "~1.5.1", 688 | "is-buffer": "^1.1.0", 689 | "lexical-scope": "^1.2.0", 690 | "process": "~0.11.0", 691 | "through2": "^2.0.0", 692 | "xtend": "^4.0.0" 693 | } 694 | }, 695 | "is-buffer": { 696 | "version": "1.1.6", 697 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 698 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 699 | "dev": true 700 | }, 701 | "isarray": { 702 | "version": "1.0.0", 703 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 704 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 705 | "dev": true 706 | }, 707 | "json-stable-stringify": { 708 | "version": "0.0.1", 709 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 710 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 711 | "dev": true, 712 | "requires": { 713 | "jsonify": "~0.0.0" 714 | } 715 | }, 716 | "jsonify": { 717 | "version": "0.0.0", 718 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 719 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 720 | "dev": true 721 | }, 722 | "jsonparse": { 723 | "version": "1.3.1", 724 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 725 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 726 | "dev": true 727 | }, 728 | "labeled-stream-splicer": { 729 | "version": "2.0.0", 730 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", 731 | "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", 732 | "dev": true, 733 | "requires": { 734 | "inherits": "^2.0.1", 735 | "isarray": "~0.0.1", 736 | "stream-splicer": "^2.0.0" 737 | }, 738 | "dependencies": { 739 | "isarray": { 740 | "version": "0.0.1", 741 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 742 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 743 | "dev": true 744 | } 745 | } 746 | }, 747 | "lexical-scope": { 748 | "version": "1.2.0", 749 | "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", 750 | "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", 751 | "dev": true, 752 | "requires": { 753 | "astw": "^2.0.0" 754 | } 755 | }, 756 | "lodash.memoize": { 757 | "version": "3.0.4", 758 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 759 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", 760 | "dev": true 761 | }, 762 | "md5.js": { 763 | "version": "1.3.5", 764 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 765 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 766 | "dev": true, 767 | "requires": { 768 | "hash-base": "^3.0.0", 769 | "inherits": "^2.0.1", 770 | "safe-buffer": "^5.1.2" 771 | } 772 | }, 773 | "miller-rabin": { 774 | "version": "4.0.1", 775 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 776 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 777 | "dev": true, 778 | "requires": { 779 | "bn.js": "^4.0.0", 780 | "brorand": "^1.0.1" 781 | } 782 | }, 783 | "minimalistic-assert": { 784 | "version": "1.0.1", 785 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 786 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 787 | "dev": true 788 | }, 789 | "minimalistic-crypto-utils": { 790 | "version": "1.0.1", 791 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 792 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 793 | "dev": true 794 | }, 795 | "minimatch": { 796 | "version": "3.0.4", 797 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 798 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 799 | "dev": true, 800 | "requires": { 801 | "brace-expansion": "^1.1.7" 802 | } 803 | }, 804 | "minimist": { 805 | "version": "1.2.0", 806 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 807 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 808 | "dev": true 809 | }, 810 | "module-deps": { 811 | "version": "4.1.1", 812 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", 813 | "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", 814 | "dev": true, 815 | "requires": { 816 | "JSONStream": "^1.0.3", 817 | "browser-resolve": "^1.7.0", 818 | "cached-path-relative": "^1.0.0", 819 | "concat-stream": "~1.5.0", 820 | "defined": "^1.0.0", 821 | "detective": "^4.0.0", 822 | "duplexer2": "^0.1.2", 823 | "inherits": "^2.0.1", 824 | "parents": "^1.0.0", 825 | "readable-stream": "^2.0.2", 826 | "resolve": "^1.1.3", 827 | "stream-combiner2": "^1.1.1", 828 | "subarg": "^1.0.0", 829 | "through2": "^2.0.0", 830 | "xtend": "^4.0.0" 831 | } 832 | }, 833 | "object-assign": { 834 | "version": "4.1.1", 835 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 836 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 837 | }, 838 | "once": { 839 | "version": "1.4.0", 840 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 841 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 842 | "dev": true, 843 | "requires": { 844 | "wrappy": "1" 845 | } 846 | }, 847 | "os-browserify": { 848 | "version": "0.1.2", 849 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", 850 | "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", 851 | "dev": true 852 | }, 853 | "pako": { 854 | "version": "0.2.9", 855 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 856 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 857 | "dev": true 858 | }, 859 | "parents": { 860 | "version": "1.0.1", 861 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 862 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 863 | "dev": true, 864 | "requires": { 865 | "path-platform": "~0.11.15" 866 | } 867 | }, 868 | "parse-asn1": { 869 | "version": "5.1.1", 870 | "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", 871 | "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", 872 | "dev": true, 873 | "requires": { 874 | "asn1.js": "^4.0.0", 875 | "browserify-aes": "^1.0.0", 876 | "create-hash": "^1.1.0", 877 | "evp_bytestokey": "^1.0.0", 878 | "pbkdf2": "^3.0.3" 879 | } 880 | }, 881 | "path-browserify": { 882 | "version": "0.0.0", 883 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", 884 | "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", 885 | "dev": true 886 | }, 887 | "path-is-absolute": { 888 | "version": "1.0.1", 889 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 890 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 891 | "dev": true 892 | }, 893 | "path-parse": { 894 | "version": "1.0.6", 895 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 896 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 897 | "dev": true 898 | }, 899 | "path-platform": { 900 | "version": "0.11.15", 901 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 902 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", 903 | "dev": true 904 | }, 905 | "pbkdf2": { 906 | "version": "3.0.17", 907 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 908 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", 909 | "dev": true, 910 | "requires": { 911 | "create-hash": "^1.1.2", 912 | "create-hmac": "^1.1.4", 913 | "ripemd160": "^2.0.1", 914 | "safe-buffer": "^5.0.1", 915 | "sha.js": "^2.4.8" 916 | } 917 | }, 918 | "process": { 919 | "version": "0.11.10", 920 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 921 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 922 | "dev": true 923 | }, 924 | "process-nextick-args": { 925 | "version": "2.0.0", 926 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 927 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 928 | "dev": true 929 | }, 930 | "public-encrypt": { 931 | "version": "4.0.3", 932 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 933 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 934 | "dev": true, 935 | "requires": { 936 | "bn.js": "^4.1.0", 937 | "browserify-rsa": "^4.0.0", 938 | "create-hash": "^1.1.0", 939 | "parse-asn1": "^5.0.0", 940 | "randombytes": "^2.0.1", 941 | "safe-buffer": "^5.1.2" 942 | } 943 | }, 944 | "punycode": { 945 | "version": "1.4.1", 946 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 947 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 948 | "dev": true 949 | }, 950 | "querystring": { 951 | "version": "0.2.0", 952 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 953 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 954 | "dev": true 955 | }, 956 | "querystring-es3": { 957 | "version": "0.2.1", 958 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 959 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 960 | "dev": true 961 | }, 962 | "randombytes": { 963 | "version": "2.0.6", 964 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 965 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 966 | "dev": true, 967 | "requires": { 968 | "safe-buffer": "^5.1.0" 969 | } 970 | }, 971 | "randomfill": { 972 | "version": "1.0.4", 973 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 974 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 975 | "dev": true, 976 | "requires": { 977 | "randombytes": "^2.0.5", 978 | "safe-buffer": "^5.1.0" 979 | } 980 | }, 981 | "read-only-stream": { 982 | "version": "2.0.0", 983 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 984 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 985 | "dev": true, 986 | "requires": { 987 | "readable-stream": "^2.0.2" 988 | } 989 | }, 990 | "readable-stream": { 991 | "version": "2.3.6", 992 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 993 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 994 | "dev": true, 995 | "requires": { 996 | "core-util-is": "~1.0.0", 997 | "inherits": "~2.0.3", 998 | "isarray": "~1.0.0", 999 | "process-nextick-args": "~2.0.0", 1000 | "safe-buffer": "~5.1.1", 1001 | "string_decoder": "~1.1.1", 1002 | "util-deprecate": "~1.0.1" 1003 | }, 1004 | "dependencies": { 1005 | "string_decoder": { 1006 | "version": "1.1.1", 1007 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1008 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1009 | "dev": true, 1010 | "requires": { 1011 | "safe-buffer": "~5.1.0" 1012 | } 1013 | } 1014 | } 1015 | }, 1016 | "resolve": { 1017 | "version": "1.5.0", 1018 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 1019 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 1020 | "dev": true, 1021 | "requires": { 1022 | "path-parse": "^1.0.5" 1023 | } 1024 | }, 1025 | "ripemd160": { 1026 | "version": "2.0.2", 1027 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1028 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1029 | "dev": true, 1030 | "requires": { 1031 | "hash-base": "^3.0.0", 1032 | "inherits": "^2.0.1" 1033 | } 1034 | }, 1035 | "safe-buffer": { 1036 | "version": "5.1.2", 1037 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1038 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1039 | "dev": true 1040 | }, 1041 | "sha.js": { 1042 | "version": "2.4.11", 1043 | "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1044 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1045 | "dev": true, 1046 | "requires": { 1047 | "inherits": "^2.0.1", 1048 | "safe-buffer": "^5.0.1" 1049 | } 1050 | }, 1051 | "shasum": { 1052 | "version": "1.0.2", 1053 | "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 1054 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 1055 | "dev": true, 1056 | "requires": { 1057 | "json-stable-stringify": "~0.0.0", 1058 | "sha.js": "~2.4.4" 1059 | } 1060 | }, 1061 | "shell-quote": { 1062 | "version": "1.6.1", 1063 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 1064 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 1065 | "dev": true, 1066 | "requires": { 1067 | "array-filter": "~0.0.0", 1068 | "array-map": "~0.0.0", 1069 | "array-reduce": "~0.0.0", 1070 | "jsonify": "~0.0.0" 1071 | } 1072 | }, 1073 | "source-map": { 1074 | "version": "0.5.7", 1075 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1076 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1077 | "dev": true 1078 | }, 1079 | "stream-browserify": { 1080 | "version": "2.0.1", 1081 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", 1082 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", 1083 | "dev": true, 1084 | "requires": { 1085 | "inherits": "~2.0.1", 1086 | "readable-stream": "^2.0.2" 1087 | } 1088 | }, 1089 | "stream-combiner2": { 1090 | "version": "1.1.1", 1091 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 1092 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 1093 | "dev": true, 1094 | "requires": { 1095 | "duplexer2": "~0.1.0", 1096 | "readable-stream": "^2.0.2" 1097 | } 1098 | }, 1099 | "stream-http": { 1100 | "version": "2.7.2", 1101 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", 1102 | "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", 1103 | "dev": true, 1104 | "requires": { 1105 | "builtin-status-codes": "^3.0.0", 1106 | "inherits": "^2.0.1", 1107 | "readable-stream": "^2.2.6", 1108 | "to-arraybuffer": "^1.0.0", 1109 | "xtend": "^4.0.0" 1110 | } 1111 | }, 1112 | "stream-splicer": { 1113 | "version": "2.0.0", 1114 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", 1115 | "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", 1116 | "dev": true, 1117 | "requires": { 1118 | "inherits": "^2.0.1", 1119 | "readable-stream": "^2.0.2" 1120 | } 1121 | }, 1122 | "string_decoder": { 1123 | "version": "0.10.31", 1124 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1125 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1126 | "dev": true 1127 | }, 1128 | "subarg": { 1129 | "version": "1.0.0", 1130 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1131 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 1132 | "dev": true, 1133 | "requires": { 1134 | "minimist": "^1.1.0" 1135 | } 1136 | }, 1137 | "syntax-error": { 1138 | "version": "1.3.0", 1139 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", 1140 | "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", 1141 | "dev": true, 1142 | "requires": { 1143 | "acorn": "^4.0.3" 1144 | } 1145 | }, 1146 | "through": { 1147 | "version": "2.3.8", 1148 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1149 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1150 | "dev": true 1151 | }, 1152 | "through2": { 1153 | "version": "2.0.3", 1154 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 1155 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 1156 | "dev": true, 1157 | "requires": { 1158 | "readable-stream": "^2.1.5", 1159 | "xtend": "~4.0.1" 1160 | } 1161 | }, 1162 | "timers-browserify": { 1163 | "version": "1.4.2", 1164 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 1165 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 1166 | "dev": true, 1167 | "requires": { 1168 | "process": "~0.11.0" 1169 | } 1170 | }, 1171 | "to-arraybuffer": { 1172 | "version": "1.0.1", 1173 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1174 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 1175 | "dev": true 1176 | }, 1177 | "tty-browserify": { 1178 | "version": "0.0.0", 1179 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 1180 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 1181 | "dev": true 1182 | }, 1183 | "typedarray": { 1184 | "version": "0.0.6", 1185 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1186 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1187 | "dev": true 1188 | }, 1189 | "umd": { 1190 | "version": "3.0.3", 1191 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", 1192 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", 1193 | "dev": true 1194 | }, 1195 | "url": { 1196 | "version": "0.11.0", 1197 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1198 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1199 | "dev": true, 1200 | "requires": { 1201 | "punycode": "1.3.2", 1202 | "querystring": "0.2.0" 1203 | }, 1204 | "dependencies": { 1205 | "punycode": { 1206 | "version": "1.3.2", 1207 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1208 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 1209 | "dev": true 1210 | } 1211 | } 1212 | }, 1213 | "util": { 1214 | "version": "0.10.4", 1215 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1216 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1217 | "dev": true, 1218 | "requires": { 1219 | "inherits": "2.0.3" 1220 | } 1221 | }, 1222 | "util-deprecate": { 1223 | "version": "1.0.2", 1224 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1225 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1226 | "dev": true 1227 | }, 1228 | "vm-browserify": { 1229 | "version": "0.0.4", 1230 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", 1231 | "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", 1232 | "dev": true, 1233 | "requires": { 1234 | "indexof": "0.0.1" 1235 | } 1236 | }, 1237 | "wrappy": { 1238 | "version": "1.0.2", 1239 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1240 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1241 | "dev": true 1242 | }, 1243 | "xtend": { 1244 | "version": "4.0.1", 1245 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1246 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 1247 | "dev": true 1248 | } 1249 | } 1250 | } 1251 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "weapp-polyfill", 3 | "version": "3.2.2", 4 | "description": "Browser API polyfill for Weapp", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "browserify index.js -s weapp-polyfill > weapp-polyfill.js" 8 | }, 9 | "keywords": [ 10 | "weapp", 11 | "polyfill" 12 | ], 13 | "author": "LeanCloud", 14 | "license": "MIT", 15 | "dependencies": { 16 | "event-target-shim": "^1.1.1", 17 | "object-assign": "^4.1.0" 18 | }, 19 | "devDependencies": { 20 | "browserify": "^13.1.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /websocket.js: -------------------------------------------------------------------------------- 1 | const assign = require('object-assign'); 2 | const EventTarget = require('event-target-shim'); 3 | 4 | const CONNECTING = 0; 5 | const OPEN = 1; 6 | const CLOSING = 2; 7 | const CLOSED = 3; 8 | 9 | const EVENTS = [ 10 | 'open', 11 | 'error', 12 | 'message', 13 | 'close', 14 | ]; 15 | 16 | class WebSocket extends EventTarget(EVENTS) { 17 | constructor(url, protocol) { 18 | if (!url) { 19 | throw new TypeError('Failed to construct \'WebSocket\': url required'); 20 | } 21 | if (protocol && !(wx.canIUse && wx.canIUse('connectSocket.object.protocols'))) { 22 | throw new Error('subprotocol not supported in weapp'); 23 | } 24 | super(); 25 | this._url = url; 26 | this._protocol = protocol; 27 | this._readyState = CONNECTING; 28 | 29 | const errorHandler = (event) => { 30 | this._readyState = CLOSED; 31 | this.dispatchEvent({ 32 | type: 'error', 33 | message: event.errMsg, 34 | }); 35 | } 36 | 37 | const socketTask = wx.connectSocket({ 38 | url, 39 | protocols: 40 | this._protocol === undefined || Array.isArray(this._protocol) 41 | ? this._protocol 42 | : [this._protocol], 43 | fail: (error) => setTimeout(() => errorHandler(error), 0), 44 | }); 45 | this._socketTask = socketTask; 46 | 47 | socketTask.onOpen((event) => { 48 | this._readyState = OPEN; 49 | this.dispatchEvent({ 50 | type: 'open' 51 | }); 52 | }); 53 | socketTask.onError(errorHandler); 54 | socketTask.onMessage((event) => { 55 | var { 56 | data, 57 | origin, 58 | ports, 59 | source, 60 | } = event; 61 | this.dispatchEvent({ 62 | data, 63 | origin, 64 | ports, 65 | source, 66 | type: 'message', 67 | }); 68 | }); 69 | socketTask.onClose((event) => { 70 | this._readyState = CLOSED; 71 | var { 72 | code, 73 | reason, 74 | wasClean, 75 | } = event; 76 | this.dispatchEvent({ 77 | code, 78 | reason, 79 | wasClean, 80 | type: 'close', 81 | }); 82 | }); 83 | } 84 | 85 | get url() { 86 | return this._url; 87 | } 88 | get protocol() { 89 | return this._protocol; 90 | } 91 | get readyState() { 92 | return this._readyState; 93 | } 94 | 95 | close() { 96 | if (this.readyState === CLOSED) return; 97 | if (this.readyState === CONNECTING) { 98 | console.warn('close WebSocket which is connecting might not work'); 99 | } 100 | this._socketTask.close(); 101 | } 102 | 103 | send(data) { 104 | if (this.readyState !== OPEN) { 105 | throw new Error('INVALID_STATE_ERR'); 106 | } 107 | 108 | if (!(typeof data === 'string' || data instanceof ArrayBuffer)) { 109 | throw new TypeError('only String/ArrayBuffer supported'); 110 | } 111 | 112 | this._socketTask.send({ 113 | data 114 | }); 115 | } 116 | 117 | } 118 | 119 | assign(WebSocket, { 120 | CONNECTING, 121 | OPEN, 122 | CLOSING, 123 | CLOSED, 124 | }); 125 | 126 | module.exports = WebSocket; 127 | -------------------------------------------------------------------------------- /xmlhttprequest.js: -------------------------------------------------------------------------------- 1 | const assign = require('object-assign'); 2 | const EventTarget = require('event-target-shim'); 3 | const FormData = require('./formdata.js'); 4 | 5 | const UNSENT = 0; 6 | const OPENED = 1; 7 | const HEADERS_RECEIVED = 2; 8 | const LOADING = 3; 9 | const DONE = 4; 10 | 11 | const REQUEST_EVENTS = [ 12 | 'abort', 13 | 'error', 14 | 'load', 15 | 'loadstart', 16 | 'progress', 17 | 'timeout', 18 | 'loadend', 19 | 'readystatechange' 20 | ]; 21 | 22 | const REQUEST_UPLOAD_EVENTS = [ 23 | 'abort', 24 | 'error', 25 | 'load', 26 | 'loadstart', 27 | 'progress', 28 | 'timeout', 29 | 'loadend' 30 | ]; 31 | 32 | 33 | function successCallback(response) { 34 | this.status = response.statusCode; 35 | this.statusText = response.statusCode; 36 | // 基础库 1.2.0 开始支持 37 | if (response.header) { 38 | this._responseHeaders = Object.keys(response.header).reduce((headers, key) => { 39 | headers[key.toLowerCase()] = response.header[key]; 40 | return headers; 41 | }, {}); 42 | } 43 | let text = response.data; 44 | if (typeof text !== 'string') { 45 | text = JSON.stringify(text); 46 | } 47 | this.responseText = this.response = text; 48 | this.readyState = DONE; 49 | this.dispatchEvent({ type: 'readystatechange' }); 50 | } 51 | 52 | class XMLHttpRequestUpload extends EventTarget(REQUEST_UPLOAD_EVENTS) {} 53 | 54 | class XMLHttpRequest extends EventTarget(REQUEST_EVENTS) { 55 | 56 | constructor() { 57 | super(); 58 | this.readyState = UNSENT; 59 | this._headers = {}; 60 | this.upload = new XMLHttpRequestUpload(); 61 | } 62 | 63 | abort() { 64 | // 基础库 1.4.0 开始支持 65 | if (!(this._request) || this._request.abort) { 66 | this.status = 0; 67 | this.readyState = DONE; 68 | return this._request.abort(); 69 | } 70 | throw new Error('该版本基础库不支持 abort request'); 71 | } 72 | getAllResponseHeaders() { 73 | return this._responseHeaders ? Object.keys(this._responseHeaders).map(key => `${key}: ${this._responseHeaders[key]}`).join('\r\n') : ''; 74 | } 75 | getResponseHeader(key) { 76 | const lowserCasedKey = key.toLowerCase(); 77 | if (this._responseHeaders && this._responseHeaders[lowserCasedKey]) { 78 | return this._responseHeaders[lowserCasedKey]; 79 | } 80 | return null; 81 | } 82 | overrideMimeType() { 83 | throw new Error('not supported in weapp'); 84 | } 85 | open(method, url, async = true) { 86 | if (this.readyState !== UNSENT) { 87 | throw new Error('request is already opened'); 88 | } 89 | if (!async) { 90 | throw new Error('sync request is not supported'); 91 | } 92 | this._method = method; 93 | this._url = url; 94 | this.readyState = OPENED; 95 | this.dispatchEvent({ type: 'readystatechange' }); 96 | } 97 | setRequestHeader(header, value) { 98 | if (this.readyState !== OPENED) { 99 | throw new Error('request is not opened'); 100 | } 101 | this._headers[header.toLowerCase()] = value; 102 | } 103 | send(data) { 104 | if (this.readyState !== OPENED) { 105 | throw new Error('request is not opened'); 106 | } 107 | if (data instanceof FormData) { 108 | const entries = data.entries(); 109 | const blobs = entries.filter(entry => typeof entry[1] !== 'string'); 110 | if (blobs.length === 0) { 111 | throw new Error('Must specify a Blob field in FormData'); 112 | } 113 | if (blobs.length > 1) { 114 | console.warn('Only the first Blob will be send in Weapp'); 115 | } 116 | const restData = entries 117 | .filter(entry => typeof entry[1] === 'string') 118 | .reduce((result, entry) => assign(result, { [entry[0]]: entry[1] }), {}); 119 | this._request = wx.uploadFile({ 120 | url: this._url, 121 | name: blobs[0][0], 122 | filePath: blobs[0][1].uri, 123 | formData: restData, 124 | header: this._headers, 125 | success: successCallback.bind(this), 126 | fail: (error) => { 127 | this.status = 0; 128 | this.readyState = DONE; 129 | this.dispatchEvent({ type: 'readystatechange' }); 130 | this.dispatchEvent({ type: 'error' }); 131 | } 132 | }); 133 | // 基础库 1.4.0 开始支持 134 | if (this._request && this._request.onProgressUpdate) { 135 | this._request.onProgressUpdate(({ 136 | totalBytesSent, 137 | totalBytesExpectedToSend, 138 | }) => { 139 | this.upload.dispatchEvent({ 140 | type: 'progress', 141 | loaded: totalBytesSent, 142 | total: totalBytesExpectedToSend, 143 | }); 144 | }); 145 | } 146 | } else { 147 | this._request = wx.request({ 148 | url: this._url, 149 | data: data || '', 150 | // method 的 value 居然必须为大写 151 | method: this._method.toUpperCase(), 152 | header: this._headers, 153 | success: successCallback.bind(this), 154 | fail: (error) => { 155 | this.status = 0; 156 | this.readyState = DONE; 157 | this.dispatchEvent({ type: 'readystatechange' }); 158 | this.dispatchEvent({ type: 'error' }); 159 | } 160 | }); 161 | } 162 | } 163 | } 164 | 165 | assign(XMLHttpRequest, { 166 | UNSENT, 167 | OPENED, 168 | HEADERS_RECEIVED, 169 | LOADING, 170 | DONE, 171 | }); 172 | 173 | module.exports = XMLHttpRequest; 174 | --------------------------------------------------------------------------------