diff --git a/.travis.yml b/.travis.yml index cc332d8..f95aeff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ language: node_js node_js: - "node" - "lts/*" + - "9" - "8" services: diff --git a/Dockerfile b/Dockerfile index a22e20c..167492f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,26 @@ -FROM node:8 +FROM node:alpine WORKDIR /usr/src/app +RUN apk add --no-cache make gcc g++ python tzdata && \ + cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone && \ + apk del tzdata + ADD ./index.js ./tsconfig.json ./jsconfig.json ./package.json /usr/src/app/ # --registry=https://registry.npm.taobao.org -RUN npm install +RUN npm set progress=false && npm install --no-progress ADD ./src /usr/src/app/src ADD ./config /usr/src/app/config RUN npm run tsc && \ - rm -rf node_modules && \ - npm install --production && \ - npm install cross-env tsconfig-paths --save-dev && \ + npm prune --production && \ + npm install cross-env tsconfig-paths typescript tslib --save-dev && \ npm install pm2 --global && \ - npm cache clean -f + npm cache clean -f && \ + rm -rf ./package-lock.json CMD pm2 start index.js --node-args="-r tsconfig-paths/register" -i 0 --no-daemon # CMD [ "npm", "run", "start:prod" ] diff --git a/README.md b/README.md index ff1068c..06408c3 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,27 @@ -# Store Box +# StoreBox-Api Store PandoraBox Firmware Images and its packages -[![Travis](https://img.shields.io/travis/BoxSystem/StoreBox-Api.svg?style=flat-square)](https://travis-ci.org/BoxSystem/StoreBox-Api) +[![Travis](https://img.shields.io/travis/BoxSystem/StoreBox-Api.svg?style=flat-square&logo=travis)](https://travis-ci.org/BoxSystem/StoreBox-Api) [![Coveralls](https://img.shields.io/coveralls/github/BoxSystem/StoreBox-Api.svg?style=flat-square)](https://coveralls.io/github/BoxSystem/StoreBox-Api) [![Known Vulnerabilities](https://snyk.io/test/github/BoxSystem/StoreBox-Api/badge.svg?style=flat-square)](https://snyk.io/test/github/BoxSystem/StoreBox-Api) -[![license](https://img.shields.io/github/license/BoxSystem/StoreBox-Api.svg?style=flat-square)](https://github.com/BoxSystem/StoreBox-Api) +[![TypeScript](https://img.shields.io/badge/Language-Typescript-blue.svg?style=flat-square&maxAge=7200)](http://www.typescriptlang.org/) +[![license](https://img.shields.io/github/license/BoxSystem/StoreBox-Api.svg?style=flat-square&maxAge=7200)](https://github.com/BoxSystem/StoreBox-Api) # Usage ## Docker Edition ```bash -docker pull arylo/storebox -docker run -p 9000:9000 arylo/storebox +docker pull arylo/storebox-api +docker run -p 9000:9000 arylo/storebox-api ``` or ```bash -docker build -t arylo/storebox . -docker run -p 9000:9000 arylo/storebox +docker build -t arylo/storebox-api . +docker run -p 9000:9000 arylo/storebox-api ``` ### Docker-compose diff --git a/TODOLIST.md b/TODOLIST.md index 6260308..248fa7c 100644 --- a/TODOLIST.md +++ b/TODOLIST.md @@ -6,9 +6,11 @@ - [x] 上传到指定Categroy - [x] 上传时追加Catogroy - [x] 整顿collectin info的goods 列表 -- [ ] Token 使用日志显示 -- [ ] Good 下载次数统计 -- [ ] 接入统计 +- [ ] 统计 + - [ ] Token 使用日志显示 + - [ ] 用户登录记录 + - [x] Good 下载次数统计 + - [ ] 接入统计 - [x] 配置文件写入初始化用户账号密码 - [ ] 接入AuthBox - [x] Redis 接入 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 81a2e12..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4906 +0,0 @@ -{ - "name": "storebox", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@nestjs/common": { - "version": "4.5.2", - "resolved": "http://registry.npm.taobao.org/@nestjs/common/download/@nestjs/common-4.5.2.tgz", - "integrity": "sha1-y+b5e48rdDEPuOrUMRuMXPG/ANQ=", - "requires": { - "class-transformer": "0.1.8", - "class-validator": "0.7.3", - "cli-color": "1.1.0" - } - }, - "@nestjs/core": { - "version": "4.5.2", - "resolved": "http://registry.npm.taobao.org/@nestjs/core/download/@nestjs/core-4.5.2.tgz", - "integrity": "sha1-Xv9iEX4w2cVFnQA3dobuFa0yWJQ=", - "requires": { - "body-parser": "1.17.2", - "express": "4.16.2", - "iterare": "0.0.8", - "optional": "0.1.4" - }, - "dependencies": { - "body-parser": { - "version": "1.17.2", - "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "requires": { - "bytes": "2.4.0", - "content-type": "1.0.4", - "debug": "2.6.7", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.15", - "on-finished": "2.3.0", - "qs": "6.4.0", - "raw-body": "2.2.0", - "type-is": "1.6.15" - } - } - } - }, - "@nestjs/swagger": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/@nestjs/swagger/download/@nestjs/swagger-1.1.3.tgz", - "integrity": "sha1-HVL/mDsEFMRAOLnJqVcE++I5F6s=", - "requires": { - "lodash": "4.17.4", - "swagger-ui-express": "2.0.11" - } - }, - "@nestjs/testing": { - "version": "4.5.2", - "resolved": "http://registry.npm.taobao.org/@nestjs/testing/download/@nestjs/testing-4.5.2.tgz", - "integrity": "sha1-0XSXnxwLkzeFE9x8dTvoT2AoFL8=", - "dev": true, - "requires": { - "optional": "0.1.4" - } - }, - "@types/body-parser": { - "version": "1.16.8", - "resolved": "http://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.16.8.tgz", - "integrity": "sha1-aH7DQUBiSjvsKxqOqSaEeK6PO+M=", - "dev": true, - "requires": { - "@types/express": "4.11.0", - "@types/node": "8.5.2" - } - }, - "@types/bson": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/@types/bson/download/@types/bson-1.0.6.tgz", - "integrity": "sha1-hpHwQtmd0WOl603W3eWH00SffNo=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/bunyan": { - "version": "1.8.4", - "resolved": "http://registry.npm.taobao.org/@types/bunyan/download/@types/bunyan-1.8.4.tgz", - "integrity": "sha1-acEa3HtQU41F+2jZrjnQYrlDLzg=", - "dev": true, - "requires": { - "@types/events": "1.1.0", - "@types/node": "8.5.2" - } - }, - "@types/cors": { - "version": "2.8.3", - "resolved": "http://registry.npm.taobao.org/@types/cors/download/@types/cors-2.8.3.tgz", - "integrity": "sha1-6vbkdtoNNr7msGGiTVfjQ93OhtY=", - "dev": true, - "requires": { - "@types/express": "4.11.0" - } - }, - "@types/events": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/@types/events/download/@types/events-1.1.0.tgz", - "integrity": "sha1-k7G+kfY8GERQOFJyxHtklv0CjgI=", - "dev": true - }, - "@types/express": { - "version": "4.11.0", - "resolved": "http://registry.npm.taobao.org/@types/express/download/@types/express-4.11.0.tgz", - "integrity": "sha1-I01lKAr5F8spBjS3qNa8rCSuy60=", - "dev": true, - "requires": { - "@types/body-parser": "1.16.8", - "@types/express-serve-static-core": "4.11.0", - "@types/serve-static": "1.13.1" - } - }, - "@types/express-serve-static-core": { - "version": "4.11.0", - "resolved": "http://registry.npm.taobao.org/@types/express-serve-static-core/download/@types/express-serve-static-core-4.11.0.tgz", - "integrity": "sha1-qq9HJ3cZHD5W7HqhYANMa1Xr3Vk=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/faker": { - "version": "4.1.2", - "resolved": "http://registry.npm.taobao.org/@types/faker/download/@types/faker-4.1.2.tgz", - "integrity": "sha1-+KtQyfmvaMFg3XG2P4PiS3EtDfU=", - "dev": true - }, - "@types/fs-extra": { - "version": "4.0.7", - "resolved": "http://registry.npm.taobao.org/@types/fs-extra/download/@types/fs-extra-4.0.7.tgz", - "integrity": "sha1-AlMyYjhrWmuaSXl9yC/v/fJpFAo=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/glob": { - "version": "5.0.34", - "resolved": "http://registry.npm.taobao.org/@types/glob/download/@types/glob-5.0.34.tgz", - "integrity": "sha1-7mJsm+Pah31xeRHGEB7uCphxu/Q=", - "dev": true, - "requires": { - "@types/events": "1.1.0", - "@types/minimatch": "3.0.3", - "@types/node": "8.5.2" - } - }, - "@types/hasha": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/@types/hasha/download/@types/hasha-3.0.0.tgz", - "integrity": "sha1-WHjjBwFO4ZJGyjkgNGbdvLtZFnA=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/lodash": { - "version": "4.14.91", - "resolved": "http://registry.npm.taobao.org/@types/lodash/download/@types/lodash-4.14.91.tgz", - "integrity": "sha1-eUYRsoBW0WtUNgWcbYALOdVzzTo=", - "dev": true - }, - "@types/md5": { - "version": "2.1.32", - "resolved": "http://registry.npm.taobao.org/@types/md5/download/@types/md5-2.1.32.tgz", - "integrity": "sha1-k+I0N/zRenucqY0CqmAC6DWEL+g=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/mime": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/@types/mime/download/@types/mime-2.0.0.tgz", - "integrity": "sha1-WnMG42fFObn2VDSZ3o3VGfrDeos=", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz", - "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", - "dev": true - }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/@types/mkdirp/download/@types/mkdirp-0.5.2.tgz", - "integrity": "sha1-UDqs/lzCcD1UhDJrGyfvpnoznB8=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/mocha": { - "version": "2.2.44", - "resolved": "http://registry.npm.taobao.org/@types/mocha/download/@types/mocha-2.2.44.tgz", - "integrity": "sha1-HUp5jlPzUhL9WtTQQFBiAXHNW14=", - "dev": true - }, - "@types/mongodb": { - "version": "2.2.18", - "resolved": "http://registry.npm.taobao.org/@types/mongodb/download/@types/mongodb-2.2.18.tgz", - "integrity": "sha1-a2IFbAgcm7pCUwyDHP+12k50gEw=", - "dev": true, - "requires": { - "@types/bson": "1.0.6", - "@types/events": "1.1.0", - "@types/node": "8.5.2" - } - }, - "@types/mongoose": { - "version": "4.7.30", - "resolved": "http://registry.npm.taobao.org/@types/mongoose/download/@types/mongoose-4.7.30.tgz", - "integrity": "sha1-aNIHHE4lDnhJ84O9PUsjOiIPcMg=", - "dev": true, - "requires": { - "@types/events": "1.1.0", - "@types/mongodb": "2.2.18", - "@types/node": "8.5.2" - } - }, - "@types/multer": { - "version": "1.3.6", - "resolved": "http://registry.npm.taobao.org/@types/multer/download/@types/multer-1.3.6.tgz", - "integrity": "sha1-4ARUB0v5/YbSDqZS66mFDrdmBMQ=", - "dev": true, - "requires": { - "@types/express": "4.11.0" - } - }, - "@types/node": { - "version": "8.5.2", - "resolved": "http://registry.npm.taobao.org/@types/node/download/@types/node-8.5.2.tgz", - "integrity": "sha1-g7gQP6miwug9ePcBqap8lTlzmqU=", - "dev": true - }, - "@types/path-exists": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/@types/path-exists/download/@types/path-exists-3.0.0.tgz", - "integrity": "sha1-umsrR3/PXPfchKw7orzbz+Mj9P4=", - "dev": true - }, - "@types/reflect-metadata": { - "version": "0.0.5", - "resolved": "http://registry.npm.taobao.org/@types/reflect-metadata/download/@types/reflect-metadata-0.0.5.tgz", - "integrity": "sha1-nAQr+pgD1Xeq1PV9+8pLfK5Chv4=", - "dev": true - }, - "@types/rimraf": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/@types/rimraf/download/@types/rimraf-2.0.2.tgz", - "integrity": "sha1-fw/Dzw/wrSqZu3I64XZPMKyvi24=", - "dev": true, - "requires": { - "@types/glob": "5.0.34", - "@types/node": "8.5.2" - } - }, - "@types/serve-static": { - "version": "1.13.1", - "resolved": "http://registry.npm.taobao.org/@types/serve-static/download/@types/serve-static-1.13.1.tgz", - "integrity": "sha1-HSgB+mNdJ0zZfU7AfiayG0QSdJI=", - "dev": true, - "requires": { - "@types/express-serve-static-core": "4.11.0", - "@types/mime": "2.0.0" - } - }, - "@types/should": { - "version": "11.2.0", - "resolved": "http://registry.npm.taobao.org/@types/should/download/@types/should-11.2.0.tgz", - "integrity": "sha1-50qt/BOhoPxLQ3hgk+2jlbazImM=", - "dev": true - }, - "@types/superagent": { - "version": "3.5.6", - "resolved": "http://registry.npm.taobao.org/@types/superagent/download/@types/superagent-3.5.6.tgz", - "integrity": "sha1-nPJjLAdbqeYB9qYQqtwjmS0COUw=", - "dev": true, - "requires": { - "@types/node": "8.5.2" - } - }, - "@types/supertest": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/@types/supertest/download/@types/supertest-2.0.4.tgz", - "integrity": "sha1-KHcOEykzZeJAqELX1cWhs9Le5ZM=", - "dev": true, - "requires": { - "@types/superagent": "3.5.6" - } - }, - "@types/useragent": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/@types/useragent/download/@types/useragent-2.1.1.tgz", - "integrity": "sha1-5+iX+GeUGwPEEUT2Wcj49BKnLQY=", - "dev": true - }, - "accepts": { - "version": "1.3.4", - "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "append-field": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/append-field/download/append-field-0.1.0.tgz", - "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "async": { - "version": "2.1.4", - "resolved": "http://registry.npm.taobao.org/async/download/async-2.1.4.tgz", - "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", - "requires": { - "lodash": "4.17.4" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bluebird": { - "version": "3.5.0", - "resolved": "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz", - "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" - }, - "qs": { - "version": "6.5.1", - "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "bson": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/bson/download/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" - }, - "buffer-alloc": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.1.0.tgz", - "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", - "requires": { - "buffer-alloc-unsafe": "0.1.1", - "buffer-fill": "0.1.0" - } - }, - "buffer-alloc-unsafe": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-0.1.1.tgz", - "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=" - }, - "buffer-fill": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/buffer-fill/download/buffer-fill-0.1.0.tgz", - "integrity": "sha1-ypRw6NTRuXf9dUP04qtqfclRAag=" - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/buffer-shims/download/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bunyan": { - "version": "1.8.12", - "resolved": "http://registry.npm.taobao.org/bunyan/download/bunyan-1.8.12.tgz", - "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", - "requires": { - "dtrace-provider": "0.8.5", - "moment": "2.20.1", - "mv": "2.1.1", - "safe-json-stringify": "1.0.4" - } - }, - "busboy": { - "version": "0.2.14", - "resolved": "http://registry.npm.taobao.org/busboy/download/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "bytes": { - "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "http://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "class-transformer": { - "version": "0.1.8", - "resolved": "http://registry.npm.taobao.org/class-transformer/download/class-transformer-0.1.8.tgz", - "integrity": "sha1-vgTdKvt7MB5MjHnFNJ/tqsPVp+E=" - }, - "class-validator": { - "version": "0.7.3", - "resolved": "http://registry.npm.taobao.org/class-validator/download/class-validator-0.7.3.tgz", - "integrity": "sha1-PCghuM81/Y1fT8uAY7xX+1AEnn4=", - "requires": { - "validator": "7.2.0" - } - }, - "cli-color": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/cli-color/download/cli-color-1.1.0.tgz", - "integrity": "sha1-3hiM3Ekp2DtnrqBBEPvtQP2/Z3U=", - "requires": { - "ansi-regex": "2.1.1", - "d": "0.1.1", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "memoizee": "0.3.10", - "timers-ext": "0.1.2" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha1-wF2uDLeVkdBbMHCoQzqYyaiczFM=" - }, - "color-convert": { - "version": "1.9.1", - "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.7", - "typedarray": "0.0.6" - } - }, - "config-yaml": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/config-yaml/-/config-yaml-1.0.6.tgz", - "integrity": "sha1-bM60uomhIweBLMCkJzlhSGePw4A=", - "requires": { - "deepmerge": "1.5.2", - "js-yaml": "3.10.0" - }, - "dependencies": { - "deepmerge": { - "version": "1.5.2", - "resolved": "http://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz", - "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=" - } - } - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" - }, - "cookie": { - "version": "0.3.1", - "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-parser": { - "version": "1.4.3", - "resolved": "http://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.3.tgz", - "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6" - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/cookiejar/download/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.4", - "resolved": "http://registry.npm.taobao.org/cors/download/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", - "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" - } - }, - "crc": { - "version": "3.4.4", - "resolved": "http://registry.npm.taobao.org/crc/download/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, - "create-react-class": { - "version": "15.6.2", - "resolved": "http://registry.npm.taobao.org/create-react-class/download/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "cron-parser": { - "version": "2.4.3", - "resolved": "http://registry.npm.taobao.org/cron-parser/download/cron-parser-2.4.3.tgz", - "integrity": "sha1-yuhEwgEX/HLGePY6yDx4hL4Znng=", - "requires": { - "is-nan": "1.2.1", - "moment-timezone": "0.5.14" - } - }, - "cross-env": { - "version": "5.1.3", - "resolved": "http://registry.npm.taobao.org/cross-env/download/cross-env-5.1.3.tgz", - "integrity": "sha1-+K4Y+qyHaSsKi00vcADU7DqF39c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "http://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "d": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/d/download/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "requires": { - "es5-ext": "0.10.37" - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/dateformat/download/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "debug": { - "version": "2.6.7", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deepmerge": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/deepmerge/download/deepmerge-2.0.1.tgz", - "integrity": "sha1-JcHCTxEPuRT4AAG5JSZN138/QxI=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "dicer": { - "version": "0.2.5", - "resolved": "http://registry.npm.taobao.org/dicer/download/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.14", - "streamsearch": "0.1.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "diff": { - "version": "3.3.1", - "resolved": "http://registry.npm.taobao.org/diff/download/diff-3.3.1.tgz", - "integrity": "sha1-qoVnpu7QPFMfyJ0/cRzQ5SWd7HU=", - "dev": true - }, - "dtrace-provider": { - "version": "0.8.5", - "resolved": "http://registry.npm.taobao.org/dtrace-provider/download/dtrace-provider-0.8.5.tgz", - "integrity": "sha1-mOu6Ihr6xG4cOf02hY2Pk2dSS5I=", - "optional": true, - "requires": { - "nan": "2.8.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "http://registry.npm.taobao.org/encoding/download/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "0.4.15" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es5-ext": { - "version": "0.10.37", - "resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-symbol": "3.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.37" - } - } - } - }, - "es6-promise": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/es6-promise/download/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.37" - } - } - } - }, - "es6-weak-map": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-0.1.4.tgz", - "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", - "requires": { - "d": "0.1.1", - "es5-ext": "0.10.37", - "es6-iterator": "0.1.3", - "es6-symbol": "2.0.1" - }, - "dependencies": { - "es6-iterator": { - "version": "0.1.3", - "resolved": "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-0.1.3.tgz", - "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", - "requires": { - "d": "0.1.1", - "es5-ext": "0.10.37", - "es6-symbol": "2.0.1" - } - }, - "es6-symbol": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-2.0.1.tgz", - "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", - "requires": { - "d": "0.1.1", - "es5-ext": "0.10.37" - } - } - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "http://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.37" - } - } - } - }, - "express": { - "version": "4.16.2", - "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.5.1", - "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" - }, - "statuses": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "express-session": { - "version": "1.15.6", - "resolved": "http://registry.npm.taobao.org/express-session/download/express-session-1.15.6.tgz", - "integrity": "sha1-R7QWDIj0KrcP6KUI4xy/92dXqwo=", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "crc": "3.4.4", - "debug": "2.6.9", - "depd": "1.1.1", - "on-headers": "1.0.1", - "parseurl": "1.3.2", - "uid-safe": "2.1.5", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "faker": { - "version": "4.1.0", - "resolved": "http://registry.npm.taobao.org/faker/download/faker-4.1.0.tgz", - "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=", - "dev": true - }, - "fbjs": { - "version": "0.8.16", - "resolved": "http://registry.npm.taobao.org/fbjs/download/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "dev": true, - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - } - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "http://registry.npm.taobao.org/foreach/download/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "dev": true, - "requires": { - "async": "1.5.2", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/formidable/download/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz", - "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsu": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/fsu/download/fsu-1.0.4.tgz", - "integrity": "sha1-WGqPvY0ZrN8zDOy88X1kHpw3C6A=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.10.3", - "resolved": "http://registry.npm.taobao.org/growl/download/growl-1.10.3.tgz", - "integrity": "sha1-GSa6kM8+3+KttJJ/WIC8IsZseQ8=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "hasha": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/hasha/download/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "requires": { - "is-stream": "1.1.0" - } - }, - "he": { - "version": "1.1.1", - "resolved": "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hooks-fixed": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/hooks-fixed/download/hooks-fixed-2.0.2.tgz", - "integrity": "sha1-IAdtqgfnfYphBog84/FyLgURQLA=" - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "iconv-lite": { - "version": "0.4.15", - "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-nan": { - "version": "1.2.1", - "resolved": "http://registry.npm.taobao.org/is-nan/download/is-nan-1.2.1.tgz", - "integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=", - "requires": { - "define-properties": "1.1.2" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/isomorphic-fetch/download/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" - } - }, - "iterare": { - "version": "0.0.8", - "resolved": "http://registry.npm.taobao.org/iterare/download/iterare-0.0.8.tgz", - "integrity": "sha1-qWmoCh+/9rePKHdllNe8K9+raq0=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz", - "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "kareem": { - "version": "1.5.0", - "resolved": "http://registry.npm.taobao.org/kareem/download/kareem-1.5.0.tgz", - "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isfunction": { - "version": "3.0.8", - "resolved": "http://registry.npm.taobao.org/lodash.isfunction/download/lodash.isfunction-3.0.8.tgz", - "integrity": "sha1-TbcJ/IG8So/XEnpFilNGxc3OLGs=", - "dev": true - }, - "long-timeout": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/long-timeout/download/long-timeout-0.1.1.tgz", - "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "http://registry.npm.taobao.org/lru-queue/download/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "requires": { - "es5-ext": "0.10.37" - } - }, - "make-error": { - "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/make-error/download/make-error-1.3.2.tgz", - "integrity": "sha1-h2L/rSRE3Y/x98gZYp+ijiT+ocQ=", - "dev": true - }, - "md5": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/md5/download/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" - } - }, - "md5-file": { - "version": "3.2.3", - "resolved": "http://registry.npm.taobao.org/md5-file/download/md5-file-3.2.3.tgz", - "integrity": "sha1-+bzrlB7KIhSkwHJ/XnADFOdw8G8=", - "requires": { - "buffer-alloc": "1.1.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memoizee": { - "version": "0.3.10", - "resolved": "http://registry.npm.taobao.org/memoizee/download/memoizee-0.3.10.tgz", - "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", - "requires": { - "d": "0.1.1", - "es5-ext": "0.10.37", - "es6-weak-map": "0.1.4", - "event-emitter": "0.3.5", - "lru-queue": "0.1.0", - "next-tick": "0.2.2", - "timers-ext": "0.1.2" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.4.1", - "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/mocha/download/mocha-4.0.1.tgz", - "integrity": "sha1-Cu5alc9ppGGIIPXlH6MXFxF9rxs=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "mochawesome": { - "version": "2.3.1", - "resolved": "http://registry.npm.taobao.org/mochawesome/download/mochawesome-2.3.1.tgz", - "integrity": "sha1-Q7JEXkuiX1hbzaaeVZLAgV+cNwk=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "chalk": "1.1.3", - "diff": "3.3.1", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "mochawesome-report-generator": "2.3.2", - "strip-ansi": "4.0.0", - "uuid": "3.1.0" - } - }, - "mochawesome-report-generator": { - "version": "2.3.2", - "resolved": "http://registry.npm.taobao.org/mochawesome-report-generator/download/mochawesome-report-generator-2.3.2.tgz", - "integrity": "sha1-OmiFmW0yg2Ej/kAttDdOkJ5UoSc=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fs-extra": "3.0.1", - "fsu": "1.0.4", - "lodash.isfunction": "3.0.8", - "opener": "1.4.3", - "prop-types": "15.6.0", - "react": "15.6.2", - "react-dom": "15.6.2", - "tcomb": "3.2.24", - "tcomb-validation": "3.4.1", - "validator": "7.2.0", - "yargs": "7.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", - "universalify": "0.1.1" - } - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/jsonfile/download/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - } - } - }, - "moment": { - "version": "2.20.1", - "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz", - "integrity": "sha1-1usaRsvMFKKy+UNBEsH/iQfzE/0=" - }, - "moment-timezone": { - "version": "0.5.14", - "resolved": "http://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.14.tgz", - "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", - "requires": { - "moment": "2.20.1" - } - }, - "mongodb": { - "version": "2.2.33", - "resolved": "http://registry.npm.taobao.org/mongodb/download/mongodb-2.2.33.tgz", - "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.17", - "readable-stream": "2.2.7" - } - }, - "mongodb-core": { - "version": "2.1.17", - "resolved": "http://registry.npm.taobao.org/mongodb-core/download/mongodb-core-2.1.17.tgz", - "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", - "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" - } - }, - "mongoose": { - "version": "4.13.7", - "resolved": "http://registry.npm.taobao.org/mongoose/download/mongoose-4.13.7.tgz", - "integrity": "sha1-92DHcObIzfNKb+i3RDiCtfztEDI=", - "requires": { - "async": "2.1.4", - "bson": "1.0.4", - "hooks-fixed": "2.0.2", - "kareem": "1.5.0", - "lodash.get": "4.4.2", - "mongodb": "2.2.33", - "mpath": "0.3.0", - "mpromise": "0.5.5", - "mquery": "2.3.3", - "ms": "2.0.0", - "muri": "1.3.0", - "regexp-clone": "0.0.1", - "sliced": "1.0.1" - } - }, - "mpath": { - "version": "0.3.0", - "resolved": "http://registry.npm.taobao.org/mpath/download/mpath-0.3.0.tgz", - "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" - }, - "mpromise": { - "version": "0.5.5", - "resolved": "http://registry.npm.taobao.org/mpromise/download/mpromise-0.5.5.tgz", - "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" - }, - "mquery": { - "version": "2.3.3", - "resolved": "http://registry.npm.taobao.org/mquery/download/mquery-2.3.3.tgz", - "integrity": "sha1-IhQS5dTnKQylWC3RbqjxkKUGtRg=", - "requires": { - "bluebird": "3.5.0", - "debug": "2.6.9", - "regexp-clone": "0.0.1", - "sliced": "0.0.5" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "sliced": { - "version": "0.0.5", - "resolved": "http://registry.npm.taobao.org/sliced/download/sliced-0.0.5.tgz", - "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multer": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/multer/download/multer-1.3.0.tgz", - "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", - "requires": { - "append-field": "0.1.0", - "busboy": "0.2.14", - "concat-stream": "1.6.0", - "mkdirp": "0.5.1", - "object-assign": "3.0.0", - "on-finished": "2.3.0", - "type-is": "1.6.15", - "xtend": "4.0.1" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, - "muri": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/muri/download/muri-1.3.0.tgz", - "integrity": "sha1-rszz22TFaqfFs04A+Vt4eFJ6RyE=" - }, - "mv": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "ncp": "2.0.0" - } - }, - "nan": { - "version": "2.8.0", - "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "optional": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "next-tick": { - "version": "0.2.2", - "resolved": "http://registry.npm.taobao.org/next-tick/download/next-tick-0.2.2.tgz", - "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=" - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "http://registry.npm.taobao.org/node-fetch/download/node-fetch-1.7.3.tgz", - "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", - "dev": true, - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-schedule": { - "version": "1.2.5", - "resolved": "http://registry.npm.taobao.org/node-schedule/download/node-schedule-1.2.5.tgz", - "integrity": "sha1-+zD05NHdHoHFNvlJXV2g6eLX3hQ=", - "requires": { - "cron-parser": "2.4.3", - "long-timeout": "0.1.1", - "sorted-array-functions": "1.0.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nyc": { - "version": "11.4.1", - "resolved": "http://registry.npm.taobao.org/nyc/download/nyc-11.4.1.tgz", - "integrity": "sha1-E/335+8i0CfGHRdHWPaXimj09eU=", - "dev": true, - "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.5.1", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "2.1.0", - "foreground-child": "1.5.6", - "glob": "7.1.2", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-report": "1.1.2", - "istanbul-lib-source-maps": "1.2.2", - "istanbul-reports": "1.1.3", - "md5-hex": "1.3.0", - "merge-source-map": "1.0.4", - "micromatch": "2.3.11", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "spawn-wrap": "1.4.2", - "test-exclude": "4.1.1", - "yargs": "10.0.3", - "yargs-parser": "8.0.0" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "dev": true, - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "which": "1.3.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "2.0.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", - "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", - "dev": true, - "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" - } - }, - "istanbul-lib-report": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", - "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", - "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", - "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", - "dev": true, - "requires": { - "handlebars": "4.0.11" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "which": "1.3.0" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "test-exclude": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", - "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - } - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", - "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.0.0" - }, - "dependencies": { - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - } - } - }, - "yargs-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", - "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-keys": { - "version": "1.0.11", - "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" - }, - "once": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opener": { - "version": "1.4.3", - "resolved": "http://registry.npm.taobao.org/opener/download/opener-1.4.3.tgz", - "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", - "dev": true - }, - "optional": { - "version": "0.1.4", - "resolved": "http://registry.npm.taobao.org/optional/download/optional-0.1.4.tgz", - "integrity": "sha1-zbGpvtxzfSAl9pDO61DgSURP1bM=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "promise": { - "version": "7.3.1", - "resolved": "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", - "dev": true, - "requires": { - "asap": "2.0.6" - } - }, - "prop-types": { - "version": "15.6.0", - "resolved": "http://registry.npm.taobao.org/prop-types/download/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/random-bytes/download/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.2.0", - "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.2.0.tgz", - "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.15", - "unpipe": "1.0.0" - } - }, - "react": { - "version": "15.6.2", - "resolved": "http://registry.npm.taobao.org/react/download/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "dev": true, - "requires": { - "create-react-class": "15.6.2", - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" - } - }, - "react-dom": { - "version": "15.6.2", - "resolved": "http://registry.npm.taobao.org/react-dom/download/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.2.7", - "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "reflect-metadata": { - "version": "0.1.10", - "resolved": "http://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", - "dev": true - }, - "regexp-clone": { - "version": "0.0.1", - "resolved": "http://registry.npm.taobao.org/regexp-clone/download/regexp-clone-0.0.1.tgz", - "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require_optional": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/require_optional/download/require_optional-1.0.1.tgz", - "integrity": "sha1-TPNaQkf2TKPfjC7yCMxJSxyo/C4=", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.4.1" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.5.0.tgz", - "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "rimraf": { - "version": "2.6.2", - "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "rxjs": { - "version": "5.5.6", - "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-5.5.6.tgz", - "integrity": "sha1-4x+5bW/S/x/YS86orpwC0AcXnAI=", - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "safe-json-stringify": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.0.4.tgz", - "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", - "optional": true - }, - "schedule-cache": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/schedule-cache/download/schedule-cache-1.0.0.tgz", - "integrity": "sha1-+oiayO3prZOOLOiKQcNPVk2EeoE=", - "requires": { - "node-schedule": "1.2.5" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" - }, - "send": { - "version": "0.16.1", - "resolved": "http://registry.npm.taobao.org/send/download/send-0.16.1.tgz", - "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=", - "requires": { - "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.1.tgz", - "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "http://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "should": { - "version": "12.0.0", - "resolved": "http://registry.npm.taobao.org/should/download/should-12.0.0.tgz", - "integrity": "sha1-hGZnzSQWkaZQn/8IIPRNORQ93Pc=", - "dev": true, - "requires": { - "should-equal": "2.0.0", - "should-format": "3.0.3", - "should-type": "1.4.0", - "should-type-adaptors": "1.1.0", - "should-util": "1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/should-equal/download/should-equal-2.0.0.tgz", - "integrity": "sha1-YHLPgwRzYIZ+aOmLCdcRQ9BO4MM=", - "dev": true, - "requires": { - "should-type": "1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "http://registry.npm.taobao.org/should-format/download/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "1.4.0", - "should-type-adaptors": "1.1.0" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/should-type/download/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/should-type-adaptors/download/should-type-adaptors-1.1.0.tgz", - "integrity": "sha1-QB5/M7VTMDOUTVzYvytlAneS4no=", - "dev": true, - "requires": { - "should-type": "1.4.0", - "should-util": "1.0.0" - } - }, - "should-util": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/should-util/download/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "sliced": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/sliced/download/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "sorted-array-functions": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/sorted-array-functions/download/sorted-array-functions-1.0.0.tgz", - "integrity": "sha1-wLVU2ecJr/y+VtNMGyUUGX/Tgnk=" - }, - "source-map": { - "version": "0.6.1", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "source-map-support": { - "version": "0.5.0", - "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.0.tgz", - "integrity": "sha1-IBinrSvfj68mkeX92rJr7VorrKs=", - "dev": true, - "requires": { - "source-map": "0.6.1" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "statuses": { - "version": "1.4.0", - "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "superagent": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/superagent/download/superagent-2.3.0.tgz", - "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "2.6.7", - "extend": "3.0.1", - "form-data": "1.0.0-rc4", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.4.0", - "readable-stream": "2.2.7" - } - }, - "supertest": { - "version": "2.0.1", - "resolved": "http://registry.npm.taobao.org/supertest/download/supertest-2.0.1.tgz", - "integrity": "sha1-oFgIHXiPFRXUcA11Aogea3WeRM0=", - "dev": true, - "requires": { - "methods": "1.1.2", - "superagent": "2.3.0" - } - }, - "supertest-session": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/supertest-session/download/supertest-session-3.1.0.tgz", - "integrity": "sha1-OjgEy/RpmP+G9SEN+BKeBH0zBNs=", - "dev": true, - "requires": { - "cookiejar": "2.1.1", - "methods": "1.1.2", - "object-assign": "4.1.1", - "supertest": "2.0.1" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-4.4.0.tgz", - "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "swagger-ui-express": { - "version": "2.0.11", - "resolved": "http://registry.npm.taobao.org/swagger-ui-express/download/swagger-ui-express-2.0.11.tgz", - "integrity": "sha1-2zMc+IhkCpO3pbBhEbApB6S+nDU=" - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, - "tcomb": { - "version": "3.2.24", - "resolved": "http://registry.npm.taobao.org/tcomb/download/tcomb-3.2.24.tgz", - "integrity": "sha1-f0JwU8w5O1mXxMPYWcogQRGAiHs=", - "dev": true - }, - "tcomb-validation": { - "version": "3.4.1", - "resolved": "http://registry.npm.taobao.org/tcomb-validation/download/tcomb-validation-3.4.1.tgz", - "integrity": "sha1-p2luwXbOVqCB2eAZ+LcypaiJS2U=", - "dev": true, - "requires": { - "tcomb": "3.2.24" - } - }, - "timers-ext": { - "version": "0.1.2", - "resolved": "http://registry.npm.taobao.org/timers-ext/download/timers-ext-0.1.2.tgz", - "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", - "requires": { - "es5-ext": "0.10.37", - "next-tick": "1.0.0" - }, - "dependencies": { - "next-tick": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - } - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "ts-mocha": { - "version": "1.1.0", - "resolved": "http://registry.npm.taobao.org/ts-mocha/download/ts-mocha-1.1.0.tgz", - "integrity": "sha1-QBjDyYQWlSYqk0U0a7oek7ZJPGA=", - "dev": true, - "requires": { - "ts-node": "3.3.0" - } - }, - "ts-node": { - "version": "3.3.0", - "resolved": "http://registry.npm.taobao.org/ts-node/download/ts-node-3.3.0.tgz", - "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "chalk": "2.3.0", - "diff": "3.3.1", - "make-error": "1.3.2", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", - "v8flags": "3.0.1", - "yn": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - } - } - }, - "tsconfig": { - "version": "6.0.0", - "resolved": "http://registry.npm.taobao.org/tsconfig/download/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "2.6.0", - "resolved": "http://registry.npm.taobao.org/tsconfig-paths/download/tsconfig-paths-2.6.0.tgz", - "integrity": "sha1-3bjIavVO+SvXE3BGGJfzsCkv9J4=", - "dev": true, - "requires": { - "deepmerge": "2.0.1", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tslib": { - "version": "1.8.1", - "resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.8.1.tgz", - "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=", - "dev": true - }, - "tslint": { - "version": "5.8.0", - "resolved": "http://registry.npm.taobao.org/tslint/download/tslint-5.8.0.tgz", - "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.3.0", - "commander": "2.11.0", - "diff": "3.3.1", - "glob": "7.1.2", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.4.1", - "tslib": "1.8.1", - "tsutils": "2.13.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "tsutils": { - "version": "2.13.1", - "resolved": "http://registry.npm.taobao.org/tsutils/download/tsutils-2.13.1.tgz", - "integrity": "sha1-1tHMD3wEz5+zsoopKXPP+5z74Jo=", - "dev": true, - "requires": { - "tslib": "1.8.1" - } - }, - "type-is": { - "version": "1.6.15", - "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.17" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typescript": { - "version": "2.6.2", - "resolved": "http://registry.npm.taobao.org/typescript/download/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "http://registry.npm.taobao.org/ua-parser-js/download/ua-parser-js-0.7.17.tgz", - "integrity": "sha1-6exflJi57JEOeuOsYmqAXE0J7Kw=", - "dev": true - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "http://registry.npm.taobao.org/uid-safe/download/uid-safe-2.1.5.tgz", - "integrity": "sha1-Kz1cckDo/C5Y+Komnl7knAhXvTo=", - "requires": { - "random-bytes": "1.0.0" - } - }, - "universalify": { - "version": "0.1.1", - "resolved": "http://registry.npm.taobao.org/universalify/download/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "useragent": { - "version": "2.2.1", - "resolved": "http://registry.npm.taobao.org/useragent/download/useragent-2.2.1.tgz", - "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", - "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.33" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", - "dev": true - }, - "v8flags": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-3.0.1.tgz", - "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "validator": { - "version": "7.2.0", - "resolved": "http://registry.npm.taobao.org/validator/download/validator-7.2.0.tgz", - "integrity": "sha1-pj3Lq6UdQ1C/jfIJiODVpU1xF5E=" - }, - "vary": { - "version": "1.1.2", - "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "http://registry.npm.taobao.org/whatwg-fetch/download/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y-config": { - "version": "git://github.com/arylo/y-config.git#d54e6461b1cf554941e0a1a9ba61b9490b3a6ea9", - "requires": { - "coffee-script": "1.12.7", - "config-yaml": "1.0.6", - "lodash": "4.17.4" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - }, - "yn": { - "version": "2.0.0", - "resolved": "http://registry.npm.taobao.org/yn/download/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - } - } -} diff --git a/package.json b/package.json index dfa916c..c33893b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "storebox-api", - "version": "1.3.0", + "version": "1.3.1", "description": "", "main": "index.js", "scripts": { @@ -27,7 +27,7 @@ "author": "AryloYeung ", "license": "MIT", "devDependencies": { - "@nestjs/testing": "4.6.1", + "@nestjs/testing": "4.6.6", "@types/basic-auth": "^1.1.2", "@types/bunyan": "^1.8.4", "@types/connect-redis": "0.0.7", @@ -39,6 +39,7 @@ "@types/hasha": "^3.0.0", "@types/helmet": "0.0.37", "@types/is-promise": "^2.1.0", + "@types/keyv": "^3.0.0", "@types/lodash": "^4.14.85", "@types/md5": "^2.1.32", "@types/mocha": "^2.2.44", @@ -52,6 +53,7 @@ "@types/supertest": "^2.0.4", "@types/useragent": "^2.1.1", "@types/uuid": "^3.4.3", + "@types/validator": "^9.4.0", "cross-env": "^5.1.1", "faker": "^4.1.0", "mocha": "^4.0.1", @@ -65,13 +67,13 @@ "ts-node": "^4.1.0", "tsconfig-paths": "^2.3.0", "tslint": "^5.8.0", - "typescript": "^2.6.1" + "typescript": "^2.7.2" }, "dependencies": { "@keyv/redis": "^1.3.8", - "@nestjs/common": "4.6.5", - "@nestjs/core": "4.6.5", - "@nestjs/swagger": "1.1.4", + "@nestjs/common": "4.6.6", + "@nestjs/core": "4.6.6", + "@nestjs/swagger": "1.2.0", "basic-auth": "^2.0.0", "body-parser": "^1.18.2", "bunyan": "^1.8.12", @@ -86,16 +88,17 @@ "helmet": "^3.11.0", "is-promise": "^2.1.0", "keyv": "^3.0.0", - "lodash": "^4.17.4", + "lodash": "^4.17.5", "md5": "^2.2.1", "md5-file": "^3.2.3", "mongoose": "^4.13.2", "multer": "^1.3.0", "path-exists": "^3.0.0", - "reflect-metadata": "^0.1.10", + "reflect-metadata": "^0.1.12", "rxjs": "^5.5.2", "useragent": "^2.2.1", "uuid": "^3.1.0", + "validator": "^9.4.1", "y-config": "^1.1.5" } } diff --git a/src/express.ts b/src/express.ts index 3fd5e1d..6763927 100644 --- a/src/express.ts +++ b/src/express.ts @@ -6,7 +6,7 @@ import connectRedis = require("connect-redis"); import { config } from "@utils/config"; import helmet = require("helmet"); -import { error } from "./modules/common/middlewares/logger.middleware"; +import { error } from "./middlewares/logger.middleware"; import { isTest } from "@utils/env"; const RedisStore = connectRedis(session); diff --git a/src/modules/common/interceptors/regexp-count-check.interceptor.ts b/src/interceptors/regexp-count-check.interceptor.ts similarity index 100% rename from src/modules/common/interceptors/regexp-count-check.interceptor.ts rename to src/interceptors/regexp-count-check.interceptor.ts diff --git a/src/modules/common/middlewares/logger.middleware.ts b/src/middlewares/logger.middleware.ts similarity index 100% rename from src/modules/common/middlewares/logger.middleware.ts rename to src/middlewares/logger.middleware.ts diff --git a/src/modules/common/middlewares/noCache.middleware.ts b/src/middlewares/noCache.middleware.ts similarity index 100% rename from src/modules/common/middlewares/noCache.middleware.ts rename to src/middlewares/noCache.middleware.ts diff --git a/src/modules/common/middlewares/reloadSession.middleware.ts b/src/middlewares/reloadSession.middleware.ts similarity index 100% rename from src/modules/common/middlewares/reloadSession.middleware.ts rename to src/middlewares/reloadSession.middleware.ts diff --git a/src/modules/common/middlewares/roles.middleware.ts b/src/middlewares/roles.middleware.ts similarity index 100% rename from src/modules/common/middlewares/roles.middleware.ts rename to src/middlewares/roles.middleware.ts diff --git a/src/modules/common/middlewares/upload.middleware.ts b/src/middlewares/upload.middleware.ts similarity index 100% rename from src/modules/common/middlewares/upload.middleware.ts rename to src/middlewares/upload.middleware.ts diff --git a/src/models/Categroy.ts b/src/models/Categroy.ts index 7ff92f0..63626cc 100644 --- a/src/models/Categroy.ts +++ b/src/models/Categroy.ts @@ -53,41 +53,10 @@ const getIdGroups = (obj): string[] => { } }; -CategorySchema.static("moveCategory", async (id: ObjectId, pid: ObjectId) => { - const curCate = await Model.findById(id) - .exec(); - const parentCate = await Model.findById(pid) - .select("_id pid") - .populate({ - path: "pid", populate: { path: "pid", select: "pid" }, select: "pid" - - }) - .exec(); - if (!curCate || !parentCate) { - return Promise.reject( - new MongoError("The ID Category isnt exist") - ); - } - - const idSet = new Set(getIdGroups(parentCate.toObject())); - if (idSet.size !== 1 && idSet.has(curCate._id.toString())) { - return Promise.reject( - new MongoError("It would bad loop, if set the Parent Category") - ); - } - return Model.findByIdAndUpdate(id, { - pid: pid - }).exec(); -}); - -export interface ICategoryModel extends M { - moveCategory(id: ObjectId, pid: ObjectId): Promise; -} - for (const method of MODIFY_MOTHODS) { CategorySchema.post(method, () => { cache.clear(); }); } -export const Model = model(FLAG, CategorySchema) as ICategoryModel; +export const Model = model(FLAG, CategorySchema) as M; diff --git a/src/models/Log.ts b/src/models/Log.ts new file mode 100644 index 0000000..368cf38 --- /dev/null +++ b/src/models/Log.ts @@ -0,0 +1,27 @@ +import { model, SchemaDefinition, Model as M } from "mongoose"; +import { Base, IDoc, IDocRaw } from "./common"; +import newCache = require("@utils/newCache"); + +const Definition: SchemaDefinition = { + key: { type: String, required: true }, + type: { type: String, required: true }, + ua: { type: String, required: true }, + ipaddr: { type: String, required: true } +}; + +export interface ILogs extends IDocRaw { + key: string; + type: string; + ua: string; + ipaddr: string; +} + +export const FLAG = "logs"; + +export const cache = newCache(FLAG); + +const Schema = new Base(Definition).createSchema(); + +export type LogDoc = IDoc; + +export const Model: M = model(FLAG, Schema); diff --git a/src/models/System.ts b/src/models/System.ts index 472f53d..548dc5a 100644 --- a/src/models/System.ts +++ b/src/models/System.ts @@ -2,7 +2,7 @@ import { model, SchemaDefinition, Model as M } from "mongoose"; import { Base, IDoc, IDocRaw, MODIFY_MOTHODS } from "./common"; import newCache = require("@utils/newCache"); -export const FLAG = "system"; +export const FLAG = "systems"; export const cache = newCache(FLAG); diff --git a/src/modules/app.module.ts b/src/modules/app.module.ts index 5a4e6e7..030e220 100644 --- a/src/modules/app.module.ts +++ b/src/modules/app.module.ts @@ -2,7 +2,7 @@ import { Module, MiddlewaresConsumer } from "@nestjs/common"; // Modules import { DatabaseModule } from "./database/database.module"; import {controllers, ControllersModule} from "./controllers.module"; -import { NoCacheMiddleware } from "./common/middlewares/noCache.middleware"; +import { NoCacheMiddleware } from "../middlewares/noCache.middleware"; @Module({ modules: [ DatabaseModule, ControllersModule ] diff --git a/src/modules/categroies/categroies.controller.ts b/src/modules/categroies/categroies.controller.ts index c95e34a..0a552a7 100644 --- a/src/modules/categroies/categroies.controller.ts +++ b/src/modules/categroies/categroies.controller.ts @@ -1,6 +1,6 @@ import { Controller, Post, Res, Body, Get, HttpStatus, HttpCode, Param, - BadRequestException, UseGuards, Delete, Query, BadGatewayException + BadRequestException, UseGuards, Delete, Query, BadGatewayException, Put } from "@nestjs/common"; import { ApiBearerAuth, ApiUseTags, ApiResponse, ApiImplicitParam, ApiOperation @@ -221,7 +221,7 @@ export class CategoriesAdminController { } @Roles("admin") - @Post("/:cid") + @Put("/:cid") // region Swagger Docs @HttpCode(HttpStatus.OK) @ApiOperation({ title: "Edit Category" }) @@ -241,26 +241,16 @@ export class CategoriesAdminController { if (!curCategory) { throw new BadGatewayException("Non Exist Category"); } - let parentCategory; - if (ctx.pid) { - parentCategory = await this.categoriesSvr.getById(ctx.pid, { - populate: [ - "attributes", - { - path: "pid", populate: { path: "pid" } - } - ] - }); - if (!parentCategory) { - throw new BadRequestException( - "The Parent Category isnt exist!" - ); - } - } await this.categoriesSvr.editById(param.cid, ctx); return new DefResDto(); } + @Roles("admin") + @Post("/:cid") + public editByPost(@Param() param: CidDto, @Body() ctx: EditCategoryDto) { + return this.edit(param, ctx); + } + @Roles("admin") @Delete("/:cid") // region Swagger Docs diff --git a/src/modules/collections/collections.admin.controller.ts b/src/modules/collections/collections.admin.controller.ts index ba0bfbd..9b58c80 100644 --- a/src/modules/collections/collections.admin.controller.ts +++ b/src/modules/collections/collections.admin.controller.ts @@ -9,6 +9,7 @@ import { CollectionDoc } from "@models/Collection"; import { ObjectId } from "@models/common"; import { RolesGuard } from "@guards/roles"; import { CollectionsService } from "@services/collections"; +import { LogsService } from "@services/logs"; import { UtilService } from "@services/util"; import { Roles } from "@decorators/roles"; import { ParseIntPipe } from "@pipes/parse-int"; @@ -27,7 +28,10 @@ import { // endregion Swagger Docs export class CollectionsAdminController { - constructor(private readonly collectionsSvr: CollectionsService) { } + constructor( + private readonly collectionsSvr: CollectionsService, + private readonly logsSvr: LogsService + ) { } private async getCollectionsRes(uid: ObjectId, query: PerPageDto) { const arr = await this.collectionsSvr.list(uid, { @@ -102,12 +106,17 @@ export class CollectionsAdminController { @ApiOperation({ title: "Get One Collection's Info" }) // endregion Swagger Docs public async getCollection(@Param() param: CCidDto) { - const obj = await this.collectionsSvr.getById(param.cid); + const obj = await this.collectionsSvr.getObjectById(param.cid); if (!obj) { return null; } - obj.goods = UtilService.toListRespone(obj.goods as any[], { - perNum: obj.goods.length + const goods = [ ]; + for (const good of obj.goods) { + good.downloaded = await this.logsSvr.goodDownloadCount(good._id); + goods.push(good); + } + obj.goods = UtilService.toListRespone(goods, { + perNum: goods.length }) as any; return obj; } diff --git a/src/modules/collections/collections.controller.ts b/src/modules/collections/collections.controller.ts index bb3fea1..ab2a285 100644 --- a/src/modules/collections/collections.controller.ts +++ b/src/modules/collections/collections.controller.ts @@ -9,6 +9,7 @@ import { Roles } from "@decorators/roles"; import { GetCollectionNameDto } from "./collections.dto"; import { PerPageDto } from "@dtos/page"; import { ParseIntPipe } from "@pipes/parse-int"; +import { LogsService } from "@services/logs"; @UseGuards(RolesGuard) @Controller("/collections") @@ -17,7 +18,10 @@ import { ParseIntPipe } from "@pipes/parse-int"; // endregion Swagger Docs export class CollectionsController { - constructor(private readonly collectionsSvr: CollectionsService) { } + constructor( + private readonly collectionsSvr: CollectionsService, + private readonly logsSvr: LogsService + ) { } @Roles("guest") @Get("/:name") @@ -29,25 +33,27 @@ export class CollectionsController { @Param() param: GetCollectionNameDto, @Query(new ParseIntPipe()) query: PerPageDto ) { - const doc = await this.collectionsSvr.getByName(param.name); + const doc = await this.collectionsSvr.getObjectByName(param.name); if (!doc) { return null; } - let obj; - obj = doc.toObject(); - obj.creator = obj.creator.nickname; - obj.goods.map((good) => { + const obj = doc; + // obj = doc.toObject(); + obj.creator = obj.creator.nickname as any; + const goods = [ ]; + for (const good of obj.goods) { const keys = [ "__v", "uploader", "hidden" ]; for (const key of keys) { delete good[key]; } - return good; - }); - obj.goods = UtilService.toListRespone(obj.goods, { - perNum: obj.goods.length - }); + good.downloaded = await this.logsSvr.goodDownloadCount(good._id); + goods.push(good); + } + obj.goods = UtilService.toListRespone(goods, { + perNum: goods.length + }) as any; return obj; } diff --git a/src/modules/controllers.module.ts b/src/modules/controllers.module.ts index cb817d1..f528153 100644 --- a/src/modules/controllers.module.ts +++ b/src/modules/controllers.module.ts @@ -21,14 +21,14 @@ import { SystemController } from "./system/system.controller"; // region Middlewares import { UploadFileMiddleware, UploadFilesMiddleware -} from "./common/middlewares/upload.middleware"; +} from "../middlewares/upload.middleware"; import { ApiLoggerMiddleware, DownloadLoggerMiddleware -} from "./common/middlewares/logger.middleware"; -import { RolesMiddleware } from "./common/middlewares/roles.middleware"; +} from "../middlewares/logger.middleware"; +import { RolesMiddleware } from "../middlewares/roles.middleware"; import { ReloadSessionMiddleware -} from "./common/middlewares/reloadSession.middleware"; +} from "../middlewares/reloadSession.middleware"; // endregion Middlewares // region Services @@ -40,6 +40,7 @@ import { UsergroupsService } from "@services/usergroups"; import { SystemService } from "@services/system"; import { CategoriesService } from "@services/categories"; import { GoodsService } from "@services/goods"; +import { LogsService } from "@services/logs"; // endregion Services export const controllers = [ @@ -56,7 +57,7 @@ export const controllers = [ export const services = [ RegexpsService, CategoriesService, GoodsService, CollectionsService, TokensService, UsersService, UsergroupsService, - SystemService + SystemService, LogsService ]; @Module({ diff --git a/src/modules/database/database.providers.ts b/src/modules/database/database.providers.ts index db4af71..a3490af 100644 --- a/src/modules/database/database.providers.ts +++ b/src/modules/database/database.providers.ts @@ -36,13 +36,7 @@ export const connectDatabase = () => { }; export const injectData = async () => { - let num = await UsersModel.count({ }).exec(); - if (num === 0) { - return UsersModel.addUser( - config.defaults.user.name, config.defaults.user.pass - ); - } - num = await UsergroupsModel.count({ }).exec(); + const num = await UsergroupsModel.count({ }).exec(); if (num === 0) { const group = await UsergroupsModel.create({ name: config.defaults.group.name diff --git a/src/modules/files/files.controller.ts b/src/modules/files/files.controller.ts index fce6fb6..69f6dc9 100644 --- a/src/modules/files/files.controller.ts +++ b/src/modules/files/files.controller.ts @@ -9,6 +9,7 @@ import { Roles } from "@decorators/roles"; import { RolesGuard } from "@guards/roles"; import { ParseIntPipe } from "@pipes/parse-int"; import { GoodsService } from "@services/goods"; +import { LogsService } from "@services/logs"; import { Response } from "express"; import pathExists = require("path-exists"); @@ -26,7 +27,10 @@ import { DownlaodDto } from "./files.dto"; @ApiUseTags("Good Download") export class FilesController { - constructor(private readonly goodsSvr: GoodsService) { } + constructor( + private readonly goodsSvr: GoodsService, + private readonly logsSvr: LogsService + ) { } @Roles("guest") @Get("/categories/:cid/goods/:id") @@ -52,6 +56,7 @@ export class FilesController { if (!good.active) { throw new BadRequestException("Disallow download the File"); } + await this.logsSvr.stepGoodDownloadCount(params.id, req); res.download(filepath, good.originname, (err) => { /* istanbul ignore if */ if (err) { diff --git a/src/modules/files/goods.controller.ts b/src/modules/files/goods.controller.ts index 67b3914..7b6edbe 100644 --- a/src/modules/files/goods.controller.ts +++ b/src/modules/files/goods.controller.ts @@ -10,7 +10,9 @@ import { GoodsService } from "@services/goods"; import { CategoriesService } from "@services/categories"; import { Roles } from "@decorators/roles"; import { ParseIntPipe } from "@pipes/parse-int"; +import { ToArrayPipe } from "@pipes/to-array"; import { ListResponse, DEF_PER_COUNT } from "@dtos/page"; +import { LogsService } from "@services/logs"; import { reduce } from "lodash"; import { GoodsQueryDto } from "./goods.dto"; @@ -22,7 +24,8 @@ export class GoodsController { constructor( private readonly goodsSvr: GoodsService, - private readonly categoriesSvr: CategoriesService + private readonly categoriesSvr: CategoriesService, + private readonly logsSvr: LogsService ) { } @Roles("guest") @@ -32,7 +35,9 @@ export class GoodsController { @ApiOperation({ title: "Get Good List" }) @ApiResponse({ status: HttpStatus.OK, type: ListResponse }) // endregion Swagger Docs - public async getList(@Query(new ParseIntPipe()) query: GoodsQueryDto) { + public async getList( + @Query(new ParseIntPipe(), new ToArrayPipe("tags")) query: GoodsQueryDto + ) { const categoryModels = await this.categoriesSvr.getByTags(query.tags); const categories = reduce(categoryModels, (obj, cate) => { obj[cate._id.toString()] = cate; @@ -41,7 +46,6 @@ export class GoodsController { if (Object.keys(categories).length === 0) { return UtilService.toListRespone([ ]); } - const perNum = query.perNum || DEF_PER_COUNT; const cids = Object.keys(categories); const goods = @@ -56,6 +60,7 @@ export class GoodsController { good.attributes = Array.from(new Set( good.attributes.concat(category.attributes) )) as any; + good.downloaded = this.logsSvr.goodDownloadCount(good._id); return good; }); return UtilService.toListRespone(goods, Object.assign({ diff --git a/src/modules/goods/goods.controller.ts b/src/modules/goods/goods.controller.ts index b400240..f4c406b 100644 --- a/src/modules/goods/goods.controller.ts +++ b/src/modules/goods/goods.controller.ts @@ -34,6 +34,7 @@ import { isArray } from "util"; import { CreateValueDto, EditValueDto } from "../values/values.dto"; import { GoodAttributeParamDto, UploadQueryDto, EditBodyDto } from "./goods.dto"; import { RegexpCountCheckInterceptor } from "@interceptors/regexp-count-check"; +import { LogsService } from "@services/logs"; @UseGuards(RolesGuard) @Controller("api/v1/goods") @@ -47,7 +48,8 @@ export class GoodsAdminController { private readonly collectionsSvr: CollectionsService, private readonly regexpSvr: RegexpsService, private readonly categoriesSvr: CategoriesService, - private readonly goodsSvr: GoodsService + private readonly goodsSvr: GoodsService, + private readonly logsSvr: LogsService ) { } private toMd5sum(filepath: string) { @@ -132,6 +134,7 @@ export class GoodsAdminController { active: true })).toObject(); } catch (error) { + fs.remove(obj.file.path); if (cb) { cb("Good", error); } else { @@ -168,7 +171,7 @@ export class GoodsAdminController { appends: await this.getCategoriesIds(query.append || []) }; - return await this.fileProcess( + return this.fileProcess( { file, uploader: uploaderId, opt: fileProcessOpts }, (type, error) => { if (type === "Categories") { @@ -179,7 +182,7 @@ export class GoodsAdminController { } } if (type === "Good") { - throw new BadRequestException(error.toString()); + throw error; } } ); @@ -232,7 +235,7 @@ export class GoodsAdminController { }); const collection = isArray(collections) ? collections[0] : collections; - return this.collectionsSvr.getById(collection._id, { + return this.collectionsSvr.getObjectById(collection._id, { populate: [ "goods" ] }); } @@ -247,13 +250,14 @@ export class GoodsAdminController { public async get(@Param() param: GidDto) { let obj; try { - obj = await this.goodsSvr.getById(param.gid, { + obj = await this.goodsSvr.getObjectById(param.gid, { populate: [ "attributes", { path: "uploader", select: "nickname" }, { path: "category", select: "name attributes tags" } ] }); + obj.downloaded = await this.logsSvr.goodDownloadCount(param.gid); } catch (error) { throw new BadRequestException(error.toString()); } diff --git a/src/services/base.service.ts b/src/services/base.service.ts index 5f988ce..230afff 100644 --- a/src/services/base.service.ts +++ b/src/services/base.service.ts @@ -43,7 +43,7 @@ abstract class ModelService { return Promise.resolve({ }); } - private runBeforeEach() { + protected runBeforeEach() { return Promise.resolve(this.beforeEach()); } diff --git a/src/services/categories.service.ts b/src/services/categories.service.ts index 32f285a..9023a80 100644 --- a/src/services/categories.service.ts +++ b/src/services/categories.service.ts @@ -124,7 +124,21 @@ export class CategoriesService extends BaseService { return this.findById(id, opts); } - public editById(id: ObjectId, ctx: object) { + public async editById(id: ObjectId, ctx: any) { + if (ctx && ctx.pid) { + const parentCategory = await this.getById(ctx.pid); + if (!parentCategory) { + throw new BadRequestException( + "The Parent Category isnt exist!" + ); + } + const pid = ctx.pid.toString(); + if (!!~(await this.getChildrenIds(id)).indexOf(pid)) { + throw new BadRequestException( + "It would bad loop, if set the Parent Category" + ); + } + } return this.modifyById(id, ctx); } diff --git a/src/services/collections.service.ts b/src/services/collections.service.ts index 35b93d4..6f4967c 100644 --- a/src/services/collections.service.ts +++ b/src/services/collections.service.ts @@ -1,7 +1,7 @@ import { Component, Param, BadRequestException } from "@nestjs/common"; import { UidDto } from "@dtos/ids"; import { - Model as CollectionsModel, cache, ICollections + Model as CollectionsModel, cache, ICollections, ICollectionsRaw } from "@models/Collection"; import { ObjectId } from "@models/common"; import { DEF_PER_COUNT } from "@dtos/page"; @@ -51,10 +51,10 @@ export class CollectionsService extends BaseService { * Get By Collection Name * @param name Collection Name */ - public getByName(name: string, opts = this.GET_OPTIONS) { + public getObjectByName(name: string, opts = this.GET_OPTIONS) { return this.loadAndCache( `getByName_${name}`, - () => this.findObject({ name }, opts), + () => this.findObject({ name }, opts) as Promise, 1000 ); } @@ -63,10 +63,10 @@ export class CollectionsService extends BaseService { * Get By Collection ID * @param id Collection ID */ - public getById(id: ObjectId, opts = this.GET_OPTIONS) { + public getObjectById(id: ObjectId, opts = this.GET_OPTIONS) { return this.loadAndCache( `getById_${id.toString()}`, - () => this.findObjectById(id, opts), + () => this.findObjectById(id, opts) as Promise, 1000 ); } diff --git a/src/services/goods.service.ts b/src/services/goods.service.ts index 98f002e..93fea6c 100644 --- a/src/services/goods.service.ts +++ b/src/services/goods.service.ts @@ -124,6 +124,14 @@ export class GoodsService extends BaseService { return super.findById(id, opts); } + /** + * Get Good by Good ID + * @param id Good ID + */ + public getObjectById(id: ObjectId, opts?: IGetOptions) { + return super.findObjectById(id, opts); + } + /** * Edit Good by Good ID * @param id Good ID diff --git a/src/services/logs.service.ts b/src/services/logs.service.ts new file mode 100644 index 0000000..86a0017 --- /dev/null +++ b/src/services/logs.service.ts @@ -0,0 +1,41 @@ +import { Component } from "@nestjs/common"; +import { BaseService } from "@services/base"; +import { Model as LogsModel, cache } from "@models/Log"; +import { ObjectId } from "@models/common"; +import { getMeta } from "@utils/log"; + +@Component() +export class LogsService extends BaseService { + + constructor() { + super(); + this.setCache(cache); + this.setModel(LogsModel); + } + + public stepGoodDownloadCount(gid: ObjectId, req) { + const key = `good_${gid.toString()}`; + const meta = getMeta(null, req); + return this.create({ + key, type: "download", ua: JSON.stringify(meta.ua), ipaddr: meta.ip + }); + } + + public async goodDownloadCount(gid: ObjectId) { + const flag = `good_download_${gid.toString()}`; + const key = `good_${gid.toString()}`; + + return await this.loadAndCache(flag, () => { + return this.total({ key, type: "download" }); + } , 60 * 1000 /* 1 min */); + } + + public async goodsDownloadCount() { + const flag = "goods_download"; + + return await this.loadAndCache(flag, () => { + return this.total({ key: /^good_/i , type: "download" }); + } , 2 * 60 * 1000 /* 2 min */); + } + +} diff --git a/src/services/users.service.ts b/src/services/users.service.ts index 52bcd24..3f6ae86 100644 --- a/src/services/users.service.ts +++ b/src/services/users.service.ts @@ -5,6 +5,7 @@ import { Model as UserUsergroupsModel } from "@models/User-Usergroup"; import { IUsergroups } from "@models/Usergroup"; import { SystemService } from "@services/system"; import { BaseService, IGetOptions } from "@services/base"; +import { config } from "@utils/config"; @Component() export class UsersService extends BaseService { @@ -15,7 +16,26 @@ export class UsersService extends BaseService { this.setModel(UsersModel); } + protected async beforeEach() { + const num = await cache.get("total") || + await UsersModel.count({ }).exec(); + if (num !== 0) { + return; + } + const user = await UsersModel.addUser( + config.defaults.user.name, config.defaults.user.pass + ); + const gid = await this.sysSvr.getDefaultUsergroup(); + if (gid) { + await UserUsergroupsModel.create({ + user: user._id, usergroup: gid + }); + } + } + public async addUser(obj, gid?: ObjectId) { + await this.runBeforeAll(); + await this.runBeforeEach(); try { const user = await UsersModel.addUser(obj.username, obj.password); if (!gid) { @@ -40,6 +60,8 @@ export class UsersService extends BaseService { } public async isVaild(username: string, password: string) { + await this.runBeforeAll(); + await this.runBeforeEach(); try { return await UsersModel.isVaild(username, password); } catch (err) { @@ -54,6 +76,8 @@ export class UsersService extends BaseService { public async getUsergroups( uid: ObjectId, pageObj = this.DEF_PER_OBJ ) { + await this.runBeforeAll(); + await this.runBeforeEach(); const perNum = pageObj.perNum || this.DEF_PER_OBJ.perNum; const page = pageObj.page || this.DEF_PER_OBJ.page; const groups = await UserUsergroupsModel diff --git a/test/api/categories/categories-loop.e2e.ts b/test/api/categories/categories-loop.e2e.ts new file mode 100644 index 0000000..e7357b3 --- /dev/null +++ b/test/api/categories/categories-loop.e2e.ts @@ -0,0 +1,46 @@ +import { connect, drop } from "../../helpers/database"; +import { init } from "../../helpers/server"; +import { newName, newIds } from "../../helpers/utils"; +import { AdminRequest, GuestRequest } from "../../helpers/request"; + +describe("Categories Loop E2E Api", () => { + + let request: AdminRequest; + + before(() => { + return connect(); + }); + + const ids = newIds(); + + after(() => { + return drop(ids); + }); + + before(async () => { + request = await new GuestRequest(await init(), ids).login(); + }); + + before(async () => { + await request.addCategories(); + }); + + step("Parent Category cant the child category", async () => { + const url = `/api/v1/categories/${ids.categories[2]}`; + const content = { + pid: ids.categories[6] + }; + const { status } = await request.put(url).send(content).then(); + status.should.be.eql(400); + }); + + step("Use other parent category", async () => { + const url = `/api/v1/categories/${ids.categories[6]}`; + const content = { + pid: ids.categories[2] + }; + const { status } = await request.put(url).send(content).then(); + status.should.be.eql(200); + }); + +}); diff --git a/test/api/collections/collections_token.e2e.ts b/test/api/collections/collections_token.e2e.ts index e48131c..8e6a80f 100644 --- a/test/api/collections/collections_token.e2e.ts +++ b/test/api/collections/collections_token.e2e.ts @@ -1,21 +1,16 @@ -import supertest = require("supertest"); import faker = require("faker"); -import { basename } from "path"; -import fs = require("fs-extra"); -import { Model as TokensModel } from "@models/Token"; -import { config } from "@utils/config"; -import { Model as GoodsModels } from "@models/Good"; import { - connect, drop, newUser, addCategoryAndRegexp + connect, drop, addCategoryAndRegexp } from "../../helpers/database"; import { init } from "../../helpers/server"; -import { uploadFiles, newFile } from "../../helpers/files"; import { newIds } from "../../helpers/utils"; +import { TokenRequest, GuestRequest } from "../../helpers/request"; +import * as files from "../../helpers/files"; describe("Token to Upload Files Api", () => { - let request: supertest.SuperTest; + let request: TokenRequest; before(() => { return connect(); @@ -27,30 +22,23 @@ describe("Token to Upload Files Api", () => { return drop(ids); }); - before(async () => { - request = await init(); + const filepaths = [ ]; + + after(() => { + return files.remove(filepaths); + }); + + before("login", async () => { + const req = new GuestRequest(await init(), ids, filepaths); + request = await req.loginWithToken(); }); const FILE_COUNST = 10; - const filepaths = [ ]; const prefix = `${faker.random.word()}_`; before(async () => { // Generator Files for (let i = 0; i < FILE_COUNST; i++) { - filepaths.push(await newFile(`${prefix}${faker.random.uuid()}`)); - } - }); - - after(async () => { - for (const filepath of filepaths) { - fs.removeSync(filepath); - const good = (await GoodsModels.findOne({ - originname: basename(filepath) - }).exec()).toObject(); - fs.removeSync( - `${config.paths.upload}/${good.category}/${good.filename}` - ); - await GoodsModels.findByIdAndRemove(good._id).exec(); + await request.newFile(`${prefix}${faker.random.uuid()}`); } }); @@ -62,37 +50,11 @@ describe("Token to Upload Files Api", () => { ids.regexps.push(docs[1]._id); }); - const user = { - name: faker.name.firstName(), - pass: faker.random.words(), - token: "" - }; - step("Login", async () => { - const doc = await newUser(user.name, user.pass); - ids.users.push(doc._id); - const { - body: result - } = await request.post("/api/v1/auth/login?token=true") - .send({ - username: user.name, password: user.pass - }).then(); - result.should.have.property("token"); - ids.tokens.push( - (await TokensModel.findOne({ token: result.token }).exec())._id - ); - user.token = result.token; - }); - - step("Logout", () => { - return request.post("/api/v1/auth/logout").then(); - }); - let name = ""; step("Upload Files", async () => { const { body: result, status - } = await uploadFiles(request, filepaths); - ids.collections.push(result._id); + } = await request.uploadFiles(filepaths); status.should.be.eql(201); result.should.have.properties("name", "_id", "goods"); name = result.name; diff --git a/test/api/files.e2e.ts b/test/api/files.e2e.ts index bee64e8..81e7fd2 100644 --- a/test/api/files.e2e.ts +++ b/test/api/files.e2e.ts @@ -1,16 +1,15 @@ -import supertest = require("supertest"); import path = require("path"); import { HttpStatus } from "@nestjs/common"; -import { connect, drop, addCategoryAndRegexp, newUser } from "../helpers/database"; -import { uploadFile } from "../helpers/files"; +import { connect, drop } from "../helpers/database"; +import * as files from "../helpers/files"; import { sleep, newIds } from "../helpers/utils"; -import { init, initWithAuth } from "../helpers/server"; -import auth = require("@db/auth"); +import { init } from "../helpers/server"; +import { AdminRequest, GuestRequest } from "../helpers/request"; describe("Files E2E Api", () => { - let request: supertest.SuperTest; + let request: AdminRequest; before(async () => { connect(); @@ -22,43 +21,42 @@ describe("Files E2E Api", () => { return drop(ids); }); - before(async () => { - request = await init(); + before("login", async () => { + const req = new GuestRequest(await init(), ids, filepaths); + request = await req.login(); + }); + + const filepaths = [ ]; + + after(() => { + return files.remove(filepaths); }); const getFileUrl = (cid: string, id: string) => { return `/files/categories/${cid}/goods/${id}`; }; - before("login", async () => { - ids.users.push((await auth.login(request))[0]); - }); - let cid = ""; let id = ""; const uploadFilepath = `${__dirname}/../files/icon_pandorabox_64x64.png`; step("Upload File", async () => { - const docs = await addCategoryAndRegexp(/^icon_.+64x64\.png$/); - cid = docs[0]._id; - const { body: result, status } = - await uploadFile(request, uploadFilepath); + const docs = await request.addCategoryWithRegexp(/^icon_.+64x64\.png$/); + cid = ids.categories[ids.categories.length - 1].toString(); + const { status } = await request.uploadFile(uploadFilepath); + id = ids.goods[ids.goods.length - 1].toString(); status.should.be.eql(201); - id = result._id; - ids.categories.push(docs[0]._id); - ids.regexps.push(docs[1]._id); - ids.goods.push(id); await sleep(50); }); step("Logout", () => { - return request.get("/api/v1/auth/logout").then(); + return request.logout(); }); step("Download File", async () => { const filename = path.basename(uploadFilepath); - const url = getFileUrl(cid, id); - const { status, header, body } = await request.get(url).then(); + const { status, header, body } = + await request.downloadFile(cid, id); status.should.eql(HttpStatus.OK); header.should.match({ @@ -69,8 +67,9 @@ describe("Files E2E Api", () => { step("Download Nonexist File", async () => { const cid = "5a44d78fec77afe7c8aa3eca"; const id = "5a44d78fec77afe7c8aa3eca"; - const url = getFileUrl(cid, id); - const result = await request.get(url).redirects(1).then(); + const result = await request.downloadFile(cid, id, { + redirects: 1 + }); result.should.have.property("status", HttpStatus.NOT_FOUND); }); @@ -78,8 +77,9 @@ describe("Files E2E Api", () => { step("Download Wrong ID File #0", async () => { const cid = "5a44d78fec77afe7c8aa3eca"; const id = "1111"; - const url = getFileUrl(cid, id); - const result = await request.get(url).redirects(1).then(); + const result = await request.downloadFile(cid, id, { + redirects: 1 + }); result.should.have.property("status", HttpStatus.BAD_REQUEST); }); @@ -87,8 +87,9 @@ describe("Files E2E Api", () => { step("Download Wrong ID File #1", async () => { const cid = "1111"; const id = "5a44d78fec77afe7c8aa3eca"; - const url = getFileUrl(cid, id); - const result = await request.get(url).redirects(1).then(); + const result = await request.downloadFile(cid, id, { + redirects: 1 + }); result.should.have.property("status", HttpStatus.BAD_REQUEST); }); diff --git a/test/api/goods/downloaded_count.e2e.ts b/test/api/goods/downloaded_count.e2e.ts new file mode 100644 index 0000000..edada8e --- /dev/null +++ b/test/api/goods/downloaded_count.e2e.ts @@ -0,0 +1,104 @@ + +import { + connect, drop, addCategoryAndRegexp +} from "../../helpers/database"; +import { init } from "../../helpers/server"; +import { newIds } from "../../helpers/utils"; +import { AdminRequest, GuestRequest } from "../../helpers/request"; +import * as files from "../../helpers/files"; +import { Model as LogsModel } from "@models/Log"; +import { Model as CollectionsModel } from "@models/Collection"; + +describe("Good Downloaded Count Api e2e Test Unit", () => { + + let request: AdminRequest; + + before(() => { + return connect(); + }); + + const ids = newIds(); + + after(() => { + return drop(ids); + }); + + const filepaths = [ ]; + + after(() => { + return files.remove(filepaths); + }); + + before("login", async () => { + const req = new GuestRequest(await init(), ids, filepaths); + request = await req.login(); + }); + + before("Add Category With Regexp And Upload File", async () => { + await request.newFile(); + await request.addCategoryWithRegexp(); + await request.uploadFile(); + }); + + step("Download Once", async () => { + const cid = ids.categories[ids.categories.length - 1]; + const gid = ids.goods[ids.goods.length - 1]; + const { status } = await request.downloadFile(cid, gid); + status.should.be.eql(200); + }); + + step("Download should be one time", async () => { + const gid = ids.goods[ids.goods.length - 1]; + const url = `/api/v1/goods/${gid}`; + const { status, body } = await request.get(url).then(); + status.should.be.eql(200); + body.should.have.property("downloaded", 1); + }); + + step("Collection have the good download count", async () => { + const gid = ids.goods[ids.goods.length - 1]; + await request.addCollection([ gid ]); + const cid = ids.collections[ids.collections.length - 1]; + const { body } = await request.get(`/api/v1/collections/${cid}`).then(); + body.goods.data.should.matchEach((good) => { + should(good).have.property("downloaded"); + }); + }); + + step("Download Once Again", async () => { + const cid = ids.categories[ids.categories.length - 1]; + const gid = ids.goods[ids.goods.length - 1]; + const { status } = await request.downloadFile(cid, gid); + status.should.be.eql(200); + }); + + step("Download Info still one time", async () => { + const gid = ids.goods[ids.goods.length - 1]; + const url = `/api/v1/goods/${gid}`; + const { status, body } = await request.get(url).then(); + status.should.be.eql(200); + body.should.have.property("downloaded", 1); // because the cache + }); + + step("Download should be two time", async () => { + const gid = ids.goods[ids.goods.length - 1]; + const cond = { key: `good_${gid}`, type: "download" }; + const count = await LogsModel.count(cond).exec(); + count.should.be.eql(2); + }); + + step("Collection have the good download count", async () => { + const gid = ids.goods[ids.goods.length - 1]; + await request.addCollection([ gid ]); + const cid = ids.collections[ids.collections.length - 1]; + const req = await request.logout(); + const name = encodeURI( + (await CollectionsModel.findById(cid).exec()).toObject().name + ); + const { body } = await req.get(`/collections/${name}`).then(); + body.goods.data.should.matchEach((good) => { + should(good).have.property("downloaded"); + }); + }); + +}); diff --git a/test/api/goods/goods.e2e.ts b/test/api/goods/goods.e2e.ts index c6a460d..013e008 100644 --- a/test/api/goods/goods.e2e.ts +++ b/test/api/goods/goods.e2e.ts @@ -6,10 +6,12 @@ import { uploadFile } from "../../helpers/files"; import { init } from "../../helpers/server"; import auth = require("@db/auth"); import { newName, newIds } from "../../helpers/utils"; +import { GuestRequest, AdminRequest } from "../../helpers/request"; +import * as files from "../../helpers/files"; describe("Goods E2E Api", () => { - let request: supertest.SuperTest; + let request: AdminRequest; const user = { name: newName() @@ -25,28 +27,28 @@ describe("Goods E2E Api", () => { return drop(ids); }); - before(async () => { - request = await init(); + const filepaths = [ ]; + + after(() => { + return files.remove(filepaths); }); before("login", async () => { - ids.users.push((await auth.login(request, user.name))[0]); + const req = new GuestRequest(await init(), ids, filepaths); + request = await req.login(user.name); }); step("Add Category", async () => { - const docs = await addCategoryAndRegexp(/^icon_.+_64x64\.png$/); - ids.categories.push(docs[0]._id); - ids.regexps.push(docs[1]._id); + await request.addCategoryWithRegexp(/^icon_.+_64x64\.png$/); }); let result; step("Upload File", async () => { const filepath = `${__dirname}/../../files/icon_pandorabox_64x64.png`; // Create - result = await uploadFile(request, filepath); + result = await request.uploadFile(filepath); result = result.body; - ids.goods.push(result._id); result.should.have.properties([ "_id", "originname", "category", "uploader" ]); diff --git a/test/api/system/system.e2e.ts b/test/api/system/system.e2e.ts index f93c07b..3ba66da 100644 --- a/test/api/system/system.e2e.ts +++ b/test/api/system/system.e2e.ts @@ -1,34 +1,26 @@ import { Model as SystemModel } from "@models/System"; -import supertest = require("supertest"); -import { - connect, drop -} from "../../helpers/database"; +import { connect, drop } from "../../helpers/database"; import { init } from "../../helpers/server"; import auth = require("@db/auth"); -import { newName } from "../../helpers/utils"; +import { newName, newIds } from "../../helpers/utils"; +import { AdminRequest, GuestRequest } from "../../helpers/request"; -describe("Collections E2E Api", () => { +describe("System E2E Api", () => { - let request: supertest.SuperTest; + let request: AdminRequest; before(() => { return connect(); }); - const ids = { - users: [ ] - }; + const ids = newIds(); after(() => { return drop(ids); }); - before(async () => { - request = await init(); - }); - before("login", async () => { - ids.users.push((await auth.login(request))[0]); + request = await new GuestRequest(await init(), ids).login(); }); after(async () => { diff --git a/test/helpers/database.ts b/test/helpers/database.ts index 9a86e58..998da50 100644 --- a/test/helpers/database.ts +++ b/test/helpers/database.ts @@ -10,6 +10,7 @@ import { Model as CollectionsModel } from "@models/Collection"; import { Model as CategoriesModel, CategoryDoc } from "@models/Categroy"; import { Model as UsergroupsModel } from "@models/Usergroup"; import { Model as UserUsergroupsModel } from "@models/User-Usergroup"; +import { Model as LogsModel } from "@models/Log"; import { connectDatabase } from "../../src/modules/database/database.providers"; import { newUser as newUserFn } from "./database/user"; @@ -30,6 +31,7 @@ export interface IIds { collections?: ObjectId[]; usergroups?: ObjectId[]; userusergroups?: ObjectId[]; + logs?: ObjectId[]; } /** @@ -48,7 +50,8 @@ export const drop = async (ids?: IIds) => { "categories": CategoriesModel, "collections": CollectionsModel, "usergroups": UsergroupsModel, - "userusergroups": UserUsergroupsModel + "userusergroups": UserUsergroupsModel, + "logs": LogsModel }; for (const method of Object.keys(MODEL_IDMETHOD_MAP)) { const model = MODEL_IDMETHOD_MAP[method]; diff --git a/test/helpers/database/categories.ts b/test/helpers/database/categories.ts index 64c8a64..67f7dc4 100644 --- a/test/helpers/database/categories.ts +++ b/test/helpers/database/categories.ts @@ -37,11 +37,17 @@ export const addCategories = async (pid?: ObjectId) => { [9, 10] ]; for (const set of initGroups) { - await CategoriesModel.moveCategory(cids[set[1]], cids[set[0]]); + await CategoriesModel.findByIdAndUpdate(cids[set[1]], { + pid: cids[set[0]] + }); } if (pid) { - await CategoriesModel.moveCategory(cids[9], pid); - await CategoriesModel.moveCategory(cids[0], pid); + await CategoriesModel.findByIdAndUpdate(cids[9], { + pid: pid + }); + await CategoriesModel.findByIdAndUpdate(cids[0], { + pid: pid + }); } await sleep(50); return cids; diff --git a/test/helpers/database/user.ts b/test/helpers/database/user.ts index c7d0fee..a3db8d9 100644 --- a/test/helpers/database/user.ts +++ b/test/helpers/database/user.ts @@ -20,8 +20,7 @@ export const newUser = (username?: string, password?: string) => { export const newUserWithUsergroup = ( username = newName(), password = newName(), gid?: ObjectId ) => { - init(); - return usersSvr.addUser({ + return init().addUser({ username, password }, gid); }; diff --git a/test/helpers/files.ts b/test/helpers/files.ts index acbee9f..e7b4822 100644 --- a/test/helpers/files.ts +++ b/test/helpers/files.ts @@ -5,16 +5,16 @@ import faker = require("faker"); import fs = require("fs-extra"); import { sleep } from "./utils"; -interface IUploadFileOptions { +export interface IUploadFileOptions { query?: { [key: string]: string }; } /* tslint:disable:no-empty-interface */ -interface IUploadFilesOptions extends IUploadFileOptions { } +export interface IUploadFilesOptions extends IUploadFileOptions { } -const addQuery = (url: string, opts: IUploadFileOptions) => { +export const addQuery = (url: string, opts: IUploadFileOptions) => { if (opts.query && Object.keys(opts.query).length > 0) { const query = [ ]; for (const key of Object.keys(opts.query)) { diff --git a/test/helpers/request.ts b/test/helpers/request.ts new file mode 100644 index 0000000..7587331 --- /dev/null +++ b/test/helpers/request.ts @@ -0,0 +1,270 @@ +import path = require("path"); +import supertest = require("supertest"); +import auth = require("@db/auth"); +import { IIds, addCategoryAndRegexp } from "./database"; +import { newUser } from "@db/user"; +import { Model as TokensModel } from "@models/Token"; +import { isNumber } from "util"; +import { newName, sleep } from "./utils"; +import { + IUploadFileOptions, addQuery, IUploadFilesOptions, newFile +} from "./files"; +import { ObjectId } from "@models/common"; +import { LogsService } from "@services/logs"; +import { Model as LogsModel } from "@models/Log"; +import { addCategories } from "@db/categories"; + +type ST = supertest.SuperTest; + +class BaseRequest { + + constructor( + protected readonly req: ST, + protected readonly ids: IIds, + protected readonly filepaths: string[] = [ ] + ) { } + + public get(url: string, callback?) { + return this.req.get(url, callback); + } + + public post(url: string, callback?) { + return this.req.post(url, callback); + } + + public put(url: string, callback?) { + return this.req.put(url, callback); + } + + public delete(url: string, callback?) { + return this.req.delete(url, callback); + } + + public getIds() { + return this.ids; + } + + public getFilepaths() { + return this.filepaths; + } + + protected users = [ ]; + + public async newUser(username = newName(), password = newName()) { + const user = await newUser(username, password); + this.users.push({ username, password }); + this.ids.users.push(user._id); + return this; + } + + protected newFilepaths: string[] = [ ]; + + public async newFile(filename?: string) { + const filepath = await newFile(filename); + this.filepaths.push(filepath); + this.newFilepaths.push(filepath); + return this; + } + + /** + * New A Category And add a regexp to it + * @param regexp It will new one file and filename will as the regexp value if non-exist value + * @param pid Parent Category ID + */ + public async addCategoryWithRegexp(regexp?: RegExp, pid?: ObjectId) { + if (!regexp) { + if (this.newFilepaths.length === 0) { + throw new TypeError("No New File"); + } + await this.newFile(); + const filepath = this.newFilepaths[this.newFilepaths.length - 1]; + const filename = path.basename(filepath); + regexp = new RegExp(`^${filename}$`); + } + const docs = await addCategoryAndRegexp(regexp, pid); + this.ids.categories.push(docs[0]._id); + this.ids.regexps.push(docs[1]._id); + return this; + } + + public async downloadFile(cid: ObjectId, gid: ObjectId, opts?) { + const url = + `/files/categories/${cid.toString()}/goods/${gid.toString()}`; + const ref = await Object.keys(opts || { }).reduce((req, key) => { + req = req[key](opts[key]); + return req; + }, this.get(url)).then(); + const key = `good_${gid.toString()}`; + this.ids.logs.push( + ...(await LogsModel.find({ key }).exec()).map((log) => log._id) + ); + return ref; + } + + /** + * Add 11 Categories + * ``` + * - 1 - 4 + * | + * - 0 - 2 - 5 - 6 - 8 + * | | | + * pid -| - 3 - 7 + * | + * - 9 - 10 + * ``` + * @param pid Parent Category ID + * @returns Categories' ID + */ + public async addCategories(pid?: ObjectId) { + const ids = await addCategories(pid); + this.ids.categories.push(...ids); + return ids; + } + +} + +export class GuestRequest extends BaseRequest { + + public async login( + username?: string | number, password?: string + ): Promise { + const index = isNumber(username) ? username : -1; + if (index !== -1 && (this.users.length - 1 >= index)) { + const user = this.users[0]; + await this.req.post("/api/v1/auth/login").send(user).then(); + } else { + const req = await this.newUser(username + "", password); + return req.login(this.users.length - 1); + } + return new AdminRequest(this.req, this.ids, this.filepaths); + } + + public async loginWithToken( + username?: string | number, password?: string + ): Promise { + const index = isNumber(username) ? username : -1; + if (index !== -1 && (this.users.length - 1 >= index)) { + const user = this.users[0]; + const { body } = + await this.req.post("/api/v1/auth/login?token=true") + .send(user).then(); + const token = + await TokensModel.findOne({ token: body.token }).exec(); + this.ids.tokens.push(token._id); + return new TokenRequest( + this.req, user.username, body.token, this.ids, this.filepaths + ); + } else { + return (await this.newUser()).loginWithToken(this.users.length - 1); + } + } + +} + +class LoginedRequest extends BaseRequest { + + public async logout() { + await this.get("/api/v1/auth/logout").then(); + return new GuestRequest(this.req, this.ids, this.filepaths); + } + + /** + * Upload File to StoreBox + * @param filepath if filepath is empty value, it will upload last new file. if havnt new-file, will genertor one. + */ + public async uploadFile(filepath?: string, opts: IUploadFileOptions = { }) { + let url = "/api/v1/goods"; + url = addQuery(url, opts); + + if (!filepath) { + if (this.filepaths.length === 0) { + await this.newFile(); + } + filepath = this.newFilepaths[this.newFilepaths.length - 1]; + } else if (this.filepaths.indexOf(filepath) > -1) { + this.filepaths.push(filepath); + } + + return this.post(url).attach("file", filepath).then((ref) => { + const { status, body } = ref; + if (status === 201 ) { + this.ids.goods.push(body._id); + } + return ref; + }); + } + + public async uploadFiles( + filepaths: string[], opts: IUploadFilesOptions = { } + ) { + let url = "/api/v1/goods/collections"; + url = addQuery(url, opts); + + let req = this.post(url); + filepaths.forEach((filepath) => { + if (this.filepaths.indexOf(filepath) > -1) { + this.filepaths.push(filepath); + } + req = req.attach("files", filepath); + }); + return req.then().then((ref) => { + const { status, body } = ref; + + if (status === 201 ) { + body.goods.forEach((good) => { + this.ids.goods.push(good._id); + }); + this.ids.collections.push(body._id); + } + return ref; + }); + } +} + +export class AdminRequest extends LoginedRequest { + + public async addCollection(goods: ObjectId[], name = newName()) { + const { status, body } = await this.post("/api/v1/collections") + .send({ name, goods }).then(); + if (status === 201) { + this.ids.collections.push(body._id); + } + await sleep(200); + return this; + } + +} + +export class TokenRequest extends LoginedRequest { + + private readonly auth; + + constructor( + req: ST, username: string, token: string, + ids: IIds, filepaths?: string[] + ) { + super(req, ids, filepaths); + this.auth = { username, token }; + } + + public get(url: string, callback?) { + return super.get(url, callback) + .auth(this.auth.username, this.auth.token); + } + + public post(url: string, callback?) { + return super.post(url, callback) + .auth(this.auth.username, this.auth.token); + } + + public put(url: string, callback?) { + return super.put(url, callback) + .auth(this.auth.username, this.auth.token); + } + + public delete(url: string, callback?) { + return super.delete(url, callback) + .auth(this.auth.username, this.auth.token); + } + +} diff --git a/test/helpers/utils.ts b/test/helpers/utils.ts index ec7ad25..ed258fc 100644 --- a/test/helpers/utils.ts +++ b/test/helpers/utils.ts @@ -23,6 +23,7 @@ export const newIds = (): IIds => { categories: [ ], collections: [ ], usergroups: [ ], - userusergroups: [ ] + userusergroups: [ ], + logs: [ ] }; }; diff --git a/test/issues/ban_user_n_its_token.e2e.ts b/test/issues/ban_user_n_its_token.e2e.ts index 9fa20d0..d33a1cf 100644 --- a/test/issues/ban_user_n_its_token.e2e.ts +++ b/test/issues/ban_user_n_its_token.e2e.ts @@ -1,16 +1,13 @@ -import supertest = require("supertest"); - -import { connect, drop, newUser } from "../helpers/database"; +import { connect, drop } from "../helpers/database"; import { init } from "../helpers/server"; import { UsersService } from "@services/users"; -import { TokensService } from "@services/tokens"; import { SystemService } from "@services/system"; -import { newName, newIds } from "../helpers/utils"; +import { newIds } from "../helpers/utils"; +import { TokenRequest, GuestRequest } from "../helpers/request"; describe("Fix Issues", () => { - let request: supertest.SuperTest; - const tokensSvr = new TokensService(); + let request: TokenRequest; const usersSvr = new UsersService(new SystemService()); before(() => { @@ -23,34 +20,14 @@ describe("Fix Issues", () => { return drop(ids); }); - before(async () => { - request = await init(); + before("Login", async () => { + request = await new GuestRequest(await init(), ids).loginWithToken(); }); - const user = { - name: newName(), - pass: newName(), - token: "" - }; describe("Token Action When User ban", () => { - step("Login", async () => { - const doc = await newUser(user.name, user.pass); - ids.users.push(doc._id); - const { - body: result - } = await request.post("/api/v1/auth/login?token=true") - .send({ - username: user.name, password: user.pass - }).then(); - result.should.have.property("token"); - ids.tokens.push(await tokensSvr.getIdByToken(result.token)); - user.token = result.token; - }); - step("Get Goods Success By Token", async () => { - const { status } = await request.get("/api/v1/users/goods") - .auth(user.name, user.token).then(); + const { status } = await request.get("/api/v1/users/goods").then(); status.should.be.eql(200); }); @@ -59,8 +36,7 @@ describe("Fix Issues", () => { }); step("Get Goods Fail By Token", async () => { - const { status } = await request.get("/api/v1/users/goods") - .auth(user.name, user.token).then(); + const { status } = await request.get("/api/v1/users/goods").then(); status.should.be.eql(403); }); @@ -69,8 +45,7 @@ describe("Fix Issues", () => { }); step("Get Goods Fail By Token", async () => { - const { status } = await request.get("/api/v1/users/goods") - .auth(user.name, user.token).then(); + const { status } = await request.get("/api/v1/users/goods").then(); status.should.be.eql(200); }); diff --git a/test/issues/github/github_issue_31.e2e.ts b/test/issues/github/github_issue_31.e2e.ts index 7eaf7d8..287aedd 100644 --- a/test/issues/github/github_issue_31.e2e.ts +++ b/test/issues/github/github_issue_31.e2e.ts @@ -1,63 +1,50 @@ -import supertest = require("supertest"); import fs = require("fs-extra"); import { basename } from "path"; -import { Model as GoodsModels } from "@models/Good"; import { - connect, drop, newUser, addCategoryAndRegexp + connect, drop, addCategoryAndRegexp } from "../../helpers/database"; import { init } from "../../helpers/server"; import * as files from "../../helpers/files"; -import { config } from "@utils/config"; -import auth = require("@db/auth"); import { newIds } from "../../helpers/utils"; +import { AdminRequest, GuestRequest } from "../../helpers/request"; /** * Fix [Issue 31](https://github.com/BoxSystem/StoreBox-Api/issues/31) */ describe("Fix Issues", () => { - let request: supertest.SuperTest; + let request: AdminRequest; before(() => { return connect(); }); const ids = newIds(); + const filepaths = [ ]; after(() => { return drop(ids); }); - before(async () => { - request = await init(); + before("login", async () => { + request = await new GuestRequest(await init(), ids, filepaths).login(); }); - describe("Github 31 [Can upload same file]", () => { - - let filepath = ""; - let filename = ""; - before(async () => { - filepath = await files.newFile(); - }); - - after(() => { - return files.remove(filepath); - }); + before(async () => { + await request.newFile(); + }); - after(() => { - GoodsModels.remove({ - originname: filename - }).exec(); - }); + after(() => { + return files.remove(filepaths); + }); - before("login", async () => { - ids.users.push((await auth.login(request))[0]); - }); + describe("Github 31 [Can upload same file]", () => { step("Add Category and Regexp", async () => { - filename = basename(filepath); + const filepath = filepaths[filepaths.length - 1]; + const filename = basename(filepath); const docs = await addCategoryAndRegexp( new RegExp(`^${filename}$`) ); @@ -66,16 +53,12 @@ describe("Fix Issues", () => { }); step("Upload Success", async () => { - const { - body: result, status - } = await files.uploadFile(request, filepath); + const { status } = await request.uploadFile(); status.should.be.eql(201); }); step("Upload Fail", async () => { - const { - body: result, status - } = await files.uploadFile(request, filepath); + const { status, body } = await request.uploadFile(); status.should.be.not.eql(201); status.should.be.eql(400); }); diff --git a/test/models/Categroies.spec.ts b/test/models/Categroies.spec.ts index 5723a96..8cb9864 100644 --- a/test/models/Categroies.spec.ts +++ b/test/models/Categroies.spec.ts @@ -29,23 +29,23 @@ describe("Category Model", () => { }); }); - describe("Loop Parent ID Checker", () => { - - let cids = [ ]; - before(async () => { - cids = await addCategories(); - ids.categories.push(...cids); - }); - - it("# 0", async () => { - let err; - try { - await CategoriesModel.moveCategory(cids[2], cids[6]); - } catch (error) { - err = error; - } - err.should.not.be.an.empty(); - }); - }); + // describe("Loop Parent ID Checker", () => { + + // let cids = [ ]; + // before(async () => { + // cids = await addCategories(); + // ids.categories.push(...cids); + // }); + + // it("# 0", async () => { + // let err; + // try { + // await CategoriesModel.moveCategory(cids[2], cids[6]); + // } catch (error) { + // err = error; + // } + // err.should.not.be.an.empty(); + // }); + // }); }); diff --git a/test/models/user.spec.ts b/test/models/user.spec.ts index d750d6c..3124b37 100644 --- a/test/models/user.spec.ts +++ b/test/models/user.spec.ts @@ -2,7 +2,7 @@ import * as db from "../helpers/database"; import * as md5 from "md5"; import { Model as UsersModel } from "@models/User"; import { Observer, Observable, Subject } from "rxjs"; -import { newIds } from "../helpers/utils"; +import { newIds, newName } from "../helpers/utils"; describe("User Model", () => { @@ -23,8 +23,8 @@ describe("User Model", () => { }); beforeEach(() => { - user.username = md5(Date.now() + ""); - user.password = md5(Date.now() + ""); + user.username = newName(); + user.password = newName(); return UsersModel.addUser(user.username, user.password) .then((result) => { user.id = result._id.toString(); @@ -32,16 +32,10 @@ describe("User Model", () => { }).catch(console.log); }); - afterEach(() => { - return UsersModel.removeUser(user.id).then(() => { - user.id = ""; - }); - }); - it("Add User", async () => { const user = { - username: md5(Date.now() + ""), - password: md5(Date.now() + ""), + username: newName(), + password: newName(), }; let result; // 添加测试用户 @@ -58,6 +52,7 @@ describe("User Model", () => { UsersModel.removeUser(id); }); + // Mothod move to service it.skip("User List", async () => { // const results = await UsersModel.list(); // results.should.be.an.Array(); diff --git a/test/services/collections.spec.ts b/test/services/collections.spec.ts index f6e4478..579b468 100644 --- a/test/services/collections.spec.ts +++ b/test/services/collections.spec.ts @@ -1,4 +1,6 @@ import { CollectionsService } from "@services/collections"; +import { UsersService } from "@services/users"; +import { SystemService } from "@services/system"; import { Model as UsersModel } from "@models/User"; import db = require("../helpers/database"); import { newName } from "../helpers/utils"; @@ -6,13 +8,16 @@ import { newName } from "../helpers/utils"; describe("Collections Service Test Unit", () => { let collectionsSvr: CollectionsService; + let usersSvr: UsersService; before(() => { return db.connect(); }); - beforeEach(() => { + beforeEach(async () => { collectionsSvr = new CollectionsService(); + usersSvr = new UsersService(new SystemService()); + await usersSvr.conut(); // UserModel Init }); it("Fail to Create a Collection with Empty Good # 0", async () => { diff --git a/test/tsconfig.json b/test/tsconfig.json index 1fa5afd..b647d11 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -26,7 +26,7 @@ "@guards/*": [ "./src/modules/common/guards/*.guard" ], "@dtos/*": [ "./src/modules/common/dtos/*.dto" ], "@services/*": [ "./src/services/*.service" ], - "@interceptors/*": [ "./src/modules/common/interceptors/*.interceptor" ], + "@interceptors/*": [ "./src/interceptors/*.interceptor" ], "@db/*": [ "./test/helpers/database/*" ] } }, diff --git a/tsconfig.json b/tsconfig.json index a56a1d7..b4e8e50 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,8 +35,8 @@ "./dist/modules/common/dtos/*.dto" ], "@interceptors/*": [ - "./src/modules/common/interceptors/*.interceptor", - "./dist/modules/common/interceptors/*.interceptor" + "./src/interceptors/*.interceptor", + "./dist/interceptors/*.interceptor" ], "@services/*": [ "./src/services/*.service",