├── .gitignore ├── .travis.yml ├── README.md ├── bin └── bridgit.js ├── package-lock.json ├── package.json ├── src ├── commands │ ├── config.js │ └── hawk.js ├── config │ └── defaults.json ├── constants │ └── index.js ├── index.js ├── middlewares │ └── hawk.js └── utils │ ├── index.js │ ├── logger.js │ ├── mergeConfiguration.js │ └── startServer.js └── test ├── helpers └── index.js └── unit ├── commands ├── config.spec.js └── hawk.spec.js ├── index.spec.js └── utils ├── index.spec.js ├── logger.spec.js └── mergeConfiguration.spec.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug* 4 | coverage 5 | tmp.* -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '7' 4 | deploy: 5 | provider: npm 6 | email: jingkai.zhao@foxmail.com 7 | api_key: 8 | secure: rT0/T2eUMyxdD2KbUt3kDfUs9Q7aqtuhPD+T5oyOJUtaPkPXLUv0ykKPfKw9k6jGpPuvc/Go00rpewaovbrVNCbaq8IrWUQnyB0dGMfz3dOCVYoQCyJH9Z9re9FmQ6PPtwxtk/8SvLKdLhnsEXjBdLmP7UXx5lCGtJkSn0XAG75QHQu0Nd7FPo0eTnHhJKqVSw7tzWpLLZqPnN6ByIUmgeNsPnSb3sp2bxFS8KaggT6RI9EEp3fPUMKcIVDrumX2Aqf9mfgJ8A5IcTKx0J9vC/a9pc9uSMyNZp8JuHsgftarze7CA/LkleL8HmtUX/QSKAnMpvy1T3bzSKRj8nIcelXJLcudJyxpQj8NGg0n21exJTPYxK+iNEcEo9seOvxUVLuX51pe4Bov/vxsS98X47/dkRjGBYFhOFLEsPwgr9XxvDklgqsOPKy1x6o7A2eq5A6/NYHzGXWRC9+cWzGfmuM7XpLUfEFjrN1U+Fv2sfkDv981+r3Z6lPDjrmQigjqDf6chtuxoDlMTMRuGX2j8AF/BKBK9iq8yYW8UfY2/Mia2F0hRh6YEHF7H78GpRLlZ7jSi2LgXVPIFif4zPYwtxnxzUUMtazW0RMWvSgZz8zi7VQQkPxYV4rvZIxbpHUZ0oydDBZaPUbhpY7ye91JYi8/jnOoWoysmCHedWxJkYU= 9 | on: 10 | repo: jkzing/bridgit 11 | tags: true 12 | branch: master 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bridgit 2 | 3 | [![npm version](https://badge.fury.io/js/bridgit.svg)](https://badge.fury.io/js/bridgit) 4 | [![Build Status](https://travis-ci.org/jkzing/bridgit.svg?branch=master)](https://travis-ci.org/jkzing/bridgit) 5 | [![Coverage Status](https://coveralls.io/repos/github/jkzing/bridgit/badge.svg?branch=master)](https://coveralls.io/github/jkzing/bridgit?branch=master) 6 | 7 | bridgit is a proxy server intend to forward http request to a server with authentication. 8 | 9 | Support different authentication protocol. (hawk for now) 10 | 11 | # Installation 12 | 13 | ``` 14 | npm install -g bridgit 15 | ``` 16 | 17 | # Commands 18 | 19 | ## hawk 20 | 21 | Simply use follow command to start the proxy server for hawk authentication. 22 | 23 | ``` bash 24 | bridgit hawk 25 | ``` 26 | 27 | Initially, the proxy server would intercept request from http://127.0.0.1:3000, 28 | encrypt the request with hawk, 29 | add the authentication artifact in request header as `Authorization`, 30 | and foward it to the same uri at http://127.0.0.1:8000. 31 | 32 | So you can call your RESTful API at http://127.0.0.1:3000/your_api_uri now. 33 | 34 | There are several options you can use to customize the proxy server: 35 | 36 | ``` bash 37 | bridgit hawk 38 | [-o, --origin=] # origin to forward 39 | [-p, --port=] # server port for bridgit to listen on 40 | [-P, --prefix=] # auth header prefix 41 | [-i, --id=] # hawk credentials id 42 | [-k, --key=] # hawk crendentials key 43 | [-a, --algorithm=] # hawk algorithm 44 | [-E, --encrypt-payload=] # should include payload when encrypt 45 | [-c, --config=] # With a specified config file path 46 | ``` 47 | You can also use `bridgit hawk --help` to view available options. 48 | 49 | Here are some usage examples: 50 | 51 | ### Use with options 52 | ``` bash 53 | bridgit hawk -i your_id -k your_key -o http://www.google.com 54 | ``` 55 | Will start hawk server with `your_id` and `your_key`, then proxy request to `http://www.google.com`. 56 | 57 | ### Use with config file 58 | ``` bash 59 | bridgit hawk -c ~/config.json 60 | ``` 61 | Will load ~/config.json as your configuration, and keep global config as defaults. 62 | 63 | > NOTE: the config file you are using is considered in JSON format, please ensure that. 64 | 65 | 66 | ## config 67 | 68 | > From 1.1.0, default configuration file will be generated under your $HOME directory, named .bridgit.json. 69 | 70 | ### set/get global configurations 71 | 72 | `bridgit config set ` 73 | or 74 | `bridgit config get ` 75 | 76 | Here `key` can be any support option in proxy server command (like hawk). 77 | 78 | ``` bash 79 | bridgit config set id your_id # store your_id as id in config file 80 | bridgit config set port 4000 # store 4000 as port in config file 81 | bridgit config get port # print current port config 82 | bridgit config get # print all key-values in config file 83 | ``` 84 | 85 | > NOTE: You should only use fullname for options to set config, shortland name will not take effect. 86 | 87 | 88 | PS: The options' priority is higher than config file. For example: 89 | 90 | ``` bash 91 | bridgit config set id id_config 92 | bridgit hawk --id=id_option 93 | ``` 94 | Will result in proxy server using `id_options` as hawk id. 95 | 96 | ### generate an empty config file 97 | ``` bash 98 | bridgit config new ~/your_config.json 99 | ``` 100 | Will create a new empty config file @~/your_config.json. 101 | 102 | # Todo 103 | 104 | * Test cases coverage 105 | * Support OAuth2 106 | -------------------------------------------------------------------------------- /bin/bridgit.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const bridgit = require('../src/index'); 4 | 5 | bridgit(); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bridgit", 3 | "version": "1.2.2", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "abab": { 7 | "version": "1.0.3", 8 | "resolved": "http://registry.npm.taobao.org/abab/download/abab-1.0.3.tgz", 9 | "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=" 10 | }, 11 | "accepts": { 12 | "version": "1.3.3", 13 | "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.3.tgz", 14 | "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=" 15 | }, 16 | "acorn": { 17 | "version": "4.0.13", 18 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz", 19 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" 20 | }, 21 | "acorn-globals": { 22 | "version": "3.1.0", 23 | "resolved": "http://registry.npm.taobao.org/acorn-globals/download/acorn-globals-3.1.0.tgz", 24 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=" 25 | }, 26 | "ajv": { 27 | "version": "4.11.8", 28 | "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-4.11.8.tgz", 29 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" 30 | }, 31 | "align-text": { 32 | "version": "0.1.4", 33 | "resolved": "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", 34 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=" 35 | }, 36 | "amdefine": { 37 | "version": "1.0.1", 38 | "resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", 39 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 40 | }, 41 | "ansi-escapes": { 42 | "version": "1.4.0", 43 | "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz", 44 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" 45 | }, 46 | "ansi-regex": { 47 | "version": "2.1.1", 48 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", 49 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 50 | }, 51 | "ansi-styles": { 52 | "version": "2.2.1", 53 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", 54 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 55 | }, 56 | "any-promise": { 57 | "version": "1.3.0", 58 | "resolved": "http://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz", 59 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 60 | }, 61 | "anymatch": { 62 | "version": "1.3.0", 63 | "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-1.3.0.tgz", 64 | "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=" 65 | }, 66 | "append-transform": { 67 | "version": "0.4.0", 68 | "resolved": "http://registry.npm.taobao.org/append-transform/download/append-transform-0.4.0.tgz", 69 | "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=" 70 | }, 71 | "argparse": { 72 | "version": "1.0.9", 73 | "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz", 74 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=" 75 | }, 76 | "arr-diff": { 77 | "version": "2.0.0", 78 | "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz", 79 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=" 80 | }, 81 | "arr-flatten": { 82 | "version": "1.0.3", 83 | "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.0.3.tgz", 84 | "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=" 85 | }, 86 | "array-equal": { 87 | "version": "1.0.0", 88 | "resolved": "http://registry.npm.taobao.org/array-equal/download/array-equal-1.0.0.tgz", 89 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 90 | }, 91 | "array-unique": { 92 | "version": "0.2.1", 93 | "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz", 94 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" 95 | }, 96 | "arrify": { 97 | "version": "1.0.1", 98 | "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz", 99 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 100 | }, 101 | "asn1": { 102 | "version": "0.2.3", 103 | "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.3.tgz", 104 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 105 | }, 106 | "assert-plus": { 107 | "version": "0.2.0", 108 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-0.2.0.tgz", 109 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 110 | }, 111 | "async": { 112 | "version": "2.4.1", 113 | "resolved": "http://registry.npm.taobao.org/async/download/async-2.4.1.tgz", 114 | "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=" 115 | }, 116 | "asynckit": { 117 | "version": "0.4.0", 118 | "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", 119 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 120 | }, 121 | "aws-sign2": { 122 | "version": "0.6.0", 123 | "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.6.0.tgz", 124 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 125 | }, 126 | "aws4": { 127 | "version": "1.6.0", 128 | "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz", 129 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 130 | }, 131 | "babel-code-frame": { 132 | "version": "6.22.0", 133 | "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.22.0.tgz", 134 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=" 135 | }, 136 | "babel-core": { 137 | "version": "6.25.0", 138 | "resolved": "http://registry.npm.taobao.org/babel-core/download/babel-core-6.25.0.tgz", 139 | "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=" 140 | }, 141 | "babel-generator": { 142 | "version": "6.25.0", 143 | "resolved": "http://registry.npm.taobao.org/babel-generator/download/babel-generator-6.25.0.tgz", 144 | "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=" 145 | }, 146 | "babel-helpers": { 147 | "version": "6.24.1", 148 | "resolved": "http://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz", 149 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" 150 | }, 151 | "babel-jest": { 152 | "version": "20.0.3", 153 | "resolved": "http://registry.npm.taobao.org/babel-jest/download/babel-jest-20.0.3.tgz", 154 | "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=" 155 | }, 156 | "babel-messages": { 157 | "version": "6.23.0", 158 | "resolved": "http://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz", 159 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" 160 | }, 161 | "babel-plugin-istanbul": { 162 | "version": "4.1.4", 163 | "resolved": "http://registry.npm.taobao.org/babel-plugin-istanbul/download/babel-plugin-istanbul-4.1.4.tgz", 164 | "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=" 165 | }, 166 | "babel-plugin-jest-hoist": { 167 | "version": "20.0.3", 168 | "resolved": "http://registry.npm.taobao.org/babel-plugin-jest-hoist/download/babel-plugin-jest-hoist-20.0.3.tgz", 169 | "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" 170 | }, 171 | "babel-preset-jest": { 172 | "version": "20.0.3", 173 | "resolved": "http://registry.npm.taobao.org/babel-preset-jest/download/babel-preset-jest-20.0.3.tgz", 174 | "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=" 175 | }, 176 | "babel-register": { 177 | "version": "6.24.1", 178 | "resolved": "http://registry.npm.taobao.org/babel-register/download/babel-register-6.24.1.tgz", 179 | "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=" 180 | }, 181 | "babel-runtime": { 182 | "version": "6.23.0", 183 | "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.23.0.tgz", 184 | "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=" 185 | }, 186 | "babel-template": { 187 | "version": "6.25.0", 188 | "resolved": "http://registry.npm.taobao.org/babel-template/download/babel-template-6.25.0.tgz", 189 | "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=" 190 | }, 191 | "babel-traverse": { 192 | "version": "6.25.0", 193 | "resolved": "http://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.25.0.tgz", 194 | "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" 195 | }, 196 | "babel-types": { 197 | "version": "6.25.0", 198 | "resolved": "http://registry.npm.taobao.org/babel-types/download/babel-types-6.25.0.tgz", 199 | "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" 200 | }, 201 | "babylon": { 202 | "version": "6.17.2", 203 | "resolved": "http://registry.npm.taobao.org/babylon/download/babylon-6.17.2.tgz", 204 | "integrity": "sha1-IB0l71+JLEG65JSIsI2w3Udun1w=" 205 | }, 206 | "balanced-match": { 207 | "version": "0.4.2", 208 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz", 209 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" 210 | }, 211 | "bcrypt-pbkdf": { 212 | "version": "1.0.1", 213 | "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz", 214 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 215 | "optional": true 216 | }, 217 | "boom": { 218 | "version": "2.10.1", 219 | "resolved": "http://registry.npm.taobao.org/boom/download/boom-2.10.1.tgz", 220 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" 221 | }, 222 | "brace-expansion": { 223 | "version": "1.1.7", 224 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.7.tgz", 225 | "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=" 226 | }, 227 | "braces": { 228 | "version": "1.8.5", 229 | "resolved": "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz", 230 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=" 231 | }, 232 | "browser-resolve": { 233 | "version": "1.11.2", 234 | "resolved": "http://registry.npm.taobao.org/browser-resolve/download/browser-resolve-1.11.2.tgz", 235 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 236 | "dependencies": { 237 | "resolve": { 238 | "version": "1.1.7", 239 | "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.1.7.tgz", 240 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 241 | } 242 | } 243 | }, 244 | "bser": { 245 | "version": "2.0.0", 246 | "resolved": "http://registry.npm.taobao.org/bser/download/bser-2.0.0.tgz", 247 | "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=" 248 | }, 249 | "builtin-modules": { 250 | "version": "1.1.1", 251 | "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", 252 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 253 | }, 254 | "bytes": { 255 | "version": "2.4.0", 256 | "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-2.4.0.tgz", 257 | "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" 258 | }, 259 | "callsites": { 260 | "version": "2.0.0", 261 | "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", 262 | "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" 263 | }, 264 | "camelcase": { 265 | "version": "1.2.1", 266 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", 267 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 268 | "optional": true 269 | }, 270 | "caseless": { 271 | "version": "0.12.0", 272 | "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", 273 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 274 | }, 275 | "center-align": { 276 | "version": "0.1.3", 277 | "resolved": "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", 278 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 279 | "optional": true 280 | }, 281 | "chalk": { 282 | "version": "1.1.3", 283 | "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", 284 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" 285 | }, 286 | "ci-info": { 287 | "version": "1.0.0", 288 | "resolved": "http://registry.npm.taobao.org/ci-info/download/ci-info-1.0.0.tgz", 289 | "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" 290 | }, 291 | "cliui": { 292 | "version": "2.1.0", 293 | "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", 294 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 295 | "optional": true, 296 | "dependencies": { 297 | "wordwrap": { 298 | "version": "0.0.2", 299 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", 300 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 301 | "optional": true 302 | } 303 | } 304 | }, 305 | "co": { 306 | "version": "4.6.0", 307 | "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz", 308 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 309 | }, 310 | "co-body": { 311 | "version": "5.1.1", 312 | "resolved": "http://registry.npm.taobao.org/co-body/download/co-body-5.1.1.tgz", 313 | "integrity": "sha1-2XeB0eM0S6SoIP0YBr3fg0FQUjY=" 314 | }, 315 | "code-point-at": { 316 | "version": "1.1.0", 317 | "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", 318 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 319 | }, 320 | "color-convert": { 321 | "version": "1.9.0", 322 | "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.0.tgz", 323 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=" 324 | }, 325 | "color-name": { 326 | "version": "1.1.2", 327 | "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.2.tgz", 328 | "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=" 329 | }, 330 | "combined-stream": { 331 | "version": "1.0.5", 332 | "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz", 333 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" 334 | }, 335 | "commander": { 336 | "version": "2.9.0", 337 | "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.9.0.tgz", 338 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=" 339 | }, 340 | "composition": { 341 | "version": "2.3.0", 342 | "resolved": "http://registry.npm.taobao.org/composition/download/composition-2.3.0.tgz", 343 | "integrity": "sha1-dCgFN0yrVQxSCjNmL1pzLgII1vI=" 344 | }, 345 | "concat-map": { 346 | "version": "0.0.1", 347 | "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 348 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 349 | }, 350 | "console.table": { 351 | "version": "0.8.0", 352 | "resolved": "http://registry.npm.taobao.org/console.table/download/console.table-0.8.0.tgz", 353 | "integrity": "sha1-aekdLqv8ztmgyHfqZwslHGvb018=" 354 | }, 355 | "content-disposition": { 356 | "version": "0.5.2", 357 | "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz", 358 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 359 | }, 360 | "content-type": { 361 | "version": "1.0.2", 362 | "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.2.tgz", 363 | "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" 364 | }, 365 | "content-type-parser": { 366 | "version": "1.0.1", 367 | "resolved": "http://registry.npm.taobao.org/content-type-parser/download/content-type-parser-1.0.1.tgz", 368 | "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=" 369 | }, 370 | "convert-source-map": { 371 | "version": "1.5.0", 372 | "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.5.0.tgz", 373 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" 374 | }, 375 | "cookies": { 376 | "version": "0.7.0", 377 | "resolved": "http://registry.npm.taobao.org/cookies/download/cookies-0.7.0.tgz", 378 | "integrity": "sha1-C8lh2RDDUlSYD8fJ7/XaEgEbvwA=" 379 | }, 380 | "copy-to": { 381 | "version": "2.0.1", 382 | "resolved": "http://registry.npm.taobao.org/copy-to/download/copy-to-2.0.1.tgz", 383 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 384 | }, 385 | "core-js": { 386 | "version": "2.4.1", 387 | "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.4.1.tgz", 388 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" 389 | }, 390 | "coveralls": { 391 | "version": "2.13.1", 392 | "resolved": "http://registry.npm.taobao.org/coveralls/download/coveralls-2.13.1.tgz", 393 | "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", 394 | "dependencies": { 395 | "caseless": { 396 | "version": "0.11.0", 397 | "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.11.0.tgz", 398 | "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" 399 | }, 400 | "har-validator": { 401 | "version": "2.0.6", 402 | "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-2.0.6.tgz", 403 | "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=" 404 | }, 405 | "qs": { 406 | "version": "6.3.2", 407 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.3.2.tgz", 408 | "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" 409 | }, 410 | "request": { 411 | "version": "2.79.0", 412 | "resolved": "http://registry.npm.taobao.org/request/download/request-2.79.0.tgz", 413 | "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=" 414 | }, 415 | "tunnel-agent": { 416 | "version": "0.4.3", 417 | "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.4.3.tgz", 418 | "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" 419 | } 420 | } 421 | }, 422 | "cryptiles": { 423 | "version": "2.0.5", 424 | "resolved": "http://registry.npm.taobao.org/cryptiles/download/cryptiles-2.0.5.tgz", 425 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" 426 | }, 427 | "cssom": { 428 | "version": "0.3.2", 429 | "resolved": "http://registry.npm.taobao.org/cssom/download/cssom-0.3.2.tgz", 430 | "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" 431 | }, 432 | "cssstyle": { 433 | "version": "0.2.37", 434 | "resolved": "http://registry.npm.taobao.org/cssstyle/download/cssstyle-0.2.37.tgz", 435 | "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=" 436 | }, 437 | "dashdash": { 438 | "version": "1.14.1", 439 | "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", 440 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 441 | "dependencies": { 442 | "assert-plus": { 443 | "version": "1.0.0", 444 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 445 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 446 | } 447 | } 448 | }, 449 | "debug": { 450 | "version": "2.6.8", 451 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.8.tgz", 452 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" 453 | }, 454 | "decamelize": { 455 | "version": "1.2.0", 456 | "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", 457 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 458 | }, 459 | "deep-equal": { 460 | "version": "1.0.1", 461 | "resolved": "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz", 462 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 463 | }, 464 | "deep-is": { 465 | "version": "0.1.3", 466 | "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", 467 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 468 | }, 469 | "default-require-extensions": { 470 | "version": "1.0.0", 471 | "resolved": "http://registry.npm.taobao.org/default-require-extensions/download/default-require-extensions-1.0.0.tgz", 472 | "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=" 473 | }, 474 | "delayed-stream": { 475 | "version": "1.0.0", 476 | "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", 477 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 478 | }, 479 | "delegates": { 480 | "version": "1.0.0", 481 | "resolved": "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz", 482 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 483 | }, 484 | "depd": { 485 | "version": "1.1.0", 486 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.0.tgz", 487 | "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" 488 | }, 489 | "destroy": { 490 | "version": "1.0.4", 491 | "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", 492 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 493 | }, 494 | "detect-indent": { 495 | "version": "4.0.0", 496 | "resolved": "http://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz", 497 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" 498 | }, 499 | "diff": { 500 | "version": "3.2.0", 501 | "resolved": "http://registry.npm.taobao.org/diff/download/diff-3.2.0.tgz", 502 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" 503 | }, 504 | "double-ended-queue": { 505 | "version": "2.1.0-0", 506 | "resolved": "http://registry.npm.taobao.org/double-ended-queue/download/double-ended-queue-2.1.0-0.tgz", 507 | "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" 508 | }, 509 | "easy-table": { 510 | "version": "1.0.0", 511 | "resolved": "http://registry.npm.taobao.org/easy-table/download/easy-table-1.0.0.tgz", 512 | "integrity": "sha1-KdstCFXTYxbkOC5aPYXZy1/JMhY=" 513 | }, 514 | "ecc-jsbn": { 515 | "version": "0.1.1", 516 | "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz", 517 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 518 | "optional": true 519 | }, 520 | "ee-first": { 521 | "version": "1.1.1", 522 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", 523 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 524 | }, 525 | "errno": { 526 | "version": "0.1.4", 527 | "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.4.tgz", 528 | "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=" 529 | }, 530 | "error-ex": { 531 | "version": "1.3.1", 532 | "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz", 533 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" 534 | }, 535 | "error-inject": { 536 | "version": "1.0.0", 537 | "resolved": "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz", 538 | "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" 539 | }, 540 | "escape-html": { 541 | "version": "1.0.3", 542 | "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", 543 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 544 | }, 545 | "escape-string-regexp": { 546 | "version": "1.0.5", 547 | "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 548 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 549 | }, 550 | "escodegen": { 551 | "version": "1.8.1", 552 | "resolved": "http://registry.npm.taobao.org/escodegen/download/escodegen-1.8.1.tgz", 553 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 554 | "dependencies": { 555 | "source-map": { 556 | "version": "0.2.0", 557 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.2.0.tgz", 558 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 559 | "optional": true 560 | } 561 | } 562 | }, 563 | "esprima": { 564 | "version": "2.7.3", 565 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz", 566 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" 567 | }, 568 | "estraverse": { 569 | "version": "1.9.3", 570 | "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-1.9.3.tgz", 571 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" 572 | }, 573 | "esutils": { 574 | "version": "2.0.2", 575 | "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", 576 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 577 | }, 578 | "exec-sh": { 579 | "version": "0.2.0", 580 | "resolved": "http://registry.npm.taobao.org/exec-sh/download/exec-sh-0.2.0.tgz", 581 | "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=" 582 | }, 583 | "expand-brackets": { 584 | "version": "0.1.5", 585 | "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz", 586 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=" 587 | }, 588 | "expand-range": { 589 | "version": "1.8.2", 590 | "resolved": "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz", 591 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=" 592 | }, 593 | "extend": { 594 | "version": "3.0.1", 595 | "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz", 596 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 597 | }, 598 | "extglob": { 599 | "version": "0.3.2", 600 | "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz", 601 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=" 602 | }, 603 | "extsprintf": { 604 | "version": "1.0.2", 605 | "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.0.2.tgz", 606 | "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" 607 | }, 608 | "fast-levenshtein": { 609 | "version": "2.0.6", 610 | "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", 611 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 612 | }, 613 | "fb-watchman": { 614 | "version": "2.0.0", 615 | "resolved": "http://registry.npm.taobao.org/fb-watchman/download/fb-watchman-2.0.0.tgz", 616 | "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=" 617 | }, 618 | "filename-regex": { 619 | "version": "2.0.1", 620 | "resolved": "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz", 621 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" 622 | }, 623 | "fileset": { 624 | "version": "2.0.3", 625 | "resolved": "http://registry.npm.taobao.org/fileset/download/fileset-2.0.3.tgz", 626 | "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=" 627 | }, 628 | "fill-range": { 629 | "version": "2.2.3", 630 | "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz", 631 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=" 632 | }, 633 | "find-up": { 634 | "version": "2.1.0", 635 | "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", 636 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" 637 | }, 638 | "for-in": { 639 | "version": "1.0.2", 640 | "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", 641 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 642 | }, 643 | "for-own": { 644 | "version": "0.1.5", 645 | "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz", 646 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=" 647 | }, 648 | "forever-agent": { 649 | "version": "0.6.1", 650 | "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", 651 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 652 | }, 653 | "form-data": { 654 | "version": "2.1.4", 655 | "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.1.4.tgz", 656 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" 657 | }, 658 | "fresh": { 659 | "version": "0.3.0", 660 | "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz", 661 | "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" 662 | }, 663 | "fs.realpath": { 664 | "version": "1.0.0", 665 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 666 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 667 | }, 668 | "generate-function": { 669 | "version": "2.0.0", 670 | "resolved": "http://registry.npm.taobao.org/generate-function/download/generate-function-2.0.0.tgz", 671 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" 672 | }, 673 | "generate-object-property": { 674 | "version": "1.2.0", 675 | "resolved": "http://registry.npm.taobao.org/generate-object-property/download/generate-object-property-1.2.0.tgz", 676 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=" 677 | }, 678 | "get-caller-file": { 679 | "version": "1.0.2", 680 | "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.2.tgz", 681 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" 682 | }, 683 | "getpass": { 684 | "version": "0.1.7", 685 | "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", 686 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 687 | "dependencies": { 688 | "assert-plus": { 689 | "version": "1.0.0", 690 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 691 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 692 | } 693 | } 694 | }, 695 | "glob": { 696 | "version": "7.1.2", 697 | "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", 698 | "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=" 699 | }, 700 | "glob-base": { 701 | "version": "0.3.0", 702 | "resolved": "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz", 703 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=" 704 | }, 705 | "glob-parent": { 706 | "version": "2.0.0", 707 | "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz", 708 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=" 709 | }, 710 | "globals": { 711 | "version": "9.18.0", 712 | "resolved": "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz", 713 | "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" 714 | }, 715 | "graceful-fs": { 716 | "version": "4.1.11", 717 | "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", 718 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 719 | }, 720 | "graceful-readlink": { 721 | "version": "1.0.1", 722 | "resolved": "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz", 723 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 724 | }, 725 | "growly": { 726 | "version": "1.3.0", 727 | "resolved": "http://registry.npm.taobao.org/growly/download/growly-1.3.0.tgz", 728 | "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" 729 | }, 730 | "handlebars": { 731 | "version": "4.0.10", 732 | "resolved": "http://registry.npm.taobao.org/handlebars/download/handlebars-4.0.10.tgz", 733 | "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", 734 | "dependencies": { 735 | "async": { 736 | "version": "1.5.2", 737 | "resolved": "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz", 738 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 739 | }, 740 | "source-map": { 741 | "version": "0.4.4", 742 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", 743 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=" 744 | } 745 | } 746 | }, 747 | "har-schema": { 748 | "version": "1.0.5", 749 | "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-1.0.5.tgz", 750 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 751 | }, 752 | "har-validator": { 753 | "version": "4.2.1", 754 | "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-4.2.1.tgz", 755 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" 756 | }, 757 | "has-ansi": { 758 | "version": "2.0.0", 759 | "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", 760 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" 761 | }, 762 | "has-flag": { 763 | "version": "1.0.0", 764 | "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", 765 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" 766 | }, 767 | "hawk": { 768 | "version": "3.1.3", 769 | "resolved": "http://registry.npm.taobao.org/hawk/download/hawk-3.1.3.tgz", 770 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" 771 | }, 772 | "hoek": { 773 | "version": "2.16.3", 774 | "resolved": "http://registry.npm.taobao.org/hoek/download/hoek-2.16.3.tgz", 775 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 776 | }, 777 | "home-or-tmp": { 778 | "version": "2.0.0", 779 | "resolved": "http://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz", 780 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" 781 | }, 782 | "hosted-git-info": { 783 | "version": "2.4.2", 784 | "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.4.2.tgz", 785 | "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" 786 | }, 787 | "html-encoding-sniffer": { 788 | "version": "1.0.1", 789 | "resolved": "http://registry.npm.taobao.org/html-encoding-sniffer/download/html-encoding-sniffer-1.0.1.tgz", 790 | "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=" 791 | }, 792 | "http-assert": { 793 | "version": "1.3.0", 794 | "resolved": "http://registry.npm.taobao.org/http-assert/download/http-assert-1.3.0.tgz", 795 | "integrity": "sha1-oxpc+IyHPsu1eWkH1NbxMujAHko=" 796 | }, 797 | "http-errors": { 798 | "version": "1.6.1", 799 | "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.1.tgz", 800 | "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=" 801 | }, 802 | "http-signature": { 803 | "version": "1.1.1", 804 | "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.1.1.tgz", 805 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" 806 | }, 807 | "iconv-lite": { 808 | "version": "0.4.15", 809 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.15.tgz", 810 | "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" 811 | }, 812 | "inflation": { 813 | "version": "2.0.0", 814 | "resolved": "http://registry.npm.taobao.org/inflation/download/inflation-2.0.0.tgz", 815 | "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" 816 | }, 817 | "inflight": { 818 | "version": "1.0.6", 819 | "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 820 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 821 | }, 822 | "inherits": { 823 | "version": "2.0.3", 824 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 825 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 826 | }, 827 | "invariant": { 828 | "version": "2.2.2", 829 | "resolved": "http://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz", 830 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=" 831 | }, 832 | "invert-kv": { 833 | "version": "1.0.0", 834 | "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", 835 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 836 | }, 837 | "is-arrayish": { 838 | "version": "0.2.1", 839 | "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", 840 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 841 | }, 842 | "is-buffer": { 843 | "version": "1.1.5", 844 | "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.5.tgz", 845 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" 846 | }, 847 | "is-builtin-module": { 848 | "version": "1.0.0", 849 | "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", 850 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" 851 | }, 852 | "is-ci": { 853 | "version": "1.0.10", 854 | "resolved": "http://registry.npm.taobao.org/is-ci/download/is-ci-1.0.10.tgz", 855 | "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=" 856 | }, 857 | "is-dotfile": { 858 | "version": "1.0.3", 859 | "resolved": "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz", 860 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" 861 | }, 862 | "is-equal-shallow": { 863 | "version": "0.1.3", 864 | "resolved": "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", 865 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=" 866 | }, 867 | "is-extendable": { 868 | "version": "0.1.1", 869 | "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", 870 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 871 | }, 872 | "is-extglob": { 873 | "version": "1.0.0", 874 | "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", 875 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" 876 | }, 877 | "is-finite": { 878 | "version": "1.0.2", 879 | "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz", 880 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" 881 | }, 882 | "is-fullwidth-code-point": { 883 | "version": "1.0.0", 884 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", 885 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" 886 | }, 887 | "is-glob": { 888 | "version": "2.0.1", 889 | "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", 890 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=" 891 | }, 892 | "is-my-json-valid": { 893 | "version": "2.16.0", 894 | "resolved": "http://registry.npm.taobao.org/is-my-json-valid/download/is-my-json-valid-2.16.0.tgz", 895 | "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=" 896 | }, 897 | "is-number": { 898 | "version": "2.1.0", 899 | "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", 900 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=" 901 | }, 902 | "is-posix-bracket": { 903 | "version": "0.1.1", 904 | "resolved": "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", 905 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" 906 | }, 907 | "is-primitive": { 908 | "version": "2.0.0", 909 | "resolved": "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz", 910 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" 911 | }, 912 | "is-property": { 913 | "version": "1.0.2", 914 | "resolved": "http://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz", 915 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 916 | }, 917 | "is-typedarray": { 918 | "version": "1.0.0", 919 | "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", 920 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 921 | }, 922 | "is-utf8": { 923 | "version": "0.2.1", 924 | "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", 925 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 926 | }, 927 | "isarray": { 928 | "version": "1.0.0", 929 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", 930 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 931 | }, 932 | "isexe": { 933 | "version": "2.0.0", 934 | "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", 935 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 936 | }, 937 | "isobject": { 938 | "version": "2.1.0", 939 | "resolved": "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", 940 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" 941 | }, 942 | "isstream": { 943 | "version": "0.1.2", 944 | "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", 945 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 946 | }, 947 | "istanbul-api": { 948 | "version": "1.1.9", 949 | "resolved": "http://registry.npm.taobao.org/istanbul-api/download/istanbul-api-1.1.9.tgz", 950 | "integrity": "sha1-KCeSDTgNQobYV9V6KWioQduKfsg=", 951 | "dependencies": { 952 | "esprima": { 953 | "version": "3.1.3", 954 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", 955 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 956 | }, 957 | "js-yaml": { 958 | "version": "3.8.4", 959 | "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.8.4.tgz", 960 | "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=" 961 | } 962 | } 963 | }, 964 | "istanbul-lib-coverage": { 965 | "version": "1.1.1", 966 | "resolved": "http://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.1.1.tgz", 967 | "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=" 968 | }, 969 | "istanbul-lib-hook": { 970 | "version": "1.0.7", 971 | "resolved": "http://registry.npm.taobao.org/istanbul-lib-hook/download/istanbul-lib-hook-1.0.7.tgz", 972 | "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=" 973 | }, 974 | "istanbul-lib-instrument": { 975 | "version": "1.7.2", 976 | "resolved": "http://registry.npm.taobao.org/istanbul-lib-instrument/download/istanbul-lib-instrument-1.7.2.tgz", 977 | "integrity": "sha1-YBSwPTRw+3djjVgCUIwlXAYxLlY=" 978 | }, 979 | "istanbul-lib-report": { 980 | "version": "1.1.1", 981 | "resolved": "http://registry.npm.taobao.org/istanbul-lib-report/download/istanbul-lib-report-1.1.1.tgz", 982 | "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", 983 | "dependencies": { 984 | "supports-color": { 985 | "version": "3.2.3", 986 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz", 987 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=" 988 | } 989 | } 990 | }, 991 | "istanbul-lib-source-maps": { 992 | "version": "1.2.1", 993 | "resolved": "http://registry.npm.taobao.org/istanbul-lib-source-maps/download/istanbul-lib-source-maps-1.2.1.tgz", 994 | "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=" 995 | }, 996 | "istanbul-reports": { 997 | "version": "1.1.1", 998 | "resolved": "http://registry.npm.taobao.org/istanbul-reports/download/istanbul-reports-1.1.1.tgz", 999 | "integrity": "sha1-BCvlyJ4XW8P4ZSPKqynAFOd/7k4=" 1000 | }, 1001 | "jest": { 1002 | "version": "20.0.4", 1003 | "resolved": "http://registry.npm.taobao.org/jest/download/jest-20.0.4.tgz", 1004 | "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=" 1005 | }, 1006 | "jest-changed-files": { 1007 | "version": "20.0.3", 1008 | "resolved": "http://registry.npm.taobao.org/jest-changed-files/download/jest-changed-files-20.0.3.tgz", 1009 | "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" 1010 | }, 1011 | "jest-cli": { 1012 | "version": "20.0.4", 1013 | "resolved": "http://registry.npm.taobao.org/jest-cli/download/jest-cli-20.0.4.tgz", 1014 | "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=" 1015 | }, 1016 | "jest-config": { 1017 | "version": "20.0.4", 1018 | "resolved": "http://registry.npm.taobao.org/jest-config/download/jest-config-20.0.4.tgz", 1019 | "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=" 1020 | }, 1021 | "jest-diff": { 1022 | "version": "20.0.3", 1023 | "resolved": "http://registry.npm.taobao.org/jest-diff/download/jest-diff-20.0.3.tgz", 1024 | "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=" 1025 | }, 1026 | "jest-docblock": { 1027 | "version": "20.0.3", 1028 | "resolved": "http://registry.npm.taobao.org/jest-docblock/download/jest-docblock-20.0.3.tgz", 1029 | "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" 1030 | }, 1031 | "jest-environment-jsdom": { 1032 | "version": "20.0.3", 1033 | "resolved": "http://registry.npm.taobao.org/jest-environment-jsdom/download/jest-environment-jsdom-20.0.3.tgz", 1034 | "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=" 1035 | }, 1036 | "jest-environment-node": { 1037 | "version": "20.0.3", 1038 | "resolved": "http://registry.npm.taobao.org/jest-environment-node/download/jest-environment-node-20.0.3.tgz", 1039 | "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=" 1040 | }, 1041 | "jest-haste-map": { 1042 | "version": "20.0.4", 1043 | "resolved": "http://registry.npm.taobao.org/jest-haste-map/download/jest-haste-map-20.0.4.tgz", 1044 | "integrity": "sha1-ZT61XIic48Ah97lGk/IKQVm63wM=" 1045 | }, 1046 | "jest-jasmine2": { 1047 | "version": "20.0.4", 1048 | "resolved": "http://registry.npm.taobao.org/jest-jasmine2/download/jest-jasmine2-20.0.4.tgz", 1049 | "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=" 1050 | }, 1051 | "jest-matcher-utils": { 1052 | "version": "20.0.3", 1053 | "resolved": "http://registry.npm.taobao.org/jest-matcher-utils/download/jest-matcher-utils-20.0.3.tgz", 1054 | "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=" 1055 | }, 1056 | "jest-matchers": { 1057 | "version": "20.0.3", 1058 | "resolved": "http://registry.npm.taobao.org/jest-matchers/download/jest-matchers-20.0.3.tgz", 1059 | "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=" 1060 | }, 1061 | "jest-message-util": { 1062 | "version": "20.0.3", 1063 | "resolved": "http://registry.npm.taobao.org/jest-message-util/download/jest-message-util-20.0.3.tgz", 1064 | "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=" 1065 | }, 1066 | "jest-mock": { 1067 | "version": "20.0.3", 1068 | "resolved": "http://registry.npm.taobao.org/jest-mock/download/jest-mock-20.0.3.tgz", 1069 | "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" 1070 | }, 1071 | "jest-regex-util": { 1072 | "version": "20.0.3", 1073 | "resolved": "http://registry.npm.taobao.org/jest-regex-util/download/jest-regex-util-20.0.3.tgz", 1074 | "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" 1075 | }, 1076 | "jest-resolve": { 1077 | "version": "20.0.4", 1078 | "resolved": "http://registry.npm.taobao.org/jest-resolve/download/jest-resolve-20.0.4.tgz", 1079 | "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=" 1080 | }, 1081 | "jest-resolve-dependencies": { 1082 | "version": "20.0.3", 1083 | "resolved": "http://registry.npm.taobao.org/jest-resolve-dependencies/download/jest-resolve-dependencies-20.0.3.tgz", 1084 | "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=" 1085 | }, 1086 | "jest-runtime": { 1087 | "version": "20.0.4", 1088 | "resolved": "http://registry.npm.taobao.org/jest-runtime/download/jest-runtime-20.0.4.tgz", 1089 | "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", 1090 | "dependencies": { 1091 | "strip-bom": { 1092 | "version": "3.0.0", 1093 | "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", 1094 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 1095 | } 1096 | } 1097 | }, 1098 | "jest-snapshot": { 1099 | "version": "20.0.3", 1100 | "resolved": "http://registry.npm.taobao.org/jest-snapshot/download/jest-snapshot-20.0.3.tgz", 1101 | "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=" 1102 | }, 1103 | "jest-util": { 1104 | "version": "20.0.3", 1105 | "resolved": "http://registry.npm.taobao.org/jest-util/download/jest-util-20.0.3.tgz", 1106 | "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=" 1107 | }, 1108 | "jest-validate": { 1109 | "version": "20.0.3", 1110 | "resolved": "http://registry.npm.taobao.org/jest-validate/download/jest-validate-20.0.3.tgz", 1111 | "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=" 1112 | }, 1113 | "jodid25519": { 1114 | "version": "1.0.2", 1115 | "resolved": "http://registry.npm.taobao.org/jodid25519/download/jodid25519-1.0.2.tgz", 1116 | "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", 1117 | "optional": true 1118 | }, 1119 | "js-tokens": { 1120 | "version": "3.0.1", 1121 | "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.1.tgz", 1122 | "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" 1123 | }, 1124 | "js-yaml": { 1125 | "version": "3.6.1", 1126 | "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.6.1.tgz", 1127 | "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=" 1128 | }, 1129 | "jsbn": { 1130 | "version": "0.1.1", 1131 | "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", 1132 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1133 | "optional": true 1134 | }, 1135 | "jsdom": { 1136 | "version": "9.12.0", 1137 | "resolved": "http://registry.npm.taobao.org/jsdom/download/jsdom-9.12.0.tgz", 1138 | "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=" 1139 | }, 1140 | "jsesc": { 1141 | "version": "1.3.0", 1142 | "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz", 1143 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" 1144 | }, 1145 | "json-schema": { 1146 | "version": "0.2.3", 1147 | "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", 1148 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1149 | }, 1150 | "json-stable-stringify": { 1151 | "version": "1.0.1", 1152 | "resolved": "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", 1153 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" 1154 | }, 1155 | "json-stringify-safe": { 1156 | "version": "5.0.1", 1157 | "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", 1158 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1159 | }, 1160 | "json5": { 1161 | "version": "0.5.1", 1162 | "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", 1163 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" 1164 | }, 1165 | "jsonify": { 1166 | "version": "0.0.0", 1167 | "resolved": "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz", 1168 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 1169 | }, 1170 | "jsonpointer": { 1171 | "version": "4.0.1", 1172 | "resolved": "http://registry.npm.taobao.org/jsonpointer/download/jsonpointer-4.0.1.tgz", 1173 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" 1174 | }, 1175 | "jsprim": { 1176 | "version": "1.4.0", 1177 | "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.0.tgz", 1178 | "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", 1179 | "dependencies": { 1180 | "assert-plus": { 1181 | "version": "1.0.0", 1182 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 1183 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1184 | } 1185 | } 1186 | }, 1187 | "keygrip": { 1188 | "version": "1.0.1", 1189 | "resolved": "http://registry.npm.taobao.org/keygrip/download/keygrip-1.0.1.tgz", 1190 | "integrity": "sha1-sC+kgW7vIajEs1yp5Skh/8iaMOk=" 1191 | }, 1192 | "kind-of": { 1193 | "version": "3.2.2", 1194 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 1195 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" 1196 | }, 1197 | "koa": { 1198 | "version": "1.4.0", 1199 | "resolved": "http://registry.npm.taobao.org/koa/download/koa-1.4.0.tgz", 1200 | "integrity": "sha1-X79tkMZq4Si3hnyi5UjOh0NDbXY=" 1201 | }, 1202 | "koa-bodyparser": { 1203 | "version": "2.5.0", 1204 | "resolved": "http://registry.npm.taobao.org/koa-bodyparser/download/koa-bodyparser-2.5.0.tgz", 1205 | "integrity": "sha1-PrckP0eZii53LbBfbcTg9PPMvfA=" 1206 | }, 1207 | "koa-compose": { 1208 | "version": "2.5.1", 1209 | "resolved": "http://registry.npm.taobao.org/koa-compose/download/koa-compose-2.5.1.tgz", 1210 | "integrity": "sha1-cmz7F2lN5cufvwPArfFyMD+D8VY=" 1211 | }, 1212 | "koa-is-json": { 1213 | "version": "1.0.0", 1214 | "resolved": "http://registry.npm.taobao.org/koa-is-json/download/koa-is-json-1.0.0.tgz", 1215 | "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" 1216 | }, 1217 | "koa-request": { 1218 | "version": "1.0.0", 1219 | "resolved": "http://registry.npm.taobao.org/koa-request/download/koa-request-1.0.0.tgz", 1220 | "integrity": "sha1-GTQzUkedLLll16/wqAKxoG1AjhY=" 1221 | }, 1222 | "lazy-cache": { 1223 | "version": "1.0.4", 1224 | "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", 1225 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1226 | "optional": true 1227 | }, 1228 | "lcid": { 1229 | "version": "1.0.0", 1230 | "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", 1231 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" 1232 | }, 1233 | "lcov-parse": { 1234 | "version": "0.0.10", 1235 | "resolved": "http://registry.npm.taobao.org/lcov-parse/download/lcov-parse-0.0.10.tgz", 1236 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=" 1237 | }, 1238 | "leven": { 1239 | "version": "2.1.0", 1240 | "resolved": "http://registry.npm.taobao.org/leven/download/leven-2.1.0.tgz", 1241 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 1242 | }, 1243 | "levn": { 1244 | "version": "0.3.0", 1245 | "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", 1246 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=" 1247 | }, 1248 | "load-json-file": { 1249 | "version": "1.1.0", 1250 | "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", 1251 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" 1252 | }, 1253 | "locate-path": { 1254 | "version": "2.0.0", 1255 | "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", 1256 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" 1257 | }, 1258 | "lodash": { 1259 | "version": "4.17.4", 1260 | "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz", 1261 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1262 | }, 1263 | "log-driver": { 1264 | "version": "1.2.5", 1265 | "resolved": "http://registry.npm.taobao.org/log-driver/download/log-driver-1.2.5.tgz", 1266 | "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=" 1267 | }, 1268 | "longest": { 1269 | "version": "1.0.1", 1270 | "resolved": "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", 1271 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 1272 | }, 1273 | "loose-envify": { 1274 | "version": "1.3.1", 1275 | "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz", 1276 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" 1277 | }, 1278 | "makeerror": { 1279 | "version": "1.0.11", 1280 | "resolved": "http://registry.npm.taobao.org/makeerror/download/makeerror-1.0.11.tgz", 1281 | "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=" 1282 | }, 1283 | "media-typer": { 1284 | "version": "0.3.0", 1285 | "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", 1286 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1287 | }, 1288 | "merge": { 1289 | "version": "1.2.0", 1290 | "resolved": "http://registry.npm.taobao.org/merge/download/merge-1.2.0.tgz", 1291 | "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" 1292 | }, 1293 | "micromatch": { 1294 | "version": "2.3.11", 1295 | "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz", 1296 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=" 1297 | }, 1298 | "mime-db": { 1299 | "version": "1.27.0", 1300 | "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.27.0.tgz", 1301 | "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" 1302 | }, 1303 | "mime-types": { 1304 | "version": "2.1.15", 1305 | "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.15.tgz", 1306 | "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" 1307 | }, 1308 | "minimatch": { 1309 | "version": "3.0.4", 1310 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 1311 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" 1312 | }, 1313 | "minimist": { 1314 | "version": "1.2.0", 1315 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", 1316 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1317 | }, 1318 | "mkdirp": { 1319 | "version": "0.5.1", 1320 | "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", 1321 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1322 | "dependencies": { 1323 | "minimist": { 1324 | "version": "0.0.8", 1325 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 1326 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1327 | } 1328 | } 1329 | }, 1330 | "ms": { 1331 | "version": "2.0.0", 1332 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 1333 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1334 | }, 1335 | "natural-compare": { 1336 | "version": "1.4.0", 1337 | "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", 1338 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 1339 | }, 1340 | "negotiator": { 1341 | "version": "0.6.1", 1342 | "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz", 1343 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1344 | }, 1345 | "node-int64": { 1346 | "version": "0.4.0", 1347 | "resolved": "http://registry.npm.taobao.org/node-int64/download/node-int64-0.4.0.tgz", 1348 | "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" 1349 | }, 1350 | "node-notifier": { 1351 | "version": "5.1.2", 1352 | "resolved": "http://registry.npm.taobao.org/node-notifier/download/node-notifier-5.1.2.tgz", 1353 | "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=" 1354 | }, 1355 | "normalize-package-data": { 1356 | "version": "2.3.8", 1357 | "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.3.8.tgz", 1358 | "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=" 1359 | }, 1360 | "normalize-path": { 1361 | "version": "2.1.1", 1362 | "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", 1363 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=" 1364 | }, 1365 | "number-is-nan": { 1366 | "version": "1.0.1", 1367 | "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", 1368 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1369 | }, 1370 | "nwmatcher": { 1371 | "version": "1.4.0", 1372 | "resolved": "http://registry.npm.taobao.org/nwmatcher/download/nwmatcher-1.4.0.tgz", 1373 | "integrity": "sha1-tDiTYhcOfvl5jDx3FtgOvAEG/M8=" 1374 | }, 1375 | "oauth-sign": { 1376 | "version": "0.8.2", 1377 | "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz", 1378 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1379 | }, 1380 | "object-assign": { 1381 | "version": "4.1.1", 1382 | "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", 1383 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1384 | }, 1385 | "object.omit": { 1386 | "version": "2.0.1", 1387 | "resolved": "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz", 1388 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=" 1389 | }, 1390 | "on-finished": { 1391 | "version": "2.3.0", 1392 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", 1393 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" 1394 | }, 1395 | "once": { 1396 | "version": "1.4.0", 1397 | "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 1398 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 1399 | }, 1400 | "only": { 1401 | "version": "0.0.2", 1402 | "resolved": "http://registry.npm.taobao.org/only/download/only-0.0.2.tgz", 1403 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 1404 | }, 1405 | "optimist": { 1406 | "version": "0.6.1", 1407 | "resolved": "http://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", 1408 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1409 | "dependencies": { 1410 | "minimist": { 1411 | "version": "0.0.10", 1412 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz", 1413 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 1414 | } 1415 | } 1416 | }, 1417 | "optionator": { 1418 | "version": "0.8.2", 1419 | "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", 1420 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1421 | "dependencies": { 1422 | "wordwrap": { 1423 | "version": "1.0.0", 1424 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", 1425 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1426 | } 1427 | } 1428 | }, 1429 | "os-homedir": { 1430 | "version": "1.0.2", 1431 | "resolved": "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", 1432 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 1433 | }, 1434 | "os-locale": { 1435 | "version": "1.4.0", 1436 | "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", 1437 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" 1438 | }, 1439 | "os-tmpdir": { 1440 | "version": "1.0.2", 1441 | "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", 1442 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1443 | }, 1444 | "p-limit": { 1445 | "version": "1.1.0", 1446 | "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.1.0.tgz", 1447 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" 1448 | }, 1449 | "p-locate": { 1450 | "version": "2.0.0", 1451 | "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", 1452 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" 1453 | }, 1454 | "p-map": { 1455 | "version": "1.1.1", 1456 | "resolved": "http://registry.npm.taobao.org/p-map/download/p-map-1.1.1.tgz", 1457 | "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=" 1458 | }, 1459 | "parse-glob": { 1460 | "version": "3.0.4", 1461 | "resolved": "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz", 1462 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=" 1463 | }, 1464 | "parse-json": { 1465 | "version": "2.2.0", 1466 | "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", 1467 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" 1468 | }, 1469 | "parse5": { 1470 | "version": "1.5.1", 1471 | "resolved": "http://registry.npm.taobao.org/parse5/download/parse5-1.5.1.tgz", 1472 | "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" 1473 | }, 1474 | "parseurl": { 1475 | "version": "1.3.1", 1476 | "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.1.tgz", 1477 | "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" 1478 | }, 1479 | "path-exists": { 1480 | "version": "3.0.0", 1481 | "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", 1482 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1483 | }, 1484 | "path-is-absolute": { 1485 | "version": "1.0.1", 1486 | "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 1487 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1488 | }, 1489 | "path-parse": { 1490 | "version": "1.0.5", 1491 | "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz", 1492 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" 1493 | }, 1494 | "path-type": { 1495 | "version": "1.1.0", 1496 | "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", 1497 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" 1498 | }, 1499 | "performance-now": { 1500 | "version": "0.2.0", 1501 | "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-0.2.0.tgz", 1502 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 1503 | }, 1504 | "pify": { 1505 | "version": "2.3.0", 1506 | "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", 1507 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1508 | }, 1509 | "pinkie": { 1510 | "version": "2.0.4", 1511 | "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", 1512 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1513 | }, 1514 | "pinkie-promise": { 1515 | "version": "2.0.1", 1516 | "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", 1517 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" 1518 | }, 1519 | "prelude-ls": { 1520 | "version": "1.1.2", 1521 | "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", 1522 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1523 | }, 1524 | "preserve": { 1525 | "version": "0.2.0", 1526 | "resolved": "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz", 1527 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" 1528 | }, 1529 | "pretty-format": { 1530 | "version": "20.0.3", 1531 | "resolved": "http://registry.npm.taobao.org/pretty-format/download/pretty-format-20.0.3.tgz", 1532 | "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", 1533 | "dependencies": { 1534 | "ansi-styles": { 1535 | "version": "3.0.0", 1536 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.0.0.tgz", 1537 | "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=" 1538 | } 1539 | } 1540 | }, 1541 | "private": { 1542 | "version": "0.1.7", 1543 | "resolved": "http://registry.npm.taobao.org/private/download/private-0.1.7.tgz", 1544 | "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" 1545 | }, 1546 | "prr": { 1547 | "version": "0.0.0", 1548 | "resolved": "http://registry.npm.taobao.org/prr/download/prr-0.0.0.tgz", 1549 | "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" 1550 | }, 1551 | "punycode": { 1552 | "version": "1.4.1", 1553 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", 1554 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1555 | }, 1556 | "qs": { 1557 | "version": "6.4.0", 1558 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.4.0.tgz", 1559 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 1560 | }, 1561 | "randomatic": { 1562 | "version": "1.1.6", 1563 | "resolved": "http://registry.npm.taobao.org/randomatic/download/randomatic-1.1.6.tgz", 1564 | "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=" 1565 | }, 1566 | "raw-body": { 1567 | "version": "2.2.0", 1568 | "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.2.0.tgz", 1569 | "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=" 1570 | }, 1571 | "read-pkg": { 1572 | "version": "1.1.0", 1573 | "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", 1574 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" 1575 | }, 1576 | "read-pkg-up": { 1577 | "version": "1.0.1", 1578 | "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", 1579 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1580 | "dependencies": { 1581 | "find-up": { 1582 | "version": "1.1.2", 1583 | "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", 1584 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" 1585 | }, 1586 | "path-exists": { 1587 | "version": "2.1.0", 1588 | "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", 1589 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" 1590 | } 1591 | } 1592 | }, 1593 | "regenerator-runtime": { 1594 | "version": "0.10.5", 1595 | "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz", 1596 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" 1597 | }, 1598 | "regex-cache": { 1599 | "version": "0.4.3", 1600 | "resolved": "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.3.tgz", 1601 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=" 1602 | }, 1603 | "remove-trailing-separator": { 1604 | "version": "1.0.2", 1605 | "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.0.2.tgz", 1606 | "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" 1607 | }, 1608 | "repeat-element": { 1609 | "version": "1.1.2", 1610 | "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz", 1611 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" 1612 | }, 1613 | "repeat-string": { 1614 | "version": "1.6.1", 1615 | "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", 1616 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 1617 | }, 1618 | "repeating": { 1619 | "version": "2.0.1", 1620 | "resolved": "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", 1621 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" 1622 | }, 1623 | "request": { 1624 | "version": "2.81.0", 1625 | "resolved": "http://registry.npm.taobao.org/request/download/request-2.81.0.tgz", 1626 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" 1627 | }, 1628 | "require-directory": { 1629 | "version": "2.1.1", 1630 | "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", 1631 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1632 | }, 1633 | "require-main-filename": { 1634 | "version": "1.0.1", 1635 | "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", 1636 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 1637 | }, 1638 | "resolve": { 1639 | "version": "1.3.3", 1640 | "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.3.3.tgz", 1641 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=" 1642 | }, 1643 | "right-align": { 1644 | "version": "0.1.3", 1645 | "resolved": "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", 1646 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1647 | "optional": true 1648 | }, 1649 | "rimraf": { 1650 | "version": "2.6.1", 1651 | "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.1.tgz", 1652 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=" 1653 | }, 1654 | "safe-buffer": { 1655 | "version": "5.0.1", 1656 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.0.1.tgz", 1657 | "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" 1658 | }, 1659 | "sane": { 1660 | "version": "1.6.0", 1661 | "resolved": "http://registry.npm.taobao.org/sane/download/sane-1.6.0.tgz", 1662 | "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", 1663 | "dependencies": { 1664 | "bser": { 1665 | "version": "1.0.2", 1666 | "resolved": "http://registry.npm.taobao.org/bser/download/bser-1.0.2.tgz", 1667 | "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=" 1668 | }, 1669 | "fb-watchman": { 1670 | "version": "1.9.2", 1671 | "resolved": "http://registry.npm.taobao.org/fb-watchman/download/fb-watchman-1.9.2.tgz", 1672 | "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=" 1673 | } 1674 | } 1675 | }, 1676 | "sax": { 1677 | "version": "1.2.2", 1678 | "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.2.tgz", 1679 | "integrity": "sha1-/YYxojvHgmvvXYcb24c3jJVkeCg=" 1680 | }, 1681 | "semver": { 1682 | "version": "5.3.0", 1683 | "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz", 1684 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" 1685 | }, 1686 | "set-blocking": { 1687 | "version": "2.0.0", 1688 | "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", 1689 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1690 | }, 1691 | "setprototypeof": { 1692 | "version": "1.0.3", 1693 | "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz", 1694 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 1695 | }, 1696 | "shellwords": { 1697 | "version": "0.1.0", 1698 | "resolved": "http://registry.npm.taobao.org/shellwords/download/shellwords-0.1.0.tgz", 1699 | "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=" 1700 | }, 1701 | "slash": { 1702 | "version": "1.0.0", 1703 | "resolved": "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", 1704 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 1705 | }, 1706 | "sntp": { 1707 | "version": "1.0.9", 1708 | "resolved": "http://registry.npm.taobao.org/sntp/download/sntp-1.0.9.tgz", 1709 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" 1710 | }, 1711 | "source-map": { 1712 | "version": "0.5.6", 1713 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.6.tgz", 1714 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" 1715 | }, 1716 | "source-map-support": { 1717 | "version": "0.4.15", 1718 | "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.15.tgz", 1719 | "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=" 1720 | }, 1721 | "spdx-correct": { 1722 | "version": "1.0.2", 1723 | "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz", 1724 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" 1725 | }, 1726 | "spdx-expression-parse": { 1727 | "version": "1.0.4", 1728 | "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", 1729 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" 1730 | }, 1731 | "spdx-license-ids": { 1732 | "version": "1.2.2", 1733 | "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz", 1734 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" 1735 | }, 1736 | "sprintf-js": { 1737 | "version": "1.0.3", 1738 | "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", 1739 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1740 | }, 1741 | "sshpk": { 1742 | "version": "1.13.0", 1743 | "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.13.0.tgz", 1744 | "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", 1745 | "dependencies": { 1746 | "assert-plus": { 1747 | "version": "1.0.0", 1748 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 1749 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1750 | } 1751 | } 1752 | }, 1753 | "statuses": { 1754 | "version": "1.3.1", 1755 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz", 1756 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 1757 | }, 1758 | "string-length": { 1759 | "version": "1.0.1", 1760 | "resolved": "http://registry.npm.taobao.org/string-length/download/string-length-1.0.1.tgz", 1761 | "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=" 1762 | }, 1763 | "string-width": { 1764 | "version": "1.0.2", 1765 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", 1766 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" 1767 | }, 1768 | "stringstream": { 1769 | "version": "0.0.5", 1770 | "resolved": "http://registry.npm.taobao.org/stringstream/download/stringstream-0.0.5.tgz", 1771 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 1772 | }, 1773 | "strip-ansi": { 1774 | "version": "3.0.1", 1775 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", 1776 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" 1777 | }, 1778 | "strip-bom": { 1779 | "version": "2.0.0", 1780 | "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", 1781 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" 1782 | }, 1783 | "supports-color": { 1784 | "version": "2.0.0", 1785 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", 1786 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 1787 | }, 1788 | "symbol-tree": { 1789 | "version": "3.2.2", 1790 | "resolved": "http://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.2.tgz", 1791 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 1792 | }, 1793 | "test-exclude": { 1794 | "version": "4.1.1", 1795 | "resolved": "http://registry.npm.taobao.org/test-exclude/download/test-exclude-4.1.1.tgz", 1796 | "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=" 1797 | }, 1798 | "throat": { 1799 | "version": "3.1.0", 1800 | "resolved": "http://registry.npm.taobao.org/throat/download/throat-3.1.0.tgz", 1801 | "integrity": "sha1-7yLYhVljs/3GJtBDUI8kxM3308M=" 1802 | }, 1803 | "tmpl": { 1804 | "version": "1.0.4", 1805 | "resolved": "http://registry.npm.taobao.org/tmpl/download/tmpl-1.0.4.tgz", 1806 | "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" 1807 | }, 1808 | "to-fast-properties": { 1809 | "version": "1.0.3", 1810 | "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz", 1811 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" 1812 | }, 1813 | "tough-cookie": { 1814 | "version": "2.3.2", 1815 | "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.2.tgz", 1816 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" 1817 | }, 1818 | "tr46": { 1819 | "version": "0.0.3", 1820 | "resolved": "http://registry.npm.taobao.org/tr46/download/tr46-0.0.3.tgz", 1821 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1822 | }, 1823 | "trim-right": { 1824 | "version": "1.0.1", 1825 | "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz", 1826 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" 1827 | }, 1828 | "tunnel-agent": { 1829 | "version": "0.6.0", 1830 | "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", 1831 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" 1832 | }, 1833 | "tweetnacl": { 1834 | "version": "0.14.5", 1835 | "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", 1836 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1837 | "optional": true 1838 | }, 1839 | "type-check": { 1840 | "version": "0.3.2", 1841 | "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", 1842 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=" 1843 | }, 1844 | "type-is": { 1845 | "version": "1.6.15", 1846 | "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz", 1847 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=" 1848 | }, 1849 | "uglify-js": { 1850 | "version": "2.8.28", 1851 | "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.28.tgz", 1852 | "integrity": "sha1-4zUDLfm7INy5GPFkWJ1a9H84g0o=", 1853 | "optional": true, 1854 | "dependencies": { 1855 | "yargs": { 1856 | "version": "3.10.0", 1857 | "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", 1858 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1859 | "optional": true 1860 | } 1861 | } 1862 | }, 1863 | "uglify-to-browserify": { 1864 | "version": "1.0.2", 1865 | "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", 1866 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1867 | "optional": true 1868 | }, 1869 | "unpipe": { 1870 | "version": "1.0.0", 1871 | "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", 1872 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1873 | }, 1874 | "uuid": { 1875 | "version": "3.0.1", 1876 | "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.0.1.tgz", 1877 | "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" 1878 | }, 1879 | "validate-npm-package-license": { 1880 | "version": "3.0.1", 1881 | "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", 1882 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" 1883 | }, 1884 | "vary": { 1885 | "version": "1.1.1", 1886 | "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.1.tgz", 1887 | "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" 1888 | }, 1889 | "verror": { 1890 | "version": "1.3.6", 1891 | "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.3.6.tgz", 1892 | "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=" 1893 | }, 1894 | "walker": { 1895 | "version": "1.0.7", 1896 | "resolved": "http://registry.npm.taobao.org/walker/download/walker-1.0.7.tgz", 1897 | "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=" 1898 | }, 1899 | "watch": { 1900 | "version": "0.10.0", 1901 | "resolved": "http://registry.npm.taobao.org/watch/download/watch-0.10.0.tgz", 1902 | "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" 1903 | }, 1904 | "webidl-conversions": { 1905 | "version": "4.0.1", 1906 | "resolved": "http://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-4.0.1.tgz", 1907 | "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=" 1908 | }, 1909 | "whatwg-encoding": { 1910 | "version": "1.0.1", 1911 | "resolved": "http://registry.npm.taobao.org/whatwg-encoding/download/whatwg-encoding-1.0.1.tgz", 1912 | "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", 1913 | "dependencies": { 1914 | "iconv-lite": { 1915 | "version": "0.4.13", 1916 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.13.tgz", 1917 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" 1918 | } 1919 | } 1920 | }, 1921 | "whatwg-url": { 1922 | "version": "4.8.0", 1923 | "resolved": "http://registry.npm.taobao.org/whatwg-url/download/whatwg-url-4.8.0.tgz", 1924 | "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", 1925 | "dependencies": { 1926 | "webidl-conversions": { 1927 | "version": "3.0.1", 1928 | "resolved": "http://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-3.0.1.tgz", 1929 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1930 | } 1931 | } 1932 | }, 1933 | "which": { 1934 | "version": "1.2.14", 1935 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.2.14.tgz", 1936 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" 1937 | }, 1938 | "which-module": { 1939 | "version": "1.0.0", 1940 | "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", 1941 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" 1942 | }, 1943 | "window-size": { 1944 | "version": "0.1.0", 1945 | "resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", 1946 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 1947 | "optional": true 1948 | }, 1949 | "wordwrap": { 1950 | "version": "0.0.3", 1951 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", 1952 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 1953 | }, 1954 | "worker-farm": { 1955 | "version": "1.3.1", 1956 | "resolved": "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.3.1.tgz", 1957 | "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=" 1958 | }, 1959 | "wrap-ansi": { 1960 | "version": "2.1.0", 1961 | "resolved": "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", 1962 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" 1963 | }, 1964 | "wrappy": { 1965 | "version": "1.0.2", 1966 | "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 1967 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1968 | }, 1969 | "xml-name-validator": { 1970 | "version": "2.0.1", 1971 | "resolved": "http://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-2.0.1.tgz", 1972 | "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" 1973 | }, 1974 | "xtend": { 1975 | "version": "4.0.1", 1976 | "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", 1977 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1978 | }, 1979 | "y18n": { 1980 | "version": "3.2.1", 1981 | "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", 1982 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1983 | }, 1984 | "yargs": { 1985 | "version": "7.1.0", 1986 | "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz", 1987 | "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", 1988 | "dependencies": { 1989 | "camelcase": { 1990 | "version": "3.0.0", 1991 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", 1992 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 1993 | }, 1994 | "cliui": { 1995 | "version": "3.2.0", 1996 | "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", 1997 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" 1998 | } 1999 | } 2000 | }, 2001 | "yargs-parser": { 2002 | "version": "5.0.0", 2003 | "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz", 2004 | "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", 2005 | "dependencies": { 2006 | "camelcase": { 2007 | "version": "3.0.0", 2008 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", 2009 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 2010 | } 2011 | } 2012 | } 2013 | } 2014 | } 2015 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bridgit", 3 | "version": "1.2.2", 4 | "description": "A authorization proxy server", 5 | "main": "bin/bridgit.js", 6 | "scripts": { 7 | "start": "node bin/bridgit.js", 8 | "test:dev": "jest --coverage", 9 | "test": "jest --coverage && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" 10 | }, 11 | "files": [ 12 | "src", 13 | "bin/brdgit.js" 14 | ], 15 | "bin": { 16 | "bridgit": "bin/bridgit.js" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/jkzing/bridgit.git" 21 | }, 22 | "author": "JingkaiZhao", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/jkzing/bridgit/issues" 26 | }, 27 | "homepage": "https://github.com/jkzing/bridgit#readme", 28 | "dependencies": { 29 | "axios": "^0.16.2", 30 | "chalk": "^1.1.3", 31 | "commander": "^2.9.0", 32 | "console.table": "^0.8.0", 33 | "coveralls": "^2.13.1", 34 | "hawk": "^3.x", 35 | "jest": "^20.0.4", 36 | "jest-cli": "^20.0.4", 37 | "koa": "^2.3.0", 38 | "koa-bodyparser": "^4.2.0", 39 | "lodash": "^4.17.2" 40 | }, 41 | "jest": { 42 | "testEnvironment": "node", 43 | "coverageReporters": [ 44 | "lcov" 45 | ], 46 | "coveragePathIgnorePatterns": [ 47 | "dist/", 48 | "node_modules/", 49 | ".node/", 50 | "test/" 51 | ] 52 | }, 53 | "engines": { 54 | "node": ">= 6.0.0", 55 | "npm": ">= 3.0.0" 56 | }, 57 | "devDependencies": {} 58 | } 59 | -------------------------------------------------------------------------------- /src/commands/config.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const fs = require('fs'); 3 | const logger = require('../utils/logger'); 4 | 5 | const {configFilePath, configKeys} = require('../constants'); 6 | 7 | let commands = { 8 | get(key, value, options) { 9 | // value should be ommited 10 | let config 11 | try { 12 | let configData = fs.readFileSync(configFilePath, {encoding: 'utf-8'}); 13 | config = JSON.parse(configData); 14 | } catch(e) { 15 | logger.error('No configuration file found, or configuration file is not valid JSON.'); 16 | return; 17 | } 18 | if (key) { 19 | logger.config({ 20 | [key]: config[key], 21 | }); 22 | } else { 23 | logger.config(config); 24 | } 25 | }, 26 | set(key, value, options) { 27 | /* istanbul ignore if */ 28 | if (!key) return; 29 | let config; 30 | try { 31 | let configData = fs.readFileSync(configFilePath, {encoding: 'utf-8'}); 32 | config = JSON.parse(configData); 33 | } catch(e) { 34 | config = {} 35 | } 36 | config = _.merge( 37 | config, 38 | {[key]: value} 39 | ); 40 | fs.writeFileSync(configFilePath, JSON.stringify(config), { 41 | encoding: 'utf-8', 42 | }); 43 | }, 44 | new(filePath, omit, options) { 45 | let data = _.zipObject(configKeys, Array(configKeys.length).fill(null)); 46 | /* istanbul ignore if */ 47 | if (!/.json$/.test(filePath)) { 48 | filePath = filePath + '.json'; 49 | } 50 | fs.writeFile(filePath, JSON.stringify(data, null, 4), { 51 | encoding: 'utf-8', 52 | }, (err) => { 53 | if (err) { 54 | logger.error(err.message); 55 | return; 56 | } 57 | logger.success(`${filePath} created successfully.`); 58 | }); 59 | } 60 | } 61 | 62 | 63 | module.exports = function action(cmd, key, value, options) { 64 | if (!commands.hasOwnProperty(cmd)) { 65 | logger.error(`Command argument should be one of ${Object.keys(commands).join(', ')}.`) 66 | return; 67 | } 68 | 69 | commands[cmd](key, value, options); 70 | } 71 | -------------------------------------------------------------------------------- /src/commands/hawk.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const path = require('path'); 3 | const fs = require('fs'); 4 | const os = require('os'); 5 | const start = require('../utils/startServer'); 6 | const merge = require('../utils/mergeConfiguration'); 7 | const logger = require('../utils/logger'); 8 | const {hawkOptionKeys, configKeys} = require('../constants'); 9 | 10 | const invalidJsonReg = /JSON/; 11 | 12 | module.exports = function action(options) { 13 | if (typeof options !== 'object') { 14 | throw new Error('Wrong command arguments provided.'); 15 | } 16 | 17 | let configurations = []; 18 | 19 | let configFile = options.config; 20 | if (configFile) { 21 | try { 22 | let filePath = path.resolve(configFile); 23 | let configFileData = fs.readFileSync(filePath, {encoding: 'utf-8'}); 24 | configFile = JSON.parse(configFileData); 25 | } catch (e) { 26 | if (e.code === 'ENOENT') { 27 | logger.error(`Can not file config file at ${options.config}.`); 28 | return; 29 | } else if (e.message && invalidJsonReg.test(e.message)) { 30 | logger.error(e.message); 31 | return; 32 | } else { 33 | logger.warn( 34 | 'Unknown error happened when parsing config file, ' + 35 | `config file ${options.config} will be omitted.` 36 | ); 37 | } 38 | } 39 | } 40 | 41 | if (typeof configFile === 'object') { 42 | configurations.push(configFile); 43 | } 44 | 45 | // pick up configuration relavent options 46 | configurations.push(_.pick(options, configKeys)); 47 | 48 | let config = merge.apply(null, configurations); 49 | 50 | const [req, opts] = [ 51 | _.omit(config, hawkOptionKeys), 52 | _.pick(config, hawkOptionKeys) 53 | ]; 54 | 55 | req.options = opts; 56 | 57 | start('hawk', req); 58 | } 59 | -------------------------------------------------------------------------------- /src/config/defaults.json: -------------------------------------------------------------------------------- 1 | { 2 | "origin": "http://127.0.0.1:8000", 3 | "prefix": "", 4 | "algorithm": "sha256", 5 | "encryptPayload": true 6 | } 7 | -------------------------------------------------------------------------------- /src/constants/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const os = require('os'); 3 | 4 | module.exports = { 5 | configFilePath: path.join(os.homedir(), '.bridgit.json'), 6 | hawkOptionKeys: ['id', 'key', 'algorithm', 'encryptPayload'], 7 | configKeys: ['id', 'key', 'origin', 'port', 'algorithm', 'prefix', 'encryptPayload'] 8 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('console.table'); 4 | const bridgit = require('commander'); 5 | const hawkCommand = require('./commands/hawk'); 6 | const configCommand = require('./commands/config'); 7 | const pkg = require('../package.json'); 8 | 9 | /** 10 | * possibly refactor solution: 11 | * spawn each command here as a separete program 12 | * when it's get complicated 13 | * https://github.com/tj/commander.js/issues/1 14 | */ 15 | 16 | bridgit 17 | .version('v' + pkg.version); 18 | 19 | bridgit 20 | .command('hawk') 21 | .description('start hawk authorization proxy server') 22 | .option('-i, --id [id]', 'The hawk credential id') 23 | .option('-k, --key [key]', 'The hawk credential key') 24 | .option('-o, --origin [origin]', 'The proxy origin server host') 25 | .option('-p, --port [port]', 'Which port should proxy server start on') 26 | .option('-a, --algorithm [algorithm]', 'Which algorithm should hawk use to encrypt') 27 | .option('-P, --prefix [prefix]', 'Prefix string that should be added to request header') 28 | .option('-E, --encrypt-payload', 'Should hawk encrypt request body') 29 | .option('-c, --config [config]', 'With a specified config file path') 30 | .action(hawkCommand); 31 | 32 | bridgit 33 | .command('config [key] [value]') 34 | .description('configuration operations, use --help to checkout') 35 | .action(configCommand); 36 | 37 | 38 | module.exports = function() { 39 | bridgit.parse(process.argv); 40 | } 41 | 42 | -------------------------------------------------------------------------------- /src/middlewares/hawk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * koa middleware for hawk auth 3 | */ 4 | 5 | const hawk = require('hawk'); 6 | const axios = require('axios'); 7 | const logger = require('../utils/logger'); 8 | 9 | function createHawkHeader(request, origin, options={}) { 10 | let contentType, payload = ''; 11 | let urlWithoutQuery = request.url.split('?')[0]; 12 | const url = origin + urlWithoutQuery; 13 | const method = request.method; 14 | 15 | if (request.hasOwnProperty('body')) { 16 | if (Object.keys(request.body).length) payload = JSON.stringify(request.body); 17 | } 18 | 19 | if (payload && request.headers.hasOwnProperty('content-type')) { 20 | contentType = request.headers['content-type']; 21 | } else { 22 | contentType = 'text/plain'; 23 | } 24 | 25 | let authOptions = { 26 | credentials: { 27 | id: `${options.id}`, 28 | key: options.key, 29 | algorithm: options.algorithm 30 | }, 31 | contentType, 32 | }; 33 | 34 | if (options.encryptPayload) { 35 | authOptions.payload = payload; 36 | } 37 | 38 | let artifact = hawk.client.header(url, method, authOptions); 39 | 40 | return artifact.err ? undefined : artifact.field; 41 | } 42 | 43 | module.exports = function hawkMiddleWare(config) { 44 | const endpoint = axios.create({ 45 | baseURL: config.origin, 46 | timeout: 3600 * 1000 47 | }); 48 | return async function (ctx, next) { 49 | let req = ctx.request; 50 | let requestUrl = req.url; 51 | 52 | let authorization = createHawkHeader(req, config.origin, config.options); 53 | 54 | let options = { 55 | method: req.method, 56 | url: config.origin + requestUrl, 57 | headers: { 58 | 'Authorization': `${config.prefix || ''}${authorization}` 59 | } 60 | } 61 | 62 | // set content type if it has one 63 | const contentType = req.headers['content-type']; 64 | if (contentType) { 65 | options.headers['content-type'] = contentType; 66 | } else { 67 | options.headers['content-type'] = 'text/plain'; 68 | } 69 | 70 | if (req.method === 'POST' || req.method === 'PUT' || req.method === 'PATCH') { 71 | options.data = req.body; 72 | } 73 | 74 | logger.info(`Sending ${req.method} request to ${options.url}.`, true); 75 | let response 76 | try { 77 | response = await endpoint(options); 78 | } catch (e) { 79 | response = e.response 80 | } 81 | 82 | if (Math.floor(response.status / 100) === 2) { 83 | logger.success('Request success, sending back response.', true); 84 | } else { 85 | logger.error(`Request failed with status ${response.status} ${response.statusText}.`, true); 86 | } 87 | 88 | let responseBody; 89 | try { 90 | responseBody = JSON.parse(response.data); 91 | } catch (e) { 92 | responseBody = response.data; 93 | } 94 | 95 | ctx.status = response.status; 96 | ctx.body = responseBody; 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | clearEmpty, 3 | }; 4 | 5 | function clearEmpty(obj) { 6 | if (typeof obj !== 'object') throw new Error('argument expected to be an object!'); 7 | let o = Object.assign({}, obj); 8 | let val; 9 | for (let key in o) { 10 | val = o[key]; 11 | if (val === null || val === undefined) { 12 | delete o[key]; 13 | } 14 | } 15 | return o; 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/logger.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | const log = console.log; 3 | 4 | function getTimestamp() { 5 | return new Date().toISOString().replace('T', ' '); 6 | } 7 | 8 | function colorful(msg, color='yellow', timestamp=false) { 9 | if (!chalk[color]) { 10 | throw new Error('chalk does not have this color'); 11 | } 12 | 13 | if (timestamp) { 14 | msg = `[${getTimestamp()}] - ${msg}`; 15 | } 16 | log(chalk[color](msg)); 17 | } 18 | 19 | function info(msg, timestamp=false) { 20 | /* istanbul ignore next */ 21 | colorful(msg, 'cyan', timestamp); 22 | } 23 | 24 | function warn(msg, timestamp=false) { 25 | /* istanbul ignore next */ 26 | colorful(msg, 'grey', timestamp); 27 | } 28 | 29 | function error(msg, timestamp=false) { 30 | /* istanbul ignore next */ 31 | colorful(msg, 'red', timestamp); 32 | } 33 | 34 | function success(msg, timestamp=false) { 35 | /* istanbul ignore next */ 36 | colorful(msg, 'green', timestamp); 37 | } 38 | 39 | function config(conf={}) { 40 | console.table( 41 | Object 42 | .entries(conf) 43 | .map(([k, v]) => ({ 44 | key: k, 45 | value: v, 46 | })) 47 | ); 48 | } 49 | 50 | module.exports = { 51 | info, 52 | warn, 53 | error, 54 | success, 55 | config, 56 | colorful, 57 | } 58 | -------------------------------------------------------------------------------- /src/utils/mergeConfiguration.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const fs = require('fs'); 3 | const os = require('os'); 4 | const configFilePath = require('../constants').configFilePath; 5 | const {clearEmpty} = require('./index'); 6 | const logger = require('./logger'); 7 | 8 | const defaultsPath = require.resolve('../config/defaults.json'); 9 | 10 | function validateArgs(args) { 11 | return args.every(arg => typeof arg === 'object'); 12 | } 13 | 14 | /** 15 | * merge config objects 16 | * no need for deep merge for now 17 | */ 18 | module.exports = function merge(...args) { 19 | if (!validateArgs(args)) { 20 | throw new Error('Some of merge arguments are not object'); 21 | } 22 | let storedConf, defaultsConf; 23 | try { 24 | let configData = fs.readFileSync(configFilePath, {encoding: 'utf-8'}); 25 | let defaultsData = fs.readFileSync(defaultsPath, {encoding: 'utf-8'}); 26 | storedConf = JSON.parse(configData); 27 | defaultsConf = JSON.parse(defaultsData); 28 | } catch (e) {throw e} 29 | defaultsConf = defaultsConf || {}; 30 | // ignore properties that are empty (null) 31 | storedConf = clearEmpty(storedConf || {}); 32 | args = args.map(arg => clearEmpty(arg)); 33 | return _.merge(defaultsConf, storedConf, ...args); 34 | } 35 | -------------------------------------------------------------------------------- /src/utils/startServer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Koa = require('koa'); 4 | const bodyParser = require('koa-bodyparser'); 5 | const logger = require('./logger'); 6 | 7 | module.exports = function start(module, config) { 8 | let app = new Koa(); 9 | 10 | app.use(bodyParser()); 11 | let middleware = require(`../middlewares/${module}`); 12 | app.use(middleware(config)); 13 | 14 | let port = config.port || 3000; 15 | app.listen(port); 16 | logger.colorful(`> ${module.toUpperCase()} proxy server start listening on http://127.0.0.1:${port}`); 17 | } 18 | -------------------------------------------------------------------------------- /test/helpers/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | exports.requireSrc = (srcPath) => { 4 | return require('../../src/' + srcPath); 5 | } 6 | 7 | exports.resolveSrc = (srcPath) => { 8 | return path.resolve('src/' + srcPath); 9 | } 10 | 11 | exports.sleep = (delay=200) => new Promise((resolve) => setTimeout(resolve, delay)); -------------------------------------------------------------------------------- /test/unit/commands/config.spec.js: -------------------------------------------------------------------------------- 1 | require('assert'); 2 | 3 | const path = require('path'); 4 | const fs = require('fs'); 5 | const {requireSrc, resolveSrc, sleep} = require('../../helpers'); 6 | 7 | const configAction = requireSrc('commands/config'); 8 | const logger = requireSrc('utils/logger'); 9 | const {configFilePath, configKeys} = requireSrc('constants'); 10 | 11 | 12 | describe('config command', () => { 13 | let error, warn, config, success; 14 | beforeAll(() => { 15 | error = jest.spyOn(logger, 'error'); 16 | warn = jest.spyOn(logger, 'warn'); 17 | config = jest.spyOn(logger, 'config'); 18 | success = jest.spyOn(logger, 'success'); 19 | }); 20 | 21 | beforeEach(() => { 22 | try { 23 | fs.unlinkSync(configFilePath); 24 | } catch(e) {} 25 | }); 26 | 27 | afterEach(() => { 28 | error.mockReset(); 29 | warn.mockReset(); 30 | config.mockReset(); 31 | success.mockReset(); 32 | }); 33 | 34 | it('should warn when sub-command is not valid', () => { 35 | configAction('foo'); 36 | expect(error).toHaveBeenCalled(); 37 | }); 38 | 39 | it('should print specified key/value with ', () => { 40 | fs.writeFileSync( 41 | configFilePath, 42 | JSON.stringify({id: 'foo', key: 'bar'}), 43 | { 44 | encoding: 'utf-8', 45 | } 46 | ); 47 | configAction('get', 'id', null); 48 | expect(config).toHaveBeenCalledWith({id: 'foo'}); 49 | 50 | 51 | configAction('get', null, null); 52 | expect(config).toHaveBeenCalledWith({id: 'foo', key: 'bar'}); 53 | }); 54 | 55 | it('should save key/value in config file with ', () => { 56 | let foo = 'foo' + Date.now(); 57 | configAction('set', 'id', foo); 58 | let config = fs.readFileSync(configFilePath, {encoding: 'utf-8'}); 59 | config = JSON.parse(config); 60 | expect(config.id).toBe(foo); 61 | }); 62 | 63 | it('should generate an sample config file with ', async () => { 64 | configAction('new', 'tmp.new'); 65 | // write file here is async function, so... 66 | await sleep(200); 67 | let config = fs.readFileSync(path.resolve('tmp.new.json'), {encoding: 'utf-8'}); 68 | config = JSON.parse(config); 69 | expect(Object.keys(config)).toEqual(configKeys); 70 | expect(success).toHaveBeenCalled(); 71 | }); 72 | 73 | it('should warn when using with config file can not be loaded', () => { 74 | configAction('get', 'id', null); 75 | expect(error).toHaveBeenCalled(); 76 | }); 77 | 78 | it('should create new config file with when it can not be found', () => { 79 | configAction('set', 'id', 'foo'); 80 | let config = fs.readFileSync(configFilePath, {encoding: 'utf-8'}); 81 | expect(config).toEqual(JSON.stringify({id: 'foo'})) 82 | }); 83 | }); 84 | -------------------------------------------------------------------------------- /test/unit/commands/hawk.spec.js: -------------------------------------------------------------------------------- 1 | require('assert'); 2 | 3 | const path = require('path'); 4 | const os = require('os'); 5 | const fs = require('fs'); 6 | const {requireSrc} = require('../../helpers'); 7 | 8 | const hawkAction = requireSrc('commands/hawk'); 9 | const {configFilePath} = requireSrc('constants'); 10 | 11 | let options, middleware; 12 | jest.mock('../../../src/utils/startServer', () => { 13 | return jest.fn((m, o) => { 14 | middleware = m; 15 | options = o; 16 | }); 17 | }); 18 | 19 | const MOCK_OPTIONS = { 20 | id: 'foo', 21 | key: 'bar', 22 | origin: 'http://foo.com', 23 | port: 1000, 24 | algorithm: 'aes128', 25 | prefix: 'session-', 26 | encryptPayload: false 27 | }; 28 | 29 | const MOCK_EXPECTION = { 30 | options: { 31 | id: 'foo', 32 | key: 'bar', 33 | algorithm: 'aes128', 34 | encryptPayload: false 35 | }, 36 | origin: 'http://foo.com', 37 | port: 1000, 38 | prefix: 'session-' 39 | }; 40 | 41 | describe('hawk command', () => { 42 | beforeEach(() => { 43 | options = null; 44 | middleware = null; 45 | try { 46 | fs.writeFileSync( 47 | configFilePath, 48 | JSON.stringify({}), 49 | {encoding: 'utf-8'} 50 | ); 51 | } catch(e) {} 52 | }); 53 | 54 | afterAll(() => { 55 | jest.unmock('../../../src/utils/startServer'); 56 | }); 57 | 58 | it('should parse options correctly', () => { 59 | hawkAction({}) 60 | // equals default options 61 | expect(options).toEqual({ 62 | options: { 63 | algorithm: 'sha256', 64 | encryptPayload: true 65 | }, 66 | origin: 'http://127.0.0.1:8000', 67 | prefix: '', 68 | }); 69 | }); 70 | 71 | it('should merge options properly', () => { 72 | hawkAction(MOCK_OPTIONS); 73 | expect(options).toEqual(MOCK_EXPECTION); 74 | }); 75 | 76 | it('should load config file properly', () => { 77 | let filePath = 'tmp.bridgit.json'; 78 | fs.writeFileSync(path.resolve(filePath), JSON.stringify(MOCK_OPTIONS), { 79 | encoding: 'utf-8', 80 | }); 81 | hawkAction({ 82 | config: filePath 83 | }); 84 | expect(options).toEqual(MOCK_EXPECTION); 85 | }); 86 | 87 | it('throws when option is not an object', () => { 88 | expect(() => { 89 | hawkAction('foo'); 90 | }).toThrow(); 91 | }); 92 | }); -------------------------------------------------------------------------------- /test/unit/index.spec.js: -------------------------------------------------------------------------------- 1 | require('assert'); 2 | 3 | const bridgit = require('../../src'); 4 | 5 | describe('index', () => { 6 | it('exposes a function', () => { 7 | expect(typeof bridgit).toBe('function'); 8 | }); 9 | }); -------------------------------------------------------------------------------- /test/unit/utils/index.spec.js: -------------------------------------------------------------------------------- 1 | require('assert'); 2 | const {requireSrc} = require('../../helpers'); 3 | 4 | const {clearEmpty} = requireSrc('utils'); 5 | 6 | describe('util index, clearEmpty', () => { 7 | it('throws when argument is not object', () => { 8 | expect(() => { 9 | clearEmpty('foo'); 10 | }).toThrow(); 11 | }); 12 | 13 | it('returns a new object', () => { 14 | let src = {}; 15 | let ret = clearEmpty(src); 16 | expect(ret).not.toBe(src); 17 | }); 18 | 19 | it('remove properties whose value is null or undefined', () => { 20 | let src = { 21 | name: 'foo', 22 | age: null, 23 | sex: undefined 24 | }; 25 | let ret = clearEmpty(src); 26 | expect(ret).toEqual({name: 'foo'}); 27 | }); 28 | }); -------------------------------------------------------------------------------- /test/unit/utils/logger.spec.js: -------------------------------------------------------------------------------- 1 | require('assert'); 2 | jest.mock('chalk', () => { 3 | return { 4 | yellow: jest.fn(), 5 | cyan: jest.fn(), 6 | } 7 | }); 8 | 9 | const chalk = require('chalk'); 10 | const {requireSrc} = require('../../helpers'); 11 | 12 | const {colorful} = requireSrc('utils/logger'); 13 | 14 | describe('util logger', () => { 15 | beforeAll(() => { 16 | 17 | }); 18 | 19 | afterAll(() => { 20 | jest.unmock('chalk'); 21 | }); 22 | 23 | test('colorful log yellow in color with 1 argument', () => { 24 | colorful('foo'); 25 | expect(chalk.yellow.mock.calls.length).toBe(1) 26 | }); 27 | 28 | test('colorful log with right color and right timestamp', () => { 29 | colorful('foo', 'cyan', true); 30 | expect(chalk.cyan.mock.calls.length).toBe(1); 31 | expect(chalk.cyan.mock.calls[0][0]).toMatch(/\[.+\] -/); 32 | }) 33 | }); -------------------------------------------------------------------------------- /test/unit/utils/mergeConfiguration.spec.js: -------------------------------------------------------------------------------- 1 | require('assert'); 2 | const path = require('path'); 3 | const fs = require('fs'); 4 | const {requireSrc} = require('../../helpers'); 5 | 6 | const merge = requireSrc('utils/mergeConfiguration'); 7 | const {configFilePath, configKeys} = requireSrc('constants'); 8 | 9 | 10 | describe('util mergeConfiguration', () => { 11 | beforeEach(() => { 12 | try { 13 | fs.unlinkSync(configFilePath); 14 | } catch(e) {} 15 | }); 16 | 17 | it('should merge defaults and configurations with arguments', () => { 18 | fs.writeFileSync( 19 | configFilePath, 20 | JSON.stringify({origin: 'https://www.google.com'}), 21 | {encoding: 'utf-8'} 22 | ); 23 | 24 | let res = merge({id: 'foo'}, {key: 'bar'}); 25 | expect(res).toEqual({ 26 | id: 'foo', 27 | key: 'bar', 28 | origin: 'https://www.google.com', 29 | prefix: '', 30 | algorithm: 'sha256', 31 | encryptPayload: true 32 | }); 33 | }); 34 | 35 | it('should throw when argument is not object', () => { 36 | expect(() => { 37 | merge('foo'); 38 | }).toThrow(); 39 | }); 40 | 41 | it('should omit null in configuration and arguments', () => { 42 | fs.writeFileSync( 43 | configFilePath, 44 | JSON.stringify({origin: null}), 45 | {encoding: 'utf-8'} 46 | ); 47 | 48 | let res = merge({id: null}, {key: null}); 49 | expect(res).toEqual({ 50 | origin: 'http://127.0.0.1:8000', 51 | prefix: '', 52 | algorithm: 'sha256', 53 | encryptPayload: true 54 | }); 55 | }) 56 | }) --------------------------------------------------------------------------------