├── middleware └── .gitkeep ├── log └── .gitignore ├── static ├── css │ └── .gitignore ├── img │ ├── bg.jpg │ ├── qrcode.jpg │ ├── texture.png │ ├── download.svg │ ├── github.svg │ ├── error.svg │ └── 404.svg ├── scss │ ├── _footer_mobile.scss │ ├── _footer.scss │ ├── icon.scss │ ├── _header_mobile.scss │ ├── _uploader_mobile.scss │ ├── status.scss │ ├── global.scss │ ├── _header.scss │ ├── share.scss │ └── _uploader.scss ├── font │ └── 2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2 └── js │ ├── share.js │ ├── status.js │ └── index.js ├── data ├── database │ └── .gitignore └── upload │ └── .gitignore ├── .gitignore ├── _design └── texture.psd ├── config.js ├── view ├── components │ ├── uploader_text.ejs │ ├── uploader_error.ejs │ ├── head.ejs │ ├── uploader_progress.ejs │ ├── footer.ejs │ ├── header.ejs │ ├── uploader_file.ejs │ ├── history-panel.ejs │ ├── status.ejs │ ├── uploader.ejs │ ├── uploader_result.ejs │ └── share.ejs ├── share.ejs ├── status.ejs └── index.ejs ├── router ├── index.js ├── status.js ├── delete.js ├── refresh.js ├── share.js ├── download.js ├── upload.js ├── router.js └── update.js ├── tool ├── log4js.js ├── info.js ├── gc.js └── sequelize.js ├── ChangeLog.md ├── LICENSE ├── package.json ├── app.js ├── cmd └── local.js ├── README.md └── yarn.lock /middleware/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /log/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /static/css/.gitignore: -------------------------------------------------------------------------------- 1 | *.css 2 | -------------------------------------------------------------------------------- /data/database/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /data/upload/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode 3 | !.gitkeep 4 | _design -------------------------------------------------------------------------------- /static/img/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delbertbeta/rajio/HEAD/static/img/bg.jpg -------------------------------------------------------------------------------- /_design/texture.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delbertbeta/rajio/HEAD/_design/texture.psd -------------------------------------------------------------------------------- /static/img/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delbertbeta/rajio/HEAD/static/img/qrcode.jpg -------------------------------------------------------------------------------- /static/img/texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delbertbeta/rajio/HEAD/static/img/texture.png -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | domain: "https://rajio.delbertbeta.cc", 3 | maxFileSize: 128 * 1000 * 1000 // 128MB 4 | } 5 | -------------------------------------------------------------------------------- /static/scss/_footer_mobile.scss: -------------------------------------------------------------------------------- 1 | @media(max-width: 500px) { 2 | .footer { 3 | height: 4rem; 4 | padding: 1rem 1rem; 5 | margin-bottom: 1rem; 6 | } 7 | } -------------------------------------------------------------------------------- /static/font/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delbertbeta/rajio/HEAD/static/font/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2 -------------------------------------------------------------------------------- /view/components/uploader_text.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
-------------------------------------------------------------------------------- /view/components/uploader_error.ejs: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
Back
5 |
-------------------------------------------------------------------------------- /view/components/head.ejs: -------------------------------------------------------------------------------- 1 | 2 | rajio 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /view/components/uploader_progress.ejs: -------------------------------------------------------------------------------- 1 |
2 |
0
3 |
4 |
5 |
Cancel
6 |
-------------------------------------------------------------------------------- /view/components/footer.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /view/share.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%- include components/head.ejs -%> 5 | 6 | 7 | 8 | <%- include components/header.ejs -%> 9 | <%- include components/share.ejs -%> 10 | <%- include components/footer.ejs -%> 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /view/components/header.ejs: -------------------------------------------------------------------------------- 1 |
2 | 3 | radio 4 | rajio 5 | a way to share your files 6 | 7 | <% if (!share) { %>history 8 | <% } %> 9 | <%- include history-panel.ejs -%> 10 |
-------------------------------------------------------------------------------- /router/index.js: -------------------------------------------------------------------------------- 1 | const prettybytes = require('pretty-bytes') 2 | 3 | module.exports = async (ctx) => { 4 | await ctx.render('index', { 5 | share: false, 6 | maxFileSize: prettybytes(global.config.maxFileSize), 7 | data: JSON.stringify({ 8 | maxFileSize: global.config.maxFileSize, 9 | prettiedMaxFileSize: prettybytes(global.config.maxFileSize), 10 | domain: global.config.domain 11 | }) 12 | }); 13 | } -------------------------------------------------------------------------------- /router/status.js: -------------------------------------------------------------------------------- 1 | const prettybytes = require('pretty-bytes') 2 | const info = require('../tool/info') 3 | 4 | module.exports = async (ctx) => { 5 | await ctx.render('status', { 6 | share: true, 7 | data: JSON.stringify({ 8 | usage: info.getUsage(), 9 | downloadCount: await info.getDownloadCount(), 10 | totalCount: await info.getTotalCount(), 11 | recent: await info.getRecent() 12 | }) 13 | }); 14 | } -------------------------------------------------------------------------------- /tool/log4js.js: -------------------------------------------------------------------------------- 1 | const log4js = require('log4js'); 2 | 3 | log4js.configure({ 4 | appenders: { 5 | out: { 6 | type: 'stdout' 7 | }, 8 | app: { 9 | type: 'file', 10 | filename: 'log/rajio.log' 11 | } 12 | }, 13 | categories: { 14 | default: { 15 | appenders: ['out', 'app'], 16 | level: 'debug' 17 | }, 18 | } 19 | }); 20 | 21 | module.exports = log4js.getLogger("rajio"); -------------------------------------------------------------------------------- /static/scss/_footer.scss: -------------------------------------------------------------------------------- 1 | .footer { 2 | width: 100%; 3 | height: 8rem; 4 | padding: 2rem 5%; 5 | box-sizing: border-box; 6 | position: relative; 7 | .footer-text { 8 | color: #6a6a6a; 9 | font-size: 0.8rem; 10 | vertical-align: middle; 11 | a { 12 | color: inherit; 13 | text-decoration: underline; 14 | } 15 | .red-icon { 16 | color: #ff7373; 17 | vertical-align: top; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /view/status.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%- include components/head.ejs -%> 5 | 6 | 7 | <%- include components/header.ejs -%> 8 | <%- include components/status.ejs -%> 9 | <%- include components/footer.ejs -%> 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /router/delete.js: -------------------------------------------------------------------------------- 1 | const sequelize = require('../tool/sequelize') 2 | const gc = require('../tool/gc') 3 | 4 | const route = async function (ctx, next) { 5 | const item = await sequelize.rajio.findOne({ 6 | where: { 7 | id: ctx.id 8 | } 9 | }) 10 | if (!item || item.deleted) { 11 | ctx.throw(404) 12 | return 13 | } 14 | if (item.identifier !== ctx.identifier) { 15 | ctx.throw(403) 16 | return 17 | } 18 | gc.recycle(item) 19 | ctx.response.body = { 20 | message: "OK" 21 | } 22 | } 23 | 24 | module.exports = { 25 | route 26 | } -------------------------------------------------------------------------------- /static/scss/icon.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Material Icons'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(/static/font/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2) format('woff2'); 6 | } 7 | 8 | .material-icons { 9 | font-family: 'Material Icons'; 10 | font-weight: normal; 11 | font-style: normal; 12 | font-size: 24px; 13 | line-height: 1; 14 | letter-spacing: normal; 15 | text-transform: none; 16 | display: inline-block; 17 | white-space: nowrap; 18 | word-wrap: normal; 19 | direction: ltr; 20 | font-feature-settings: 'liga'; 21 | } 22 | -------------------------------------------------------------------------------- /static/js/share.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | const urlBox = document.getElementById('urlBox') 3 | const copyButton = document.getElementById('copyButton') 4 | urlBox.addEventListener('focus', (event) => { 5 | event.target.select(); 6 | }) 7 | let copiedTimeout = -1; 8 | copyButton.addEventListener('click', (event) => { 9 | event.target.textContent = 'Copied!'; 10 | urlBox.focus(); 11 | document.execCommand('copy'); 12 | if (copiedTimeout !== -1) { 13 | clearTimeout(copiedTimeout); 14 | } 15 | copiedTimeout = setTimeout(() => { 16 | event.target.textContent = 'Copy'; 17 | copiedTimeout = -1; 18 | }, 5000); 19 | }) 20 | })() -------------------------------------------------------------------------------- /view/components/uploader_file.ejs: -------------------------------------------------------------------------------- 1 |
2 | file_upload 3 |
Drop a file here to upload
4 |
Ensure that your file is less than <%= maxFileSize %>
5 |
Select a file to upload
6 | 7 |
arrow_forward
8 |
-------------------------------------------------------------------------------- /view/components/history-panel.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
NameDownloadUpload TimeDelete
13 |
14 |
Oops! Empty here.
15 |
refreshClear history and renew a identifier
16 |
-------------------------------------------------------------------------------- /view/components/status.ejs: -------------------------------------------------------------------------------- 1 |
2 | <%= data %> 3 |
4 | 5 |
6 | 7 |
8 |
FILES
9 |
10 |
11 | 12 |
13 |
DOWNLOADS
14 |
15 |
16 | 17 |
18 |
DISK
19 |
20 |
21 |
22 |
23 |
24 | 25 |
26 | 27 |
28 |
29 |
-------------------------------------------------------------------------------- /router/refresh.js: -------------------------------------------------------------------------------- 1 | const sequelize = require('../tool/sequelize') 2 | const Op = require('sequelize').Op 3 | 4 | const route = async function (ctx, next) { 5 | const items = await sequelize.rajio.findAll({ 6 | where: { 7 | identifier: ctx.identifier, 8 | deleted: { 9 | [Op.not]: true 10 | }, 11 | downloadLimit: { 12 | [Op.or]: [ 13 | null, 14 | {[Op.gt]: 'downloadCount'}, 15 | ] 16 | }, 17 | timeLimit: { 18 | [Op.or]: [ 19 | {[Op.gte]: new Date()}, 20 | null 21 | ] 22 | } 23 | }, 24 | order: [ 25 | ['uploadTime', 'DESC'] 26 | ] 27 | }) 28 | ctx.response.body = items 29 | } 30 | 31 | module.exports = { 32 | route 33 | } -------------------------------------------------------------------------------- /view/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%- include components/head.ejs -%> 5 | 6 | 7 | 8 | <%- include components/header.ejs -%> 9 | <%- include components/uploader.ejs -%> 10 | <%- include components/footer.ejs -%> 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 1.2 (Staging) 4 | 5 | New feature: 6 | 7 | * Added download from download code. 8 | 9 | ## 1.1 (2018-11-19) 10 | 11 | Bug fix: 12 | 13 | * When a file exceeded download count, it will not be shown on the history panel. 14 | * File name in the share page now layout well. 15 | * Garbage collection now works and functionally deletes exceeded file. 16 | 17 | Change: 18 | 19 | * After uploading a file, the default time limie will be set to 1 day. 20 | 21 | ## 1.0 (2018-11-16) 22 | 23 | * Adaptive UI for mobile and desktop 24 | * Upload & download file 25 | * Generate QRCode and link for share 26 | * Restrict download count limit or time limit. 27 | * Visualization for statistics data 28 | * No login and privacy is needed 29 | * One-key renew identifier and wipe history -------------------------------------------------------------------------------- /view/components/uploader.ejs: -------------------------------------------------------------------------------- 1 |
2 |
<%= data %>
3 |
4 | 9 | <%- include uploader_file.ejs -%> 10 | <%- include uploader_text.ejs -%> 11 |
12 |
13 | <%- include uploader_progress.ejs -%> 14 |
15 |
16 | <%- include uploader_result.ejs -%> 17 |
18 |
19 | <%- include uploader_error.ejs -%> 20 |
21 |
-------------------------------------------------------------------------------- /static/scss/_header_mobile.scss: -------------------------------------------------------------------------------- 1 | @media(max-width: 500px){ 2 | .header { 3 | height: 4rem; 4 | padding: 1rem 5%; 5 | .header-icon { 6 | font-size: 2rem; 7 | } 8 | .header-title { 9 | font-size: 2rem; 10 | } 11 | .header-expaination { 12 | font-size: 1rem; 13 | } 14 | .history-entry { 15 | bottom: 0.5rem; 16 | } 17 | } 18 | 19 | .history-panel { 20 | height: 60vh; 21 | width: 95vw; 22 | top: 8vh; 23 | left: 2.5vw; 24 | .renew-button { 25 | margin-top: 6px; 26 | } 27 | .table-wrapper::-webkit-scrollbar { 28 | width: 2px; 29 | } 30 | .table-wrapper::-webkit-scrollbar-track { 31 | border-radius: 2px; 32 | } 33 | .table-wrapper::-webkit-scrollbar-thumb { 34 | border-radius: 2px; 35 | } 36 | .table-wrapper { 37 | height: 51vh; 38 | overflow-x: auto; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /tool/info.js: -------------------------------------------------------------------------------- 1 | const diskusage = require('diskusage') 2 | const sequelize = require('../tool/sequelize') 3 | const cron = require('node-cron') 4 | 5 | const getUsage = () => diskusage.checkSync(__dirname) 6 | 7 | const getDownloadCount = async () => { 8 | const result = await sequelize.rajio.sum('downloadCount') 9 | return result 10 | } 11 | 12 | const getTotalCount = async () => { 13 | const result = await sequelize.rajio.count() 14 | return result 15 | } 16 | 17 | const getRecent = async () => { 18 | const result = await sequelize.rajioInfo.findAll({ 19 | limit: 7 20 | }) 21 | return result 22 | } 23 | 24 | const init = () => { 25 | sequelize.rajioInfo.create().catch(e => {}) 26 | cron.schedule('0 0 * * *', () => { 27 | sequelize.rajioInfo.create().catch(e => {}) 28 | }) 29 | } 30 | 31 | module.exports = { 32 | getUsage, 33 | getDownloadCount, 34 | getTotalCount, 35 | getRecent, 36 | init 37 | } -------------------------------------------------------------------------------- /router/share.js: -------------------------------------------------------------------------------- 1 | const sequelize = require('../tool/sequelize') 2 | const prettyBytes = require('pretty-bytes') 3 | const moment = require('moment') 4 | 5 | module.exports = async (ctx) => { 6 | const item = await sequelize.rajio.findOne({ 7 | where: { 8 | downloadCode: ctx.code 9 | } 10 | }) 11 | let forbidden = false 12 | if (!item || item.deleted) { 13 | forbidden = true 14 | ctx.response.status = 404 15 | } else { 16 | item.fileSize = prettyBytes(item.fileSize) 17 | const now = moment() 18 | const limit = moment(item.timeLimit) 19 | if ((item.downloadLimit !== null && item.downloadLimit <= item.downloadCount) || (item.timeLimit !== null && now.isAfter(limit, 'second'))) { 20 | forbidden = true 21 | ctx.response.status = 404 22 | } 23 | } 24 | 25 | await ctx.render('share', { 26 | share: true, 27 | item: item, 28 | domain: global.config.domain, 29 | forbidden 30 | }); 31 | } -------------------------------------------------------------------------------- /tool/gc.js: -------------------------------------------------------------------------------- 1 | const cron = require('node-cron') 2 | const sequelize = require('../tool/sequelize') 3 | const fs = require('fs-extra') 4 | const path = require('path') 5 | const Sequelize = require('sequelize') 6 | 7 | const Op = require('sequelize').Op 8 | 9 | const garbageCollection = async () => { 10 | const garbages = await sequelize.rajio.findAll({ 11 | where: { 12 | [Op.or]: { 13 | "downloadCount": { 14 | [Op.gte]: Sequelize.col('downloadLimit') 15 | }, 16 | "timeLimit": { 17 | [Op.lte]: new Date() 18 | } 19 | }, 20 | "deleted": { 21 | [Op.not]: true 22 | } 23 | } 24 | }) 25 | garbages.forEach(v => { 26 | v.deleted = true 27 | fs.removeSync(path.resolve(`./data/upload/${v.id}`)) 28 | v.save() 29 | }) 30 | } 31 | 32 | module.exports = { 33 | init: () => { 34 | cron.schedule('*/15 * * * *', garbageCollection) 35 | }, 36 | recycle: (item) => { 37 | item.deleted = true 38 | item.save() 39 | fs.removeSync(path.resolve(`./data/upload/${item.id}`)) 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 delbertbeta 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /view/components/uploader_result.ejs: -------------------------------------------------------------------------------- 1 |
2 | qrcode 3 |
4 | 5 |
Copy
6 |
7 |
8 | Download Code
9 |
10 |
11 | This file will be expired after 12 | unlimited 13 | times download
or
14 | 15 | . 16 |
17 |
Select another file
18 |
delete this file
19 |
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rajio", 3 | "version": "1.0.0", 4 | "description": "Rajio is an anonymous file/text sharing platform on web, focusing on lightweight and easy-deploy.", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/delbertbeta/rajio.git" 12 | }, 13 | "keywords": [ 14 | "file-sharing" 15 | ], 16 | "author": "delbertbeta", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/delbertbeta/rajio/issues" 20 | }, 21 | "homepage": "https://github.com/delbertbeta/rajio#readme", 22 | "dependencies": { 23 | "commander": "^2.19.0", 24 | "diskusage": "^0.2.6", 25 | "ejs": "^2.6.1", 26 | "fs-extra": "^7.0.1", 27 | "hat": "^0.0.3", 28 | "koa": "^2.4.1", 29 | "koa-better-serve": "^2.0.7", 30 | "koa-body": "^4.0.4", 31 | "koa-multer": "^1.0.2", 32 | "koa-router": "^7.4.0", 33 | "koa-send": "^5.0.0", 34 | "koa-views": "^6.1.4", 35 | "koa.sass": "^1.0.3", 36 | "log4js": "^3.0.6", 37 | "moment": "^2.22.2", 38 | "node-cron": "^2.0.3", 39 | "pretty-bytes": "^5.1.0", 40 | "sequelize": "^4.33.4", 41 | "sqlite3": "^4.0.3" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /view/components/share.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | <% if(!forbidden) { %> 5 |
6 | Hello, Download <%= item.fileName %> (<%= item.fileSize %>) 7 |
8 |
9 | Your friend has just shared a file with you via rajio. Rajio is a simple way to share your file. 10 |
11 |
12 | 13 |
Copy
14 |
15 | 16 | Download 17 | <% } %> 18 | <% if(forbidden) { %> 19 |
20 | Sorry, this link is not exist or expired. 21 |
22 |
23 | Rajio will delete all the expired files once they go over the limit of time or download count, disappear from the world. 24 |
25 | 26 | <% } %> 27 |
28 |
29 |
-------------------------------------------------------------------------------- /static/img/download.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/scss/_uploader_mobile.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 500px){ 2 | .uploader { 3 | padding-bottom: 0; 4 | .container { 5 | min-height: 440px; 6 | height: 60vh; 7 | width: 90vw; 8 | .uploader-file-container { 9 | .tip-text { 10 | font-size: 1.2rem; 11 | } 12 | // .upload-button { 13 | // font-size: 1rem; 14 | // width: 14rem; 15 | // height: 3.2rem; 16 | // } 17 | } 18 | } 19 | .progress-container { 20 | height: 60vh; 21 | width: 90vw; 22 | .file-name { 23 | width: 80%; 24 | text-align: center; 25 | } 26 | } 27 | .result-container { 28 | height: 70vh; 29 | width: 90vw; 30 | .url { 31 | width: 100% !important; 32 | } 33 | .copy-botton { 34 | flex-shrink: 0; 35 | } 36 | .function-line { 37 | font-size: 0.8rem; 38 | } 39 | .qrcode { 40 | width: 120px !important; 41 | } 42 | .download-code-wrapper { 43 | padding: 4px 32px !important; 44 | .download-code { 45 | font-size: 22px !important; 46 | } 47 | } 48 | } 49 | .error-container { 50 | height: 60vh; 51 | width: 90vw; 52 | .tip { 53 | width: 80%; 54 | text-align: center; 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa'); 2 | 3 | const path = require('path'); 4 | 5 | const render = require('koa-views'); 6 | const serveStatic = require('koa-better-serve'); 7 | const serveSass = require('koa.sass'); 8 | 9 | const sequelize = require('./tool/sequelize'); 10 | const log4js = require('./tool/log4js'); 11 | const gc = require('./tool/gc') 12 | const info = require('./tool/info') 13 | 14 | const app = new Koa(); 15 | 16 | const config = require('./config') 17 | 18 | global.config = config 19 | 20 | const router = require('./router/router') 21 | 22 | // app.use(async function (ctx, next) { 23 | // console.log(ctx); 24 | // let meta = ctx.ip + '(' + ctx.hostname + ')' + ' ' + ctx.method + ' ' + ctx.url; 25 | // log4js.info(meta); 26 | // await next(); 27 | // return; 28 | // }); 29 | 30 | app.use(render(__dirname + '/view', { 31 | map: { 32 | html: 'underscore' 33 | }, 34 | extension: 'ejs' 35 | })); 36 | 37 | app.use(router.routes()) 38 | .use(router.allowedMethods()); 39 | 40 | app.use(serveSass({ 41 | mountAt: '/static/css', 42 | src: './static/scss', 43 | dest: './static/css', 44 | importPaths: ['./node_modules'] 45 | })) 46 | 47 | app.use(serveStatic('./static', '/static')); 48 | 49 | sequelize.rajio.sync() 50 | sequelize.rajioInfo.sync() 51 | 52 | gc.init() 53 | info.init() 54 | 55 | app.listen(4290); 56 | log4js.info('Serving at http://localhost:4290'); -------------------------------------------------------------------------------- /router/download.js: -------------------------------------------------------------------------------- 1 | const logger = require('../tool/log4js') 2 | const sequelize = require('../tool/sequelize') 3 | const Sequelize = require('sequelize') 4 | const fs = require('fs-extra') 5 | const moment = require('moment') 6 | 7 | const forbiddenHandle = async (ctx) => { 8 | ctx.response.status = 404 9 | await ctx.render('share', { 10 | share: true, 11 | forbidden: true 12 | }); 13 | } 14 | 15 | const route = async (ctx) => { 16 | const id = ctx.id 17 | const item = await sequelize.rajio.findOne({ 18 | where: { 19 | id: id 20 | } 21 | }) 22 | if (!item || item.deleted) { 23 | await forbiddenHandle(ctx) 24 | return 25 | } 26 | 27 | const now = moment() 28 | const limit = moment(item.timeLimit) 29 | if (item.timeLimit !== null && now.isAfter(limit, 'second')) { 30 | await forbiddenHandle(ctx) 31 | return 32 | } 33 | 34 | if (item.downloadLimit !== null && item.downloadLimit <= item.downloadCount) { 35 | await forbiddenHandle(ctx) 36 | return 37 | } else { 38 | sequelize.rajioInfo.increment('count', { 39 | where: { 40 | date: now.format('YYYY-MM-DD') 41 | } 42 | }) 43 | item.increment('downloadCount') 44 | } 45 | 46 | ctx.response.attachment(item.fileName) 47 | const stream = await fs.createReadStream(`data/upload/${item.id}`) 48 | ctx.response.body = stream 49 | 50 | } 51 | 52 | module.exports = { 53 | route: route 54 | } -------------------------------------------------------------------------------- /router/upload.js: -------------------------------------------------------------------------------- 1 | const multer = require('koa-multer'); 2 | const logger = require('../tool/log4js'); 3 | const sequelize = require('../tool/sequelize'); 4 | const hat = require('hat'); 5 | const koaBody = require('koa-body'); 6 | const path = require('path') 7 | const moment = require('moment') 8 | 9 | let koaBodyFunc = koaBody({ 10 | multipart: true, 11 | formidable: { 12 | uploadDir: path.resolve('../data/upload/'), 13 | maxFieldsSize: global.config.maxFileSize, 14 | onFileBegin: (name, file) => { 15 | file.path = './data/upload/' + hat() 16 | } 17 | } 18 | }) 19 | 20 | const route = async function (ctx) { 21 | if (typeof ctx.request.body.identifier !== 'string') { 22 | ctx.response.status = 401 23 | ctx.response.body = { 24 | message: 'Identifier is needed.' 25 | } 26 | } else { 27 | const data = await sequelize.rajio.create({ 28 | id: ctx.request.files.file.path.split('/').pop(), 29 | downloadCount: 0, 30 | downloadLimit: null, 31 | timeLimit: moment().add(1, 'day').toDate(), 32 | downloadCode: hat(24, 16), 33 | fileSize: ctx.request.files.file.size, 34 | fileName: ctx.request.files.file.name, 35 | identifier: ctx.request.body.identifier 36 | }); 37 | ctx.response.body = data; 38 | } 39 | }; 40 | 41 | module.exports = { 42 | koaBody: koaBodyFunc, 43 | route: route 44 | } -------------------------------------------------------------------------------- /router/router.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router'); 2 | const router = new Router(); 3 | const download = require('./download'); 4 | const index = require('./index'); 5 | const upload = require('./upload'); 6 | const share = require('./share') 7 | const deleteHandle = require('./delete') 8 | const update = require('./update') 9 | const refresh = require('./refresh') 10 | const status = require('./status') 11 | 12 | router.get('/', index) 13 | router.get('/status', status) 14 | 15 | router.post('/api/upload', upload.koaBody, upload.route) 16 | 17 | router.param('id', (id, ctx, next) => { 18 | ctx.id = id 19 | return next() 20 | }).get('/d/:id/:fileName', download.route) 21 | 22 | router.param('code', (id, ctx, next) => { 23 | ctx.code = id 24 | return next() 25 | }).get('/s/:code', share) 26 | 27 | router.param('id', (id, ctx, next) => { 28 | ctx.id = id 29 | return next() 30 | }).get('/s/:id', share) 31 | 32 | router.param('id', (id, ctx, next) => { 33 | ctx.id = id 34 | return next() 35 | }).param('identifier', (id, ctx, next) => { 36 | ctx.identifier = id 37 | return next() 38 | }).delete('/api/:identifier/:id', deleteHandle.route) 39 | 40 | router.param('id', (id, ctx, next) => { 41 | ctx.id = id 42 | return next() 43 | }).param('identifier', (id, ctx, next) => { 44 | ctx.identifier = id 45 | return next() 46 | }).put('/api/:identifier/:id', update.koaBody, update.route) 47 | 48 | router.param('id', (id, ctx, next) => { 49 | ctx.id = id 50 | return next() 51 | }).get('/api/:identifier', refresh.route) 52 | 53 | module.exports = router -------------------------------------------------------------------------------- /tool/sequelize.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | 3 | const sequelize = new Sequelize('database', 'username', 'password', { 4 | host: 'localhost', 5 | dialect: 'sqlite', 6 | 7 | pool: { 8 | max: 5, 9 | min: 0, 10 | acquire: 30000, 11 | idle: 10000 12 | }, 13 | 14 | storage: 'data/database/rajio.sqlite' 15 | }); 16 | 17 | const rajio = sequelize.define('rajio', { 18 | id: { 19 | type: Sequelize.STRING, 20 | primaryKey: true 21 | }, 22 | downloadCount: { 23 | type: Sequelize.INTEGER 24 | }, 25 | downloadLimit: { 26 | type: Sequelize.INTEGER, 27 | allowNull: true 28 | }, 29 | uploadTime: { 30 | type: Sequelize.DATE, 31 | defaultValue: Sequelize.NOW 32 | }, 33 | fileSize: { 34 | type: Sequelize.INTEGER 35 | }, 36 | timeLimit: { 37 | type: Sequelize.DATE, 38 | allowNull: true 39 | }, 40 | downloadCode: { 41 | type: Sequelize.STRING, 42 | unique: true 43 | }, 44 | fileName: { 45 | type: Sequelize.STRING 46 | }, 47 | deleted: { 48 | type: Sequelize.BOOLEAN, 49 | defaultValue: false 50 | }, 51 | identifier: { 52 | type: Sequelize.STRING 53 | } 54 | }) 55 | 56 | const rajioInfo = sequelize.define('rajio_info', { 57 | date: { 58 | type: Sequelize.DATEONLY, 59 | primaryKey: true, 60 | unique: true, 61 | defaultValue: Sequelize.NOW 62 | }, 63 | count: { 64 | type: Sequelize.INTEGER, 65 | defaultValue: 0 66 | } 67 | }) 68 | 69 | module.exports = { 70 | rajio: rajio, 71 | rajioInfo: rajioInfo 72 | } -------------------------------------------------------------------------------- /static/js/status.js: -------------------------------------------------------------------------------- 1 | const data = JSON.parse(document.getElementById('data').textContent) 2 | 3 | let nodes = ['fileCount', 'downloadCount', 'diskText', 'diskGraph', 'chart'] 4 | 5 | nodes = getElement(nodes) 6 | 7 | function getElement(list) { 8 | const obj = {} 9 | list.forEach(v => { 10 | obj[v] = document.getElementById(v) 11 | }) 12 | return obj 13 | } 14 | 15 | nodes.fileCount.textContent = data.totalCount 16 | nodes.downloadCount.textContent = data.downloadCount 17 | diskGraph.style.width = (data.usage.total - data.usage.available) / data.usage.total * 100 + '%' 18 | nodes.diskText.textContent = filesize(data.usage.available) + '/' + filesize(data.usage.total) 19 | 20 | option = { 21 | title: { 22 | text: 'DOWNLOADS PER DAY', 23 | x:'center', 24 | top: 6, 25 | textStyle: { 26 | fontWeight: 200, 27 | fontSize: 24 28 | } 29 | }, 30 | xAxis: { 31 | type: 'category', 32 | axisLabel: { 33 | textStyle: { 34 | color: '#353535' 35 | } 36 | }, 37 | }, 38 | yAxis: { 39 | type: 'value', 40 | axisLabel: { 41 | textStyle: { 42 | color: '#353535' 43 | } 44 | } 45 | }, 46 | series: [{ 47 | data: data.recent.map(v => [v.date, v.count]), 48 | type: 'bar', 49 | barMaxWidth: 32, 50 | itemStyle: { 51 | normal: { 52 | color: new echarts.graphic.LinearGradient( 53 | 0, 0, 0, 1, 54 | [ 55 | { offset: 0, color: '#83bff6' }, 56 | { offset: 0.5, color: '#188df0' }, 57 | { offset: 1, color: '#188df0' } 58 | ] 59 | ) 60 | } 61 | }, 62 | tooltip: { 63 | show: true 64 | } 65 | }] 66 | } 67 | 68 | const chart = echarts.init(nodes.chart) 69 | 70 | chart.setOption(option) -------------------------------------------------------------------------------- /cmd/local.js: -------------------------------------------------------------------------------- 1 | const program = require('commander') 2 | 3 | const fs = require('fs-extra') 4 | const sequelize = require('../tool/sequelize'); 5 | const hat = require('hat'); 6 | const path = require('path') 7 | const moment = require('moment') 8 | 9 | const handle = async function (id, downloadLimit, timeLimit, fileSize, fileName, identifier) { 10 | const data = await sequelize.rajio.create({ 11 | id, 12 | downloadCount: 0, 13 | downloadLimit, 14 | timeLimit, 15 | downloadCode: hat(24, 16), 16 | fileSize, 17 | fileName, 18 | identifier 19 | }) 20 | return data 21 | } 22 | 23 | program 24 | .version('rajio-local 1.0.0', '-v, --version') 25 | .option('-l, --local-file ', 'Specific a local file to share') 26 | .option('-i, --identifier ', 'Specific a identifier (Optional)') 27 | .option('-t, --time-limit ', 'Limit the time (Optional)') 28 | .option('-d, --download-limit ', 'Limit the download count (Optional)', parseInt) 29 | .parse(process.argv) 30 | 31 | 32 | if (program.localFile) { 33 | const filePath = path.resolve(program.localFile) 34 | try { 35 | const stat = fs.statSync(filePath) 36 | const fileSize = stat.size 37 | const fileName = path.basename(program.localFile) 38 | const identifier = program.identifier ? program.identifier : hat() 39 | const timeLimit = program.timeLimit ? moment(program.timeLimit) : null 40 | const downloadLimit = program.downloadLimit ? program.downloadLimit : null 41 | const id = hat() 42 | fs.ensureSymlinkSync(filePath, path.resolve(__dirname, `../data/upload/${id}`)) 43 | handle(id, downloadLimit, timeLimit, fileSize, fileName, identifier).then(r => { 44 | console.log(JSON.parse(JSON.stringify(r))) 45 | }) 46 | } catch (e) { 47 | if (e.code === 'ENOENT') { 48 | console.error('No such file.') 49 | } else { 50 | console.log(e) 51 | } 52 | } 53 | } else { 54 | program.outputHelp() 55 | } 56 | -------------------------------------------------------------------------------- /static/scss/status.scss: -------------------------------------------------------------------------------- 1 | @import '_footer'; 2 | @import '_header'; 3 | @import '_footer_mobile'; 4 | @import '_header_mobile'; 5 | 6 | a:hover, 7 | a:visited, 8 | a:link, 9 | a:active { 10 | text-decoration: none; 11 | } 12 | 13 | html { 14 | width: 100%; 15 | background-image: url(/static/img/texture.png); 16 | background-size: 20rem; 17 | background-repeat: no-repeat; 18 | background-position: bottom 5% right 5%; 19 | font-family: sans-serif; 20 | } 21 | 22 | body { 23 | margin: 0; 24 | min-width: 100%; 25 | } 26 | 27 | .hide { 28 | display: none !important; 29 | } 30 | 31 | .info-text-wrapper { 32 | color: #353535; 33 | margin-top: 20px; 34 | width: 60vw; 35 | margin-left: 20vw; 36 | display: flex; 37 | justify-content: space-around; 38 | .info-text { 39 | width: 33%; 40 | .title { 41 | font-weight: 200; 42 | font-size: 24px; 43 | } 44 | .text { 45 | margin-top: 8px; 46 | font-size: 18px; 47 | color: #888; 48 | } 49 | .graph { 50 | position: relative; 51 | margin-top: 4px; 52 | height: 4px; 53 | width: 100%; 54 | background-color: #eeeeee; 55 | border-radius: 2px; 56 | overflow: hidden; 57 | .graph-inner { 58 | height: 4px; 59 | position: absolute; 60 | left: 0; 61 | top: 0; 62 | border-radius: 2px; 63 | width: 0%; 64 | transition: width 1s ease; 65 | background-color: #888; 66 | } 67 | } 68 | } 69 | } 70 | 71 | .chart-wrapper { 72 | margin-top: 32px; 73 | display: flex; 74 | justify-content: center; 75 | .chart { 76 | height: 400px; 77 | width: 800px; 78 | } 79 | } 80 | 81 | @media (max-width: 500px) { 82 | html { 83 | background-size: 14rem; 84 | background-position: bottom 1rem right 1rem; 85 | } 86 | 87 | .info-text-wrapper { 88 | width: 80vw; 89 | margin-left: 10vw; 90 | flex-wrap: wrap; 91 | .info-text { 92 | font-size: 18px; 93 | margin-bottom: 16px; 94 | width: 100%; 95 | } 96 | } 97 | } -------------------------------------------------------------------------------- /router/update.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment') 2 | const koaBody = require('koa-body') 3 | const sequelize = require('../tool/sequelize') 4 | 5 | const downloadLimit = [ 6 | 1, 5, 10, 20, 50, 100, 1000, null 7 | ] 8 | 9 | const timeLimit = [ 10 | [1, 'hour'], 11 | [12, 'hour'], 12 | [1, 'day'], 13 | [7, 'day'], 14 | [1, 'month'], 15 | [6, 'month'], 16 | [1, 'year'], 17 | null 18 | ] 19 | 20 | const koaBodyRoute = koaBody() 21 | 22 | const route = async function (ctx, next) { 23 | const item = await sequelize.rajio.findOne({ 24 | where: { 25 | id: ctx.id 26 | } 27 | }) 28 | if (!item || item.deleted) { 29 | ctx.throw(404) 30 | return 31 | } 32 | if (item.identifier !== ctx.identifier) { 33 | ctx.throw(403) 34 | return 35 | } 36 | 37 | const body = ctx.request.body 38 | 39 | const timeObj = timeLimit[body.timeLimit] 40 | const downloadObj = downloadLimit[body.downloadLimit] 41 | 42 | if ((typeof body.timeLimit !== 'number' && typeof body.downloadLimit !== 'number') || (typeof timeObj === 'undefined' && typeof downloadObj === 'undefined')) { 43 | ctx.throw(400, "Invalid parameter.") 44 | return 45 | } 46 | 47 | // update 48 | if (typeof timeObj !== 'undefined') { 49 | if (timeObj === null) { 50 | item.timeLimit = null 51 | } else { 52 | const now = moment() 53 | const targetTime = moment(item.uploadTime).add(...timeObj) 54 | if (targetTime.isBefore(now, 'second')) { 55 | ctx.throw(400, 'time limit is before than now.') 56 | return 57 | } else { 58 | item.timeLimit = targetTime.toDate() 59 | } 60 | } 61 | } 62 | 63 | if (typeof downloadObj !== 'undefined') { 64 | if (downloadObj === null) { 65 | item.downloadLimit = null 66 | } else { 67 | if (downloadObj < item.downloadCount) { 68 | ctx.throw(400, 'download limit is less than download count.') 69 | return 70 | } else { 71 | item.downloadLimit = downloadObj 72 | } 73 | } 74 | } 75 | 76 | item.save() 77 | 78 | ctx.response.body = item 79 | } 80 | 81 | module.exports = { 82 | koaBody: koaBodyRoute, 83 | route 84 | } -------------------------------------------------------------------------------- /static/img/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/error.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/scss/global.scss: -------------------------------------------------------------------------------- 1 | a:hover, 2 | a:visited, 3 | a:link, 4 | a:active { 5 | text-decoration: none; 6 | } 7 | 8 | html { 9 | width: 100%; 10 | height: 100%; 11 | background-image: url(/static/img/texture.png); 12 | background-size: 20rem; 13 | background-repeat: no-repeat; 14 | background-position: bottom 5% right 5%; 15 | font-family: sans-serif; 16 | overflow: hidden; 17 | } 18 | 19 | @media (max-width: 500px) { 20 | html { 21 | background-size: 14rem; 22 | background-position: bottom 1rem right 1rem; 23 | overflow: auto; 24 | min-height: 600px; 25 | } 26 | } 27 | 28 | body { 29 | margin: 0; 30 | min-width: 100%; 31 | height: 100%; 32 | display: flex; 33 | flex-direction: column; 34 | justify-content: space-between; 35 | } 36 | 37 | .choices { 38 | color: #0080db; 39 | cursor: pointer; 40 | position: relative; 41 | svg { 42 | // height: 20px; 43 | // width: 20px; 44 | // vertical-align: top; 45 | } 46 | 47 | } 48 | 49 | .options { 50 | position: fixed; 51 | z-index: 10; 52 | width: 150px; 53 | background-color: white; 54 | padding: 0; 55 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 56 | li { 57 | padding: 1rem 0; 58 | text-align: center; 59 | list-style-type: none; 60 | cursor: pointer; 61 | color: #0080db; 62 | font-weight: 300; 63 | } 64 | } 65 | .options.fadeOut { 66 | pointer-events: none; 67 | } 68 | 69 | .lower-option-mask { 70 | position: fixed; 71 | width: 100%; 72 | height: 100%; 73 | z-index: 0; 74 | } 75 | 76 | .higher-option-mask { 77 | position: fixed; 78 | width: 100%; 79 | height: 100%; 80 | z-index: 9; 81 | } 82 | 83 | @import 'header'; 84 | @import 'header_mobile'; 85 | @import 'footer'; 86 | @import 'footer_mobile'; 87 | @import 'uploader'; 88 | @import 'uploader_mobile'; 89 | 90 | 91 | .hide { 92 | display: none !important; 93 | } 94 | 95 | .rotateIn { 96 | animation: 0.5s cubic-bezier(.2,.7,.04,.99) 0s 1 both rotateIn; 97 | } 98 | 99 | @keyframes rotateIn { 100 | 0% { 101 | transform: rotateY(-90deg); 102 | } 103 | 104 | 100% { 105 | transform: rotateY(0deg); 106 | } 107 | } 108 | 109 | .rotateOut { 110 | animation: 0.5s cubic-bezier(.89,.01,.89,.99) 0s 1 both rotateOut; 111 | } 112 | 113 | @keyframes rotateOut { 114 | 0% { 115 | transform: rotateY(0deg); 116 | } 117 | 118 | 100% { 119 | transform: rotateY(90deg); 120 | } 121 | } 122 | 123 | .fadeIn { 124 | animation: 0.3s ease 0s 1 both fadeIn; 125 | } 126 | 127 | @keyframes fadeIn { 128 | from { 129 | transform: translateY(1rem); 130 | opacity: 0; 131 | } 132 | to { 133 | transform: translateY(0); 134 | opacity: 1; 135 | } 136 | } 137 | 138 | .fadeOut { 139 | animation: 0.3s ease 0s 1 both fadeOut; 140 | } 141 | 142 | @keyframes fadeOut { 143 | from { 144 | transform: translateY(0rem); 145 | opacity: 1; 146 | } 147 | to { 148 | transform: translateY(1rem); 149 | opacity: 0; 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /static/scss/_header.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | width: 100%; 3 | height: 8rem; 4 | padding: 2rem 5%; 5 | box-sizing: border-box; 6 | position: relative; 7 | .header-icon { 8 | vertical-align: middle; 9 | font-size: 4rem; 10 | color: #6a6a6a; 11 | } 12 | .header-title { 13 | vertical-align: middle; 14 | font-size: 4rem; 15 | color: #6a6a6a; 16 | } 17 | .header-expaination { 18 | // position: absolute; 19 | // right: 5%; 20 | // bottom: 2rem; 21 | display: inline-block; 22 | position: relative; 23 | vertical-align: bottom; 24 | margin-bottom: 0.5rem; 25 | margin-left: 0.5rem; 26 | font-size: 1.5rem; 27 | color: #838383; 28 | font-weight: 300; 29 | } 30 | .history-entry { 31 | position: absolute; 32 | display: flex; 33 | border-radius: 4px; 34 | background-color: rgba(0, 0, 0, 0); 35 | height: 2.5rem; 36 | width: 2.5rem; 37 | transition: background-color 0.2s ease; 38 | justify-content: center; 39 | align-items: center; 40 | right: 5%; 41 | bottom: 1.5rem; 42 | color: #6a6a6a; 43 | cursor: pointer; 44 | i { 45 | font-size: 2rem; 46 | } 47 | } 48 | .history-entry:hover { 49 | background-color: rgba(0, 0, 0, 0.1); 50 | } 51 | } 52 | 53 | .history-panel { 54 | position: fixed; 55 | height: 50vh; 56 | width: 720px; 57 | right: 5%; 58 | top: 7rem; 59 | overflow: hidden; 60 | background-color: white; 61 | box-shadow: 0 0px 16px rgba(0, 0, 0, 0.1); 62 | border-radius: 4px; 63 | // border: 1px solid #838383; 64 | z-index: 2; 65 | padding: 1rem; 66 | box-sizing: border-box; 67 | overflow: hidden; 68 | .renew-button { 69 | display: flex; 70 | justify-content: center; 71 | align-items: center; 72 | div { 73 | padding: 6px 12px; 74 | display: flex; 75 | align-items: center; 76 | transition: background-color 0.2s ease; 77 | border-radius: 4px; 78 | } 79 | div:hover { 80 | cursor: pointer; 81 | background-color: rgba(0, 0, 0, 0.1); 82 | } 83 | } 84 | i { 85 | cursor: pointer; 86 | } 87 | .table-wrapper::-webkit-scrollbar-track 88 | { 89 | // -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); 90 | border-radius: 4px; 91 | background-color: #F5F5F5; 92 | } 93 | 94 | .table-wrapper::-webkit-scrollbar 95 | { 96 | width: 8px; 97 | background-color: #F5F5F5; 98 | } 99 | 100 | .table-wrapper::-webkit-scrollbar-thumb 101 | { 102 | border-radius: 4px; 103 | // -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); 104 | background-color: #555; 105 | } 106 | .table-wrapper { 107 | width: 100%; 108 | height: 43vh; 109 | overflow-x: hidden; 110 | overflow-y: auto; 111 | table { 112 | width: 100%; 113 | table-layout: fixed; 114 | overflow-y: auto; 115 | tr { 116 | font-weight: 300; 117 | position: relative; 118 | height: 2rem; 119 | th { 120 | font-weight: normal; 121 | } 122 | th:first-child { 123 | text-align: left; 124 | } 125 | td:first-child { 126 | text-align: left; 127 | overflow: hidden; 128 | white-space: nowrap; 129 | text-overflow: ellipsis; 130 | } 131 | td { 132 | text-align: center; 133 | i { 134 | color: #6a6a6a; 135 | } 136 | } 137 | } 138 | tr:first-child { 139 | color: #6a6a6a; 140 | border-bottom: 1px solid #838383; 141 | } 142 | } 143 | } 144 | .empty-tip { 145 | height: 100%; 146 | width: 100%; 147 | position: absolute; 148 | display: flex; 149 | justify-content: center; 150 | align-items: center; 151 | top: 0; 152 | left: 0; 153 | color: #6a6a6a; 154 | } 155 | } -------------------------------------------------------------------------------- /static/scss/share.scss: -------------------------------------------------------------------------------- 1 | @import '_footer'; 2 | @import '_header'; 3 | @import '_footer_mobile'; 4 | @import '_header_mobile'; 5 | 6 | a:hover, 7 | a:visited, 8 | a:link, 9 | a:active { 10 | text-decoration: none; 11 | } 12 | 13 | html { 14 | width: 100%; 15 | height: 100%; 16 | background-image: url(/static/img/texture.png); 17 | background-size: 20rem; 18 | background-repeat: no-repeat; 19 | background-position: bottom 5% right 5%; 20 | font-family: sans-serif; 21 | overflow: hidden; 22 | } 23 | 24 | body { 25 | margin: 0; 26 | min-width: 100%; 27 | height: 100%; 28 | display: flex; 29 | flex-direction: column; 30 | justify-content: space-between; 31 | } 32 | 33 | .hide { 34 | display: none !important; 35 | } 36 | 37 | .uploader { 38 | display: flex; 39 | flex-direction: column; 40 | align-items: center; 41 | padding-bottom: 5vh; 42 | transform-style: preserve-3d; 43 | perspective: 1000px; 44 | .download-container { 45 | position: relative; 46 | display: block; 47 | height: 60vh; 48 | width: 60vw; 49 | transition: all 0.2s ease; 50 | .inner-container { 51 | display: flex; 52 | justify-content: center; 53 | align-items: center; 54 | flex-direction: column; 55 | height: 100%; 56 | .title { 57 | font-weight: 200; 58 | font-size: 32px; 59 | color: #353535; 60 | text-align: center; 61 | word-break: break-word; 62 | } 63 | .explanation { 64 | width: 60%; 65 | margin-top: 12px; 66 | font-size: 16px; 67 | color: #505050; 68 | text-align: center; 69 | } 70 | .url { 71 | overflow: hidden; 72 | height: 3rem; 73 | width: 500px; 74 | border-radius: 6px; 75 | border: 1px solid #0080db; 76 | display: flex; 77 | justify-content: space-between; 78 | margin-top: 1.2rem; 79 | .url-box { 80 | display: inline-block; 81 | width: 400px; 82 | height: 100%; 83 | border: none; 84 | color: #6a6a6a; 85 | padding-left: 10px; 86 | padding-right: 10px; 87 | font-size: 1rem; 88 | font-family: sans-serif; 89 | font-weight: 300; 90 | } 91 | .copy-botton { 92 | display: inline-block; 93 | height: 100%; 94 | width: 100px; 95 | background-color: #0080db; 96 | color: white; 97 | display: flex; 98 | justify-content: center; 99 | align-items: center; 100 | cursor: pointer; 101 | transition: background-color 0.5s ease; 102 | } 103 | .copy-botton:hover { 104 | background-color: #3e9bdd; 105 | } 106 | } 107 | .not-found { 108 | margin-top: 32px; 109 | height: 220px; 110 | width: 220px; 111 | } 112 | .download { 113 | height: 160px; 114 | width: 160px; 115 | } 116 | .go-back-button { 117 | margin-top: 1.2rem; 118 | height: 3.6rem; 119 | width: 16rem; 120 | background-color: #0080db; 121 | border-radius: 6px; 122 | font-size: 1.2rem; 123 | color: white; 124 | display: flex; 125 | justify-content: center; 126 | align-items: center; 127 | cursor: pointer; 128 | margin-bottom: 0.5rem; 129 | transition: background-color 0.2s ease; 130 | } 131 | .go-back-button:hover { 132 | background-color: #3e9bdd; 133 | } 134 | } 135 | } 136 | } 137 | 138 | @media (max-width: 500px) { 139 | html { 140 | background-size: 14rem; 141 | background-position: bottom 1rem right 1rem; 142 | } 143 | .download-container { 144 | height: 70vh !important; 145 | width: 90vw !important; 146 | .title { 147 | font-size: 26px !important; 148 | } 149 | .explanation { 150 | width: 90% !important; 151 | } 152 | .url { 153 | width: 100% !important; 154 | } 155 | .download { 156 | height: 120px !important; 157 | width: 120px !important; 158 | } 159 | .copy-botton { 160 | flex-shrink: 0; 161 | } 162 | } 163 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rajio 2 | 3 | Rajio is an anonymous file/text sharing platform on web, focusing on lightweight and easy-deploy. :ghost: 4 | 5 | ## Introduction 6 | 7 | Just similar to [Firefox Send](https://send.firefox.com/), Rajio gives you a space to upload file or text without login and your privacy. **Rajio will not encrypt your file on the server, which is different from Firefox Send**. After uploading, you can share it with your friends by urls or QRCode. 8 | 9 | Rajio generate and storage your identifier token for your uploaded files locally. You can wipe your history and hide yourself by renew a indentifier token. We will not store any data about the relationship between specific people and identifier. 10 | 11 | The original intention of rajio is only to find an easy way to transfer a file from my PC to my phones without any other software installed. 12 | 13 | Just test it on [https://rajio.delbertbeta.cc](https://rajio.delbertbeta.cc) 14 | 15 | ## Features 16 | 17 | * Adaptive UI for mobile and desktop 18 | * Upload & download file 19 | * Generate QRCode and link for share 20 | * Restrict download count limit or time limit. 21 | * Visualization for statistics data 22 | * No login and privacy is needed 23 | * One-key renew identifier and wipe history 24 | 25 | [Change Log](https://github.com/delbertbeta/rajio/blob/master/ChangeLog.md) 26 | 27 | ## Screenshot 28 | 29 | ![rajio_1](https://rajio.delbertbeta.cc/d/bf031250b96360e9c213561066c3bd05/rajio_1.png) 30 | ![rajio_2](https://rajio.delbertbeta.cc/d/002fb90cff8132212dc221d9875cbfd6/rajio_2.png) 31 | ![rajio_3](https://rajio.delbertbeta.cc/d/b636346b8cb322832611795a3632fc0f/rajio_3.png) 32 | ![rajio_4](https://rajio.delbertbeta.cc/d/3ced93e38c696ee6efbf343a41b455d4/rajio_4.png) 33 | ![rajio_5](https://rajio.delbertbeta.cc/d/296db6ec148bbc50b532e8567ef2610b/rajio_5.png) 34 | 35 | ## Command-Line Tools 36 | 37 | * local 38 | 39 | `local` is a tool to share your exist file on server to others. This tool creates symbolic link of the file to the upload folder and creates item in database so rajio can serve it. 40 | 41 | **Delete file created by `local` will not delete your orginal file.** 42 | 43 | ``` 44 | Usage: local [options] 45 | 46 | Options: 47 | -v, --version output the version number 48 | -l, --local-file Specific a local file to share 49 | -i, --identifier Specific a identifier (Optional) 50 | -t, --time-limit Limit the time (Optional) 51 | -d, --download-limit Limit the download count (Optional) 52 | -h, --help output usage information 53 | ``` 54 | 55 | Speicific your identifier to manage this file in your history panel on web. To get identifier of your session, run 56 | 57 | ```javascript 58 | localStorage["identifier"] 59 | ``` 60 | 61 | in your browser's devtool with rajio open. 62 | 63 | Example: 64 | 65 | ```bash 66 | node ./cmd/local.js -l ~/rajio/config.js -i ec4627b7c2883ba0ee17a78087ff9e2e -d 10 -t "2018-11-21 00:00" 67 | ``` 68 | 69 | Return: 70 | 71 | ```javascript 72 | { 73 | uploadTime: '2018-11-19T16:25:15.567Z', 74 | deleted: false, 75 | id: '3054632c0cf151d42e083072c6ae7c29', 76 | downloadCount: 0, 77 | downloadLimit: 10, 78 | timeLimit: '2018-11-20T16:00:00.000Z', 79 | downloadCode: '823ef3', 80 | fileSize: 106, 81 | fileName: 'config.js', 82 | identifier: 'ec4627b7c2883ba0ee17a78087ff9e2e', 83 | updatedAt: '2018-11-19T16:25:15.569Z', 84 | createdAt: '2018-11-19T16:25:15.569Z' 85 | } 86 | ``` 87 | 88 | ## Install 89 | 90 | 1. Install Node 91 | 92 | Rajio are tested on `nodejs >= 8.9.0`, if you don't have node installed, visit https://nodejs.org for help. 93 | 94 | 2. Install yarn 95 | 96 | Rajio uses `yarn` for package management, to install `yarn`: 97 | 98 | ```bash 99 | npm install -g yarn 100 | ``` 101 | 102 | 3. Clone the code 103 | 104 | Choose a place to clone the code. 105 | 106 | ```bash 107 | git clone https://github.com/delbertbeta/rajio.git 108 | cd rajio 109 | ``` 110 | 111 | 4. Install dependencies 112 | 113 | Yarn will do everything for you: 114 | 115 | ``` 116 | yarn 117 | ``` 118 | 119 | 5. Configure rajio 120 | 121 | Edit `config.js` for domain, maxFileSize, etc. 122 | 123 | 6. Start app.js 124 | 125 | You can use `pm2` or `forever` to monitor the process of node, or just simply type 126 | 127 | ``` 128 | node app.js 129 | ``` 130 | 131 | Now the application is running on port `4290`, to modify this, edit `app.js` 132 | 133 | 7. (Optional) Configure your http server for proxy 134 | 135 | If you are running `nginx` or `apache`, you may want to configure reserve proxy for Rajio. Visit their documents for help. 136 | 137 | Now you have finished the installation of Rajio. :tada::tada: 138 | 139 | ## License 140 | 141 | MIT License 142 | 143 | Copyright (c) 2018 delbertbeta 144 | 145 | Permission is hereby granted, free of charge, to any person obtaining a copy 146 | of this software and associated documentation files (the "Software"), to deal 147 | in the Software without restriction, including without limitation the rights 148 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 149 | copies of the Software, and to permit persons to whom the Software is 150 | furnished to do so, subject to the following conditions: 151 | 152 | The above copyright notice and this permission notice shall be included in all 153 | copies or substantial portions of the Software. 154 | 155 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 156 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 157 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 158 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 159 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 160 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 161 | SOFTWARE. -------------------------------------------------------------------------------- /static/img/404.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/scss/_uploader.scss: -------------------------------------------------------------------------------- 1 | .uploader { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | padding-bottom: 5vh; 6 | transform-style: preserve-3d; 7 | perspective: 1000px; 8 | .container { 9 | position: relative; 10 | display: block; 11 | border-radius: 2px; 12 | box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05); 13 | height: 60vh; 14 | width: 60vw; 15 | overflow: hidden; 16 | transition: all 0.2s ease; 17 | background-color: rgba(255, 255, 255, 0.9); 18 | .nav-bar { 19 | display: flex; 20 | position: relative; 21 | height: 3rem; 22 | justify-content: space-between; 23 | ul { 24 | padding-left: 0; 25 | position: relative; 26 | display: inline-block; 27 | text-align: center; 28 | width: 50%; 29 | flex-grow: 1; 30 | margin: 0; 31 | padding: 1rem 0; 32 | font-size: 1rem; 33 | color: #6a6a6a; 34 | cursor: pointer; 35 | } 36 | .nav-visual { 37 | position: absolute; 38 | display: block; 39 | width: 50%; 40 | border-top: 2px solid #b3b3b3; 41 | top: 100%; 42 | left: 0; 43 | transition: left 0.5s ease; 44 | } 45 | } 46 | .uploader-file-container { 47 | width: 100%; 48 | height: calc(100% - 3rem); 49 | position: absolute; 50 | display: flex; 51 | flex-direction: column; 52 | justify-content: center; 53 | align-items: center; 54 | left: 0px; 55 | transition: left 0.5s ease; 56 | .upload-icon { 57 | font-size: 4rem; 58 | color: #0080db; 59 | cursor: default; 60 | } 61 | .tip-text { 62 | font-weight: 300; 63 | font-size: 1.6rem; 64 | color: #6a6a6a; 65 | margin-top: 2rem; 66 | } 67 | .tip-text-small { 68 | font-weight: 300; 69 | font-size: 0.8rem; 70 | color: #6a6a6a; 71 | margin-top: 0.5rem; 72 | } 73 | .upload-button { 74 | height: 3.6rem; 75 | width: 16rem; 76 | background-color: #0080db; 77 | border-radius: 6px; 78 | font-size: 1.2rem; 79 | color: white; 80 | display: flex; 81 | justify-content: center; 82 | align-items: center; 83 | margin-top: 1.5rem; 84 | cursor: pointer; 85 | transition: background-color 0.2s ease; 86 | } 87 | .upload-button:hover { 88 | background-color: #3e9bdd; 89 | } 90 | .download-code-wrapper { 91 | margin-top: 48px; 92 | // input, i { 93 | // vertical-align: middle; 94 | // } 95 | 96 | input { 97 | font-size: 18px; 98 | outline: none; 99 | border: none; 100 | padding-left: 6px; 101 | text-align: center; 102 | width: 160px; 103 | padding-bottom: 4px; 104 | border-bottom: 2px solid #aaaaaa; 105 | transition: border-bottom 0.2s ease; 106 | } 107 | 108 | input:focus { 109 | border-bottom: 2px solid #3e9bdd; 110 | } 111 | 112 | i { 113 | cursor: pointer; 114 | font-size: 28px; 115 | color: #6a6a6a; 116 | vertical-align: middle; 117 | } 118 | } 119 | } 120 | .uploader-text-container { 121 | width: 100%; 122 | height: calc(100% - 3rem); 123 | position: absolute; 124 | display: flex; 125 | flex-direction: column; 126 | justify-content: space-around; 127 | align-items: center; 128 | transition: left 0.5s ease; 129 | left: 100%; 130 | .input-area { 131 | height: calc(100% - 5rem); 132 | width: 100%; 133 | padding: 1rem 2rem; 134 | box-sizing: border-box; 135 | overflow-y: auto; 136 | word-wrap: break-word; 137 | word-break: break-all; 138 | } 139 | .input-area:focus { 140 | outline: none; 141 | } 142 | .input-area:empty:not(:focus):before { 143 | content: attr(placeholder); 144 | color: grey; 145 | } 146 | .upload-button { 147 | height: 3.6rem; 148 | width: 16rem; 149 | background-color: #0080db; 150 | border-radius: 6px; 151 | font-size: 1.2rem; 152 | color: white; 153 | display: flex; 154 | justify-content: center; 155 | align-items: center; 156 | cursor: pointer; 157 | margin-bottom: 1rem; 158 | transition: background-color 0.2s ease; 159 | } 160 | .upload-button:hover { 161 | background-color: #3e9bdd; 162 | } 163 | } 164 | } 165 | .container.enlarge { 166 | transform: scale(1.2); 167 | box-shadow: 0 1px 20px rgba(0, 0, 0, 0.3); 168 | .uploader-file-container { 169 | * { 170 | pointer-events: none; 171 | } 172 | } 173 | } 174 | .container.right { 175 | .nav-bar { 176 | .nav-visual { 177 | left: 50%; 178 | } 179 | } 180 | .uploader-text-container { 181 | left: 0; 182 | } 183 | .uploader-file-container { 184 | left: -100%; 185 | } 186 | } 187 | .progress-container { 188 | position: relative; 189 | display: block; 190 | border-radius: 2px; 191 | box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05); 192 | height: 60vh; 193 | width: 60vw; 194 | overflow: hidden; 195 | transition: all 0.2s ease; 196 | background-color: rgba(255, 255, 255, 0.9); 197 | .inner-container { 198 | display: flex; 199 | flex-direction: column; 200 | justify-content: center; 201 | align-items: center; 202 | height: 100%; 203 | .progress-number { 204 | font-weight: 300; 205 | font-size: 3rem; 206 | } 207 | .progress-number::after { 208 | content: '%'; 209 | } 210 | .file-size { 211 | font-weight: 300; 212 | margin-top: 0.5rem; 213 | span:first-child::after { 214 | content: '/'; 215 | } 216 | } 217 | .file-name { 218 | margin-top: 1rem; 219 | font-weight: 300; 220 | } 221 | .cancel-button { 222 | height: 3.6rem; 223 | width: 16rem; 224 | background-color: #dd3e46; 225 | border-radius: 6px; 226 | font-size: 1.2rem; 227 | color: white; 228 | display: flex; 229 | justify-content: center; 230 | align-items: center; 231 | cursor: pointer; 232 | margin-top: 2rem; 233 | transition: background-color 0.2s ease; 234 | } 235 | .cancel-button:hover { 236 | background-color: #e05b62; 237 | } 238 | } 239 | } 240 | .result-container { 241 | position: relative; 242 | display: block; 243 | height: 68vh; 244 | width: 60vw; 245 | transition: all 0.2s ease; 246 | .inner-container { 247 | display: flex; 248 | justify-content: center; 249 | align-items: center; 250 | flex-direction: column; 251 | height: 100%; 252 | .qrcode { 253 | width: 200px; // box-shadow: 0 0px 4px rgba(0, 0, 0, 0.2); 254 | transition: all 0.5s ease; 255 | } 256 | .qrcode:hover { 257 | box-shadow: 0 0px 10px rgba(0, 0, 0, 0.4); 258 | transform: scale(1.4); 259 | } 260 | .url { 261 | overflow: hidden; 262 | height: 3rem; 263 | width: 500px; 264 | border-radius: 6px; 265 | border: 1px solid #0080db; 266 | display: flex; 267 | justify-content: space-between; 268 | margin-top: 0.5rem; 269 | .url-box { 270 | display: inline-block; 271 | width: 400px; 272 | height: 100%; 273 | border: none; 274 | color: #6a6a6a; 275 | padding-left: 10px; 276 | padding-right: 10px; 277 | font-size: 1rem; 278 | font-family: sans-serif; 279 | font-weight: 300; 280 | } 281 | .copy-botton { 282 | display: inline-block; 283 | height: 100%; 284 | width: 100px; 285 | background-color: #0080db; 286 | color: white; 287 | display: flex; 288 | justify-content: center; 289 | align-items: center; 290 | cursor: pointer; 291 | transition: background-color 0.5s ease; 292 | } 293 | .copy-botton:hover { 294 | background-color: #3e9bdd; 295 | } 296 | } 297 | .function-line { 298 | font-weight: 300; 299 | line-height: 1rem; 300 | font-size: 1rem; 301 | text-align: center; 302 | margin: 1rem 0 1rem 0; 303 | } 304 | .go-back-button { 305 | height: 3.6rem; 306 | width: 16rem; 307 | background-color: #0080db; 308 | border-radius: 6px; 309 | font-size: 1.2rem; 310 | color: white; 311 | display: flex; 312 | justify-content: center; 313 | align-items: center; 314 | cursor: pointer; 315 | margin-bottom: 0.5rem; 316 | transition: background-color 0.2s ease; 317 | } 318 | .go-back-button:hover { 319 | background-color: #3e9bdd; 320 | } 321 | .delete-button { 322 | margin: 0; 323 | font-size: 0.8rem; 324 | color: #6a6a6a; 325 | cursor: pointer; 326 | } 327 | .download-code-wrapper { 328 | color: #888888; 329 | font-weight: 200; 330 | background-color: rgba(0,0,0,0.02); 331 | text-align: center; 332 | padding: 8px 44px; 333 | border-radius: 4px; 334 | border: 1px solid #aaaa; 335 | margin-top: 16px; 336 | .download-code { 337 | font-weight: 700; 338 | font-size: 26px; 339 | color: #353535; 340 | } 341 | } 342 | 343 | } 344 | } 345 | .error-container { 346 | position: relative; 347 | display: block; 348 | height: 60vh; 349 | width: 40vw; 350 | transition: all 0.2s ease; 351 | box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05); 352 | .inner-container { 353 | display: flex; 354 | justify-content: center; 355 | align-items: center; 356 | flex-direction: column; 357 | height: 100%; 358 | .error { 359 | width: 200px; 360 | height: 200px; 361 | } 362 | .tip { 363 | font-size: 18px; 364 | color: #e05b62; 365 | margin-top: 16px; 366 | margin-bottom: 64px; 367 | } 368 | .back-button { 369 | height: 3.6rem; 370 | width: 16rem; 371 | background-color: #0080db; 372 | border-radius: 6px; 373 | font-size: 1.2rem; 374 | color: white; 375 | display: flex; 376 | justify-content: center; 377 | align-items: center; 378 | cursor: pointer; 379 | margin-bottom: 0.5rem; 380 | transition: background-color 0.2s ease; 381 | } 382 | .back-button:hover { 383 | background-color: #3e9bdd; 384 | } 385 | } 386 | } 387 | } -------------------------------------------------------------------------------- /static/js/index.js: -------------------------------------------------------------------------------- 1 | function hat(bits, base) { 2 | if (!base) base = 16; 3 | if (bits === undefined) bits = 128; 4 | if (bits <= 0) return '0'; 5 | 6 | var digits = Math.log(Math.pow(2, bits)) / Math.log(base); 7 | for (var i = 2; digits === Infinity; i *= 2) { 8 | digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i; 9 | } 10 | 11 | var rem = digits - Math.floor(digits); 12 | 13 | var res = ''; 14 | 15 | for (var i = 0; i < Math.floor(digits); i++) { 16 | var x = Math.floor(Math.random() * base).toString(base); 17 | res = x + res; 18 | } 19 | 20 | if (rem) { 21 | var b = Math.pow(base, rem); 22 | var x = Math.floor(Math.random() * b).toString(base); 23 | res = x + res; 24 | } 25 | 26 | var parsed = parseInt(res, base); 27 | if (parsed !== Infinity && parsed >= Math.pow(2, bits)) { 28 | return hat(bits, base) 29 | } 30 | else return res; 31 | } 32 | 33 | (function () { 34 | const data = JSON.parse(document.getElementById('data').textContent) 35 | const uploaderContainer = document.getElementById('uploaderContainer') 36 | const fileLabel = document.getElementById('fileLabel') 37 | const textLabel = document.getElementById('textLabel') 38 | const fileUploader = document.getElementById('fileUploader') 39 | const fileUploadButton = document.getElementById('fileUploadButton') 40 | const progressContainer = document.getElementById('progressContainer') 41 | const fileName = document.getElementById('fileName') 42 | const finished = document.getElementById('finished') 43 | const total = document.getElementById('total') 44 | const cancelButton = document.getElementById('cancelButton') 45 | const progressNumber = document.getElementById('progressNumber') 46 | const resultContainer = document.getElementById('resultContainer') 47 | const qrcodeImg = document.getElementById('qrcode') 48 | const errorTip = document.getElementById('errorTip') 49 | const backButton = document.getElementById('backButton') 50 | const errorContainer = document.getElementById('errorContainer') 51 | const urlBox = document.getElementById('urlBox') 52 | const copyButton = document.getElementById('copyButton') 53 | const timesChoice = document.getElementById('timesChoice') 54 | const dayChoice = document.getElementById('dayChoice') 55 | const goBackButton = document.getElementById('goBackButton') 56 | const deleteButton = document.getElementById('deleteButton') 57 | const historyPanel = document.getElementById('historyPanel') 58 | const historyEntry = document.getElementById('historyEntry') 59 | const historyEmpty = document.getElementById('historyEmpty') 60 | const historyTable = document.getElementById('historyTable') 61 | const renewButton = document.getElementById('renewButton') 62 | const downloadCodeComfirm = document.getElementById('downloadCodeComfirm') 63 | const downloadCodeInput = document.getElementById('downloadCodeInput') 64 | const downloadCode = document.getElementById('downloadCode') 65 | 66 | const downloadLimit = [ 67 | 1, 5, 10, 20, 50, 100, 1000, null 68 | ] 69 | 70 | const timeLimit = [ 71 | [1, 'hour'], 72 | [12, 'hour'], 73 | [1, 'day'], 74 | [7, 'day'], 75 | [1, 'month'], 76 | [6, 'month'], 77 | [1, 'year'], 78 | null 79 | ] 80 | 81 | const CancelToken = axios.CancelToken; 82 | const source = CancelToken.source(); 83 | 84 | let targetUpload = {} 85 | 86 | // Read localStorage 87 | let uploads = [] 88 | 89 | let identifier = localStorage['identifier'] 90 | if (!identifier) { 91 | identifier = hat() 92 | localStorage['identifier'] = identifier 93 | } 94 | 95 | fileLabel.addEventListener('click', () => { 96 | uploaderContainer.classList.remove('right'); 97 | }) 98 | 99 | textLabel.addEventListener('click', () => { 100 | uploaderContainer.classList.add('right'); 101 | }) 102 | 103 | fileUploader.addEventListener('dragover', (event) => { 104 | event.preventDefault(); 105 | uploaderContainer.classList.add('enlarge'); 106 | event.dataTransfer.dropEffect = 'copy'; 107 | }) 108 | 109 | fileUploader.addEventListener('dragleave', (event) => { 110 | event.preventDefault(); 111 | uploaderContainer.classList.remove('enlarge'); 112 | }) 113 | 114 | fileUploader.addEventListener('drop', (event) => { 115 | event.preventDefault(); 116 | uploaderContainer.classList.remove('enlarge'); 117 | if (event.dataTransfer.files.length > 0) { 118 | fileHandle(event.dataTransfer.files[0]) 119 | } 120 | }) 121 | 122 | fileUploadButton.addEventListener('click', (event) => { 123 | const fileInput = document.createElement('input') 124 | fileInput.type = 'file' 125 | fileInput.click() 126 | fileInput.onchange = (e) => { 127 | if (fileInput.files.length > 0) { 128 | fileHandle(fileInput.files[0]) 129 | } 130 | delete fileInput 131 | } 132 | }) 133 | 134 | cancelButton.addEventListener('click', () => { 135 | source.cancel('Operation canceled by the user.'); 136 | animateStatus(progressContainer, uploaderContainer); 137 | }) 138 | 139 | urlBox.addEventListener('focus', (event) => { 140 | event.target.select(); 141 | }) 142 | 143 | let copiedTimeout = -1; 144 | copyButton.addEventListener('click', (event) => { 145 | event.target.textContent = 'Copied!'; 146 | urlBox.focus(); 147 | document.execCommand('copy'); 148 | if (copiedTimeout !== -1) { 149 | clearTimeout(copiedTimeout); 150 | } 151 | copiedTimeout = setTimeout(() => { 152 | event.target.textContent = 'Copy'; 153 | copiedTimeout = -1; 154 | }, 5000); 155 | }) 156 | 157 | dayChoice.addEventListener('click', function (event) { 158 | const options = timeLis(targetUpload.uploadTime) 159 | showSelection(event, options, (option) => { 160 | axios.put(`/api/${identifier}/${targetUpload.id}`, { 161 | timeLimit: parseInt(option.value) 162 | }).then(r => { 163 | uploads[0] = r.data 164 | refreshHistory() 165 | let resultStr = '' 166 | if (r.data.timeLimit === null) { 167 | resultStr = 'unlimited days' 168 | } else { 169 | resultStr = moment(r.data.timeLimit).format('YYYY-MM-DD HH:mm') 170 | } 171 | dayChoice.children[0].textContent = resultStr 172 | }).catch(e => { 173 | alert(e.response ? e.response.data : e) 174 | }) 175 | }) 176 | }) 177 | 178 | timesChoice.addEventListener('click', function (event) { 179 | const options = countLis(targetUpload.downloadCount) 180 | showSelection(event, options, (option) => { 181 | axios.put(`/api/${identifier}/${targetUpload.id}`, { 182 | downloadLimit: parseInt(option.value) 183 | }).then(r => { 184 | uploads[0] = r.data 185 | refreshHistory() 186 | let resultStr = '' 187 | if (r.data.downloadLimit === null) { 188 | resultStr = 'unlimited' 189 | } else { 190 | resultStr = r.data.downloadLimit 191 | } 192 | timesChoice.children[0].textContent = resultStr 193 | }).catch(e => { 194 | alert(e.response ? e.response.data : e) 195 | }) 196 | }) 197 | }) 198 | 199 | goBackButton.addEventListener('click', () => { 200 | animateStatus(resultContainer, uploaderContainer); 201 | }) 202 | 203 | backButton.addEventListener('click', () => { 204 | animateStatus(errorContainer, uploaderContainer); 205 | }) 206 | 207 | deleteButton.addEventListener('click', () => { 208 | axios.delete(`/api/${identifier}/${targetUpload.id}`).then((res) => { 209 | uploads.splice(0, 1) 210 | refreshHistory() 211 | animateStatus(resultContainer, uploaderContainer) 212 | }).catch(e => { 213 | alert(e.response ? e.response.data : e) 214 | }) 215 | }) 216 | 217 | historyEntry.addEventListener('click', () => { 218 | historyPanel.classList.add('fadeIn'); 219 | historyPanel.classList.remove('hide'); 220 | let optionMask = document.createElement('div'); 221 | optionMask.classList.add('lower-option-mask'); 222 | document.body.appendChild(optionMask); 223 | let closeOption = () => { 224 | document.body.removeChild(optionMask); 225 | historyPanel.classList.add('fadeOut'); 226 | historyPanel.classList.remove('fadeIn'); 227 | setTimeout(() => { 228 | historyPanel.classList.remove('fadeOut'); 229 | historyPanel.classList.add('hide'); 230 | }, 500) 231 | }; 232 | optionMask.addEventListener('click', closeOption) 233 | }) 234 | 235 | renewButton.addEventListener('click', () => { 236 | identifier = hat() 237 | localStorage['identifier'] = identifier 238 | uploads = [] 239 | refreshHistory() 240 | }) 241 | 242 | downloadCodeInput.addEventListener('keydown', (e) => { 243 | if (e.keyCode === 13) { 244 | navigateToUrl(downloadCodeInput.value) 245 | } 246 | }) 247 | 248 | downloadCodeComfirm.addEventListener('click', () => { 249 | navigateToUrl(downloadCodeInput.value) 250 | }) 251 | 252 | function navigateToUrl(s) { 253 | if (s.length > 0) { 254 | window.open(`${data.domain}/s/${s}`) 255 | } 256 | } 257 | 258 | function animateStatus(from, to) { 259 | from.classList.remove('hide') 260 | from.classList.remove('rotateIn') 261 | from.classList.add('rotateOut') 262 | const after = () => { 263 | from.classList.add('hide') 264 | from.classList.remove('rotateOut') 265 | to.classList.add('rotateIn') 266 | to.classList.remove('hide') 267 | from.removeEventListener('animationend', after) 268 | } 269 | from.addEventListener('animationend', after) 270 | } 271 | 272 | let animationFrame = 0 273 | 274 | function updateProgress(from, to, timeout) { 275 | let startTime = -1; 276 | 277 | function callback(timestamp) { 278 | if (startTime === -1) { 279 | startTime = timestamp; 280 | } 281 | let progress = timestamp - startTime; 282 | // let display = (from + (to - from) * ((Math.sin((progress) * Math.PI - Math.PI / 2) + 1) / 2)).toFixed(0); 283 | let display = (to - from) * (-Math.pow(2, -10 * progress / timeout) + 1) * 1024 / 1023 + from; 284 | display = display.toFixed(0); 285 | // console.log(display); 286 | progressNumber.textContent = display; 287 | if (progress < timeout) { 288 | animationFrame = requestAnimationFrame(callback); 289 | } 290 | } 291 | animationFrame = requestAnimationFrame(callback); 292 | } 293 | 294 | function cancelProgress() { 295 | cancelAnimationFrame(animationFrame) 296 | } 297 | 298 | function countLis(count) { 299 | let res = '' 300 | downloadLimit.forEach((v, i) => { 301 | if (v !== null && v > count) { 302 | res += `
  • ${v}
  • ` 303 | } else if (v === null) { 304 | res += `
  • unlimited
  • ` 305 | } 306 | }) 307 | return res 308 | } 309 | 310 | function timeLis(date) { 311 | const now = moment() 312 | const boundary = moment(date) 313 | let res = '' 314 | timeLimit.forEach((v, i) => { 315 | if (v !== null && now.isBefore(boundary.add(...v))) { 316 | res += `
  • ${v.join(' ')}
  • ` 317 | } else if (v === null) { 318 | res += `
  • unlimited
  • ` 319 | } 320 | }) 321 | return res 322 | } 323 | 324 | function showSelection(event, option, callback) { 325 | let optionDom = document.createElement('ul'); 326 | optionDom.style.overflowY = 'auto' 327 | optionDom.style.maxHeight = '100vh' 328 | optionDom.classList.add('options'); 329 | optionDom.classList.add('fadeIn'); 330 | optionDom.innerHTML = option; 331 | optionDom.style.left = event.clientX - 75 + 'px'; 332 | optionDom.style.top = event.clientY / 4 + 'px'; 333 | let optionMask = document.createElement('div'); 334 | optionMask.classList.add('higher-option-mask'); 335 | document.body.appendChild(optionMask); 336 | let closeOption = () => { 337 | document.body.removeChild(optionMask); 338 | optionDom.classList.add('fadeOut'); 339 | setTimeout(() => { 340 | document.body.removeChild(optionDom); 341 | }, 500) 342 | }; 343 | optionMask.addEventListener('click', closeOption) 344 | document.body.appendChild(optionDom); 345 | optionDom.addEventListener('click', (event) => { 346 | event.preventDefault(); 347 | event.stopPropagation(); 348 | callback({ 349 | value: event.target.attributes['data-index'].value, 350 | index: Array.prototype.indexOf.call(optionDom.children, event.target) 351 | }); 352 | closeOption(); 353 | }) 354 | } 355 | 356 | function changeError(from, msg) { 357 | errorTip.textContent = msg 358 | animateStatus(from, errorContainer) 359 | } 360 | 361 | function findTargetIndex(node) { 362 | while (!node.hasAttribute('data-index')) { 363 | node = node.parentNode 364 | } 365 | return parseInt(node.attributes['data-index'].value) 366 | } 367 | 368 | function listDayChange(event) { 369 | const index = findTargetIndex(event.target) 370 | const target = uploads[index] 371 | const options = timeLis(target.uploadTime) 372 | showSelection(event, options, (option) => { 373 | axios.put(`/api/${identifier}/${target.id}`, { 374 | timeLimit: parseInt(option.value) 375 | }).then(r => { 376 | uploads[index] = r.data 377 | refreshHistory() 378 | }).catch(e => { 379 | alert(e.response ? e.response.data : e) 380 | }) 381 | }) 382 | } 383 | 384 | function listTimesChange(event) { 385 | const index = findTargetIndex(event.target) 386 | const target = uploads[index] 387 | const options = countLis(target.downloadCount) 388 | showSelection(event, options, (option) => { 389 | axios.put(`/api/${identifier}/${target.id}`, { 390 | downloadLimit: parseInt(option.value) 391 | }).then(r => { 392 | uploads[index] = r.data 393 | refreshHistory() 394 | }).catch(e => { 395 | alert(e.response ? e.response.data : e) 396 | }) 397 | }) 398 | } 399 | 400 | function listDelete(event) { 401 | const index = findTargetIndex(event.target) 402 | const target = uploads[index] 403 | axios.delete(`/api/${identifier}/${target.id}`).then(r => { 404 | uploads.splice(index, 1) 405 | if (index === 0 && !resultContainer.classList.contains('hide')) { 406 | animateStatus(resultContainer, uploaderContainer) 407 | } 408 | refreshHistory() 409 | }).catch(e => { 410 | alert(e.response ? e.response.data : e) 411 | }) 412 | } 413 | 414 | function fileHandle(file) { 415 | progressNumber.textContent = '0' 416 | if (file.size > data.maxFileSize) { 417 | changeError(uploaderContainer, 'File is larger than limit (' + data.prettiedMaxFileSize + ').') 418 | } else { 419 | animateStatus(uploaderContainer, progressContainer) 420 | const formData = new FormData() 421 | formData.append('file', file) 422 | formData.append('identifier', identifier) 423 | 424 | fileName.textContent = file.name 425 | total.textContent = filesize(file.size) 426 | finished.textContent = filesize(0) 427 | 428 | let progress = 0 429 | let origin = 0 430 | let interval = setInterval(() => { 431 | let tempProgress = Math.round(progress / file.size * 100) 432 | updateProgress(origin, tempProgress, 800) 433 | finished.textContent = filesize(progress) 434 | origin = tempProgress 435 | }, 1000) 436 | axios({ 437 | url: '/api/upload', 438 | method: 'post', 439 | data: formData, 440 | onUploadProgress: (e) => { 441 | progress = e.loaded 442 | }, 443 | cancelToken: source.token 444 | }).then(r => { 445 | clearInterval(interval) 446 | cancelProgress() 447 | finished.textContent = filesize(file.size) 448 | updateProgress(origin, 100, 800) 449 | showResult(r.data) 450 | uploads.splice(0, 0, r.data) 451 | targetUpload = r.data 452 | dayChoice.children[0].textContent = moment(r.data.timeLimit).format('YYYY-MM-DD HH:mm') 453 | refreshHistory() 454 | setTimeout(() => { 455 | animateStatus(progressContainer, resultContainer) 456 | }, 1000) 457 | }).catch(e => { 458 | clearInterval(interval) 459 | if (axios.isCancel(e)) { 460 | console.log('Request canceled', e.message); 461 | } else { 462 | setTimeout(() => { 463 | changeError(progressContainer, 'Network Error.') 464 | }, 1000) 465 | } 466 | }) 467 | } 468 | } 469 | 470 | function showResult(res) { 471 | const url = `${data.domain}/s/${res.downloadCode}` 472 | urlBox.value = url 473 | downloadCode.textContent = res.downloadCode 474 | const qr = qrcode(0, 'L') 475 | qr.addData(url) 476 | qr.make() 477 | qrcodeImg.src = qr.createDataURL(10, 20) 478 | } 479 | 480 | function refreshHistory() { 481 | if (uploads.length === 0) { 482 | historyEmpty.classList.remove('hide') 483 | renewButton.classList.add('hide') 484 | } else { 485 | historyEmpty.classList.add('hide') 486 | renewButton.classList.remove('hide') 487 | } 488 | // const arrow = document.createElement('svg') 489 | // arrow.setAttribute('height', '16') 490 | // arrow.setAttribute('width', '16') 491 | // arrow.innerHTML = '' 492 | 493 | while (historyTable.children.length > 1) { 494 | // debugger; 495 | historyTable.removeChild(historyTable.lastChild) 496 | } 497 | 498 | const trs = [] 499 | 500 | uploads.forEach((v, i) => { 501 | const tr = document.createElement('tr') 502 | tr.innerHTML = ` 503 | ${v.fileName} 504 | ${v.downloadCount}/${v.downloadLimit === null ? 'unlimited' : v.downloadLimit} 505 | ${moment(v.uploadTime).format('YYYY-MM-DD HH:mm')}/${v.timeLimit === null ? 'unlimited' : moment(v.timeLimit).format('YYYY-MM-DD HH:mm')} 506 | close 507 | ` 508 | let choices = tr.getElementsByClassName('choices') 509 | choices[0].addEventListener('click', listTimesChange) 510 | choices[1].addEventListener('click', listDayChange) 511 | tr.getElementsByClassName('material-icons')[0].addEventListener('click', listDelete) 512 | trs.push(tr) 513 | }) 514 | 515 | historyTable.append(...trs) 516 | } 517 | 518 | axios.get(`/api/${identifier}`).then(res => { 519 | uploads = res.data 520 | refreshHistory() 521 | }) 522 | })() -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/events@*": 6 | version "1.2.0" 7 | resolved "http://registry.npm.taobao.org/@types/events/download/@types/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" 8 | integrity sha1-gaZzHOTfQ2GeXIyUU4Oz5iqJ6oY= 9 | 10 | "@types/formidable@^1.0.31": 11 | version "1.0.31" 12 | resolved "http://registry.npm.taobao.org/@types/formidable/download/@types/formidable-1.0.31.tgz#274f9dc2d0a1a9ce1feef48c24ca0859e7ec947b" 13 | integrity sha1-J0+dwtChqc4f7vSMJMoIWefslHs= 14 | dependencies: 15 | "@types/events" "*" 16 | "@types/node" "*" 17 | 18 | "@types/geojson@^1.0.0": 19 | version "1.0.6" 20 | resolved "http://registry.npm.taobao.org/@types/geojson/download/@types/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" 21 | integrity sha1-PgKXJyjGkkjCrwjWCkjLuGgP/98= 22 | 23 | "@types/node@*": 24 | version "10.12.3" 25 | resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-10.12.3.tgz#3918b73ceed484e58367be5acb79d1775239e393" 26 | integrity sha1-ORi3PO7UhOWDZ75ay3nRd1I545M= 27 | 28 | "@types/node@^10.11.7": 29 | version "10.12.6" 30 | resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-10.12.6.tgz#7fc213c1b811c90fc9a3edb6206742b95d697678" 31 | integrity sha1-f8ITwbgRyQ/Jo+22IGdCuV1pdng= 32 | 33 | "@types/semver@^5.5.0": 34 | version "5.5.0" 35 | resolved "http://registry.npm.taobao.org/@types/semver/download/@types/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" 36 | integrity sha1-FGwqKe59O65L8vyydGNuJkyBPEU= 37 | 38 | abbrev@1: 39 | version "1.1.1" 40 | resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 41 | integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= 42 | 43 | accepts@^1.3.5: 44 | version "1.3.5" 45 | resolved "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 46 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 47 | dependencies: 48 | mime-types "~2.1.18" 49 | negotiator "0.6.1" 50 | 51 | ajv@^6.5.5: 52 | version "6.5.5" 53 | resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" 54 | integrity sha1-z5fNreccY5mpLG1sQXc4EpG3gaE= 55 | dependencies: 56 | fast-deep-equal "^2.0.1" 57 | fast-json-stable-stringify "^2.0.0" 58 | json-schema-traverse "^0.4.1" 59 | uri-js "^4.2.2" 60 | 61 | amdefine@>=0.0.4: 62 | version "1.0.1" 63 | resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 64 | integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= 65 | 66 | ansi-regex@^2.0.0: 67 | version "2.1.1" 68 | resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 69 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 70 | 71 | ansi-regex@^3.0.0: 72 | version "3.0.0" 73 | resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 74 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 75 | 76 | ansi-styles@^2.2.1: 77 | version "2.2.1" 78 | resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 79 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 80 | 81 | any-promise@^1.0.0, any-promise@^1.1.0: 82 | version "1.3.0" 83 | resolved "http://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 84 | integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= 85 | 86 | append-field@^0.1.0: 87 | version "0.1.0" 88 | resolved "http://registry.npm.taobao.org/append-field/download/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" 89 | integrity sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo= 90 | 91 | aproba@^1.0.3: 92 | version "1.2.0" 93 | resolved "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 94 | integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= 95 | 96 | are-we-there-yet@~1.1.2: 97 | version "1.1.5" 98 | resolved "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 99 | integrity sha1-SzXClE8GKov82mZBB2A1D+nd/CE= 100 | dependencies: 101 | delegates "^1.0.0" 102 | readable-stream "^2.0.6" 103 | 104 | array-find-index@^1.0.1: 105 | version "1.0.2" 106 | resolved "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 107 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 108 | 109 | asn1@~0.2.3: 110 | version "0.2.4" 111 | resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 112 | integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= 113 | dependencies: 114 | safer-buffer "~2.1.0" 115 | 116 | assert-plus@1.0.0, assert-plus@^1.0.0: 117 | version "1.0.0" 118 | resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 119 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 120 | 121 | async-foreach@^0.1.3: 122 | version "0.1.3" 123 | resolved "http://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" 124 | integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= 125 | 126 | asynckit@^0.4.0: 127 | version "0.4.0" 128 | resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 129 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 130 | 131 | aws-sign2@~0.7.0: 132 | version "0.7.0" 133 | resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 134 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 135 | 136 | aws4@^1.8.0: 137 | version "1.8.0" 138 | resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 139 | integrity sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8= 140 | 141 | balanced-match@^1.0.0: 142 | version "1.0.0" 143 | resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 144 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 145 | 146 | bcrypt-pbkdf@^1.0.0: 147 | version "1.0.2" 148 | resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 149 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 150 | dependencies: 151 | tweetnacl "^0.14.3" 152 | 153 | block-stream@*: 154 | version "0.0.9" 155 | resolved "http://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 156 | integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= 157 | dependencies: 158 | inherits "~2.0.0" 159 | 160 | bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.0: 161 | version "3.5.3" 162 | resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" 163 | integrity sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c= 164 | 165 | brace-expansion@^1.1.7: 166 | version "1.1.11" 167 | resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 168 | integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= 169 | dependencies: 170 | balanced-match "^1.0.0" 171 | concat-map "0.0.1" 172 | 173 | buffer-from@^1.0.0: 174 | version "1.1.1" 175 | resolved "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 176 | integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8= 177 | 178 | builtin-modules@^1.0.0: 179 | version "1.1.1" 180 | resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 181 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 182 | 183 | busboy@^0.2.11: 184 | version "0.2.14" 185 | resolved "http://registry.npm.taobao.org/busboy/download/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" 186 | integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= 187 | dependencies: 188 | dicer "0.2.5" 189 | readable-stream "1.1.x" 190 | 191 | bytes@3.0.0: 192 | version "3.0.0" 193 | resolved "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 194 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 195 | 196 | cache-content-type@^1.0.0: 197 | version "1.0.1" 198 | resolved "http://registry.npm.taobao.org/cache-content-type/download/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" 199 | integrity sha1-A1zeKwjuISn0qDFeqPAKANuhRTw= 200 | dependencies: 201 | mime-types "^2.1.18" 202 | ylru "^1.2.0" 203 | 204 | camelcase-keys@^2.0.0: 205 | version "2.1.0" 206 | resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 207 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 208 | dependencies: 209 | camelcase "^2.0.0" 210 | map-obj "^1.0.0" 211 | 212 | camelcase@^2.0.0: 213 | version "2.1.1" 214 | resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 215 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 216 | 217 | camelcase@^3.0.0: 218 | version "3.0.0" 219 | resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 220 | integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= 221 | 222 | caseless@~0.12.0: 223 | version "0.12.0" 224 | resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 225 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 226 | 227 | chalk@^1.1.1: 228 | version "1.1.3" 229 | resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 230 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 231 | dependencies: 232 | ansi-styles "^2.2.1" 233 | escape-string-regexp "^1.0.2" 234 | has-ansi "^2.0.0" 235 | strip-ansi "^3.0.0" 236 | supports-color "^2.0.0" 237 | 238 | chownr@^1.1.1: 239 | version "1.1.1" 240 | resolved "http://registry.npm.taobao.org/chownr/download/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 241 | integrity sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ= 242 | 243 | circular-json@^0.5.5: 244 | version "0.5.9" 245 | resolved "http://registry.npm.taobao.org/circular-json/download/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" 246 | integrity sha1-kydjroj0996teg0JyKUaR0OlOx0= 247 | 248 | cliui@^3.2.0: 249 | version "3.2.0" 250 | resolved "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 251 | integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= 252 | dependencies: 253 | string-width "^1.0.1" 254 | strip-ansi "^3.0.1" 255 | wrap-ansi "^2.0.0" 256 | 257 | cls-bluebird@^2.1.0: 258 | version "2.1.0" 259 | resolved "http://registry.npm.taobao.org/cls-bluebird/download/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" 260 | integrity sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4= 261 | dependencies: 262 | is-bluebird "^1.0.2" 263 | shimmer "^1.1.0" 264 | 265 | co-body@^5.1.1: 266 | version "5.2.0" 267 | resolved "http://registry.npm.taobao.org/co-body/download/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" 268 | integrity sha1-WgpljEYCkTHg46MG9nZHMC9xwSQ= 269 | dependencies: 270 | inflation "^2.0.0" 271 | qs "^6.4.0" 272 | raw-body "^2.2.0" 273 | type-is "^1.6.14" 274 | 275 | co@^4.6.0: 276 | version "4.6.0" 277 | resolved "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 278 | integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 279 | 280 | code-point-at@^1.0.0: 281 | version "1.1.0" 282 | resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 283 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 284 | 285 | combined-stream@^1.0.6, combined-stream@~1.0.6: 286 | version "1.0.7" 287 | resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 288 | integrity sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg= 289 | dependencies: 290 | delayed-stream "~1.0.0" 291 | 292 | commander@^2.19.0: 293 | version "2.19.0" 294 | resolved "http://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 295 | integrity sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So= 296 | 297 | concat-map@0.0.1: 298 | version "0.0.1" 299 | resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 300 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 301 | 302 | concat-stream@^1.5.0: 303 | version "1.6.2" 304 | resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 305 | integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= 306 | dependencies: 307 | buffer-from "^1.0.0" 308 | inherits "^2.0.3" 309 | readable-stream "^2.2.2" 310 | typedarray "^0.0.6" 311 | 312 | condense-newlines@^0.2.1: 313 | version "0.2.1" 314 | resolved "http://registry.npm.taobao.org/condense-newlines/download/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" 315 | integrity sha1-PemFVTE5R10yUCyDsC9gaE0kxV8= 316 | dependencies: 317 | extend-shallow "^2.0.1" 318 | is-whitespace "^0.3.0" 319 | kind-of "^3.0.2" 320 | 321 | config-chain@~1.1.5: 322 | version "1.1.12" 323 | resolved "http://registry.npm.taobao.org/config-chain/download/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" 324 | integrity sha1-D96NCRIA616AjK8l/mGMAvSOTvo= 325 | dependencies: 326 | ini "^1.3.4" 327 | proto-list "~1.2.1" 328 | 329 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 330 | version "1.1.0" 331 | resolved "http://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 332 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 333 | 334 | consolidate@^0.15.0: 335 | version "0.15.1" 336 | resolved "http://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" 337 | integrity sha1-IasEMjXHGgfUXZqtmFk7DbpWurc= 338 | dependencies: 339 | bluebird "^3.1.1" 340 | 341 | content-disposition@~0.5.2: 342 | version "0.5.2" 343 | resolved "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 344 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 345 | 346 | content-type@^1.0.4: 347 | version "1.0.4" 348 | resolved "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 349 | integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= 350 | 351 | cookies@~0.7.1: 352 | version "0.7.3" 353 | resolved "http://registry.npm.taobao.org/cookies/download/cookies-0.7.3.tgz#7912ce21fbf2e8c2da70cf1c3f351aecf59dadfa" 354 | integrity sha1-eRLOIfvy6MLacM8cPzUa7PWdrfo= 355 | dependencies: 356 | depd "~1.1.2" 357 | keygrip "~1.0.3" 358 | 359 | core-util-is@1.0.2, core-util-is@~1.0.0: 360 | version "1.0.2" 361 | resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 362 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 363 | 364 | cross-spawn@^3.0.0: 365 | version "3.0.1" 366 | resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" 367 | integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= 368 | dependencies: 369 | lru-cache "^4.0.1" 370 | which "^1.2.9" 371 | 372 | currently-unhandled@^0.4.1: 373 | version "0.4.1" 374 | resolved "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 375 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 376 | dependencies: 377 | array-find-index "^1.0.1" 378 | 379 | dashdash@^1.12.0: 380 | version "1.14.1" 381 | resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 382 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 383 | dependencies: 384 | assert-plus "^1.0.0" 385 | 386 | date-format@^1.2.0: 387 | version "1.2.0" 388 | resolved "http://registry.npm.taobao.org/date-format/download/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" 389 | integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= 390 | 391 | debug@*: 392 | version "4.1.0" 393 | resolved "http://registry.npm.taobao.org/debug/download/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" 394 | integrity sha1-NzaHv/pnizixzZH4YbY4UANd3Ic= 395 | dependencies: 396 | ms "^2.1.1" 397 | 398 | debug@^2.1.2, debug@^2.6.0, debug@^2.6.3, debug@^2.6.9: 399 | version "2.6.9" 400 | resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 401 | integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= 402 | dependencies: 403 | ms "2.0.0" 404 | 405 | debug@^3.1.0: 406 | version "3.2.6" 407 | resolved "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 408 | integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps= 409 | dependencies: 410 | ms "^2.1.1" 411 | 412 | debug@~3.1.0: 413 | version "3.1.0" 414 | resolved "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 415 | integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE= 416 | dependencies: 417 | ms "2.0.0" 418 | 419 | decamelize@^1.1.1, decamelize@^1.1.2: 420 | version "1.2.0" 421 | resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 422 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 423 | 424 | deep-equal@~1.0.1: 425 | version "1.0.1" 426 | resolved "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 427 | integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= 428 | 429 | deep-extend@^0.6.0: 430 | version "0.6.0" 431 | resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 432 | integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= 433 | 434 | delayed-stream@~1.0.0: 435 | version "1.0.0" 436 | resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 437 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 438 | 439 | delegates@^1.0.0: 440 | version "1.0.0" 441 | resolved "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 442 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 443 | 444 | depd@^1.1.0, depd@^1.1.2, depd@~1.1.2: 445 | version "1.1.2" 446 | resolved "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 447 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 448 | 449 | destroy@^1.0.4: 450 | version "1.0.4" 451 | resolved "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 452 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 453 | 454 | detect-libc@^1.0.2: 455 | version "1.0.3" 456 | resolved "http://registry.npm.taobao.org/detect-libc/download/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 457 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 458 | 459 | dicer@0.2.5: 460 | version "0.2.5" 461 | resolved "http://registry.npm.taobao.org/dicer/download/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" 462 | integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= 463 | dependencies: 464 | readable-stream "1.1.x" 465 | streamsearch "0.1.2" 466 | 467 | diskusage@^0.2.6: 468 | version "0.2.6" 469 | resolved "http://registry.npm.taobao.org/diskusage/download/diskusage-0.2.6.tgz#1f90b5c2489359146848a0369777115b3d08b594" 470 | integrity sha1-H5C1wkiTWRRoSKA2l3cRWz0ItZQ= 471 | dependencies: 472 | nan "^2.11.1" 473 | 474 | dottie@^2.0.0: 475 | version "2.0.1" 476 | resolved "http://registry.npm.taobao.org/dottie/download/dottie-2.0.1.tgz#697ad9d72004db7574d21f892466a3c285893659" 477 | integrity sha1-aXrZ1yAE23V00h+JJGajwoWJNlk= 478 | 479 | ecc-jsbn@~0.1.1: 480 | version "0.1.2" 481 | resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 482 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 483 | dependencies: 484 | jsbn "~0.1.0" 485 | safer-buffer "^2.1.0" 486 | 487 | editorconfig@^0.15.0: 488 | version "0.15.2" 489 | resolved "http://registry.npm.taobao.org/editorconfig/download/editorconfig-0.15.2.tgz#047be983abb9ab3c2eefe5199cb2b7c5689f0702" 490 | integrity sha1-BHvpg6u5qzwu7+UZnLK3xWifBwI= 491 | dependencies: 492 | "@types/node" "^10.11.7" 493 | "@types/semver" "^5.5.0" 494 | commander "^2.19.0" 495 | lru-cache "^4.1.3" 496 | semver "^5.6.0" 497 | sigmund "^1.0.1" 498 | 499 | ee-first@1.1.1: 500 | version "1.1.1" 501 | resolved "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 502 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 503 | 504 | ejs@^2.6.1: 505 | version "2.6.1" 506 | resolved "http://registry.npm.taobao.org/ejs/download/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" 507 | integrity sha1-SY7A1JVlWrxvI81hho2SZGQHGqA= 508 | 509 | error-ex@^1.2.0: 510 | version "1.3.2" 511 | resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 512 | integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= 513 | dependencies: 514 | is-arrayish "^0.2.1" 515 | 516 | error-inject@^1.0.0: 517 | version "1.0.0" 518 | resolved "http://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 519 | integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= 520 | 521 | escape-html@^1.0.3: 522 | version "1.0.3" 523 | resolved "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 524 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 525 | 526 | escape-string-regexp@^1.0.2: 527 | version "1.0.5" 528 | resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 529 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 530 | 531 | extend-shallow@^2.0.1: 532 | version "2.0.1" 533 | resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 534 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 535 | dependencies: 536 | is-extendable "^0.1.0" 537 | 538 | extend@~3.0.2: 539 | version "3.0.2" 540 | resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 541 | integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= 542 | 543 | extsprintf@1.3.0: 544 | version "1.3.0" 545 | resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 546 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 547 | 548 | extsprintf@^1.2.0: 549 | version "1.4.0" 550 | resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 551 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 552 | 553 | fast-deep-equal@^2.0.1: 554 | version "2.0.1" 555 | resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 556 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 557 | 558 | fast-json-stable-stringify@^2.0.0: 559 | version "2.0.0" 560 | resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 561 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 562 | 563 | find-up@^1.0.0: 564 | version "1.1.2" 565 | resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 566 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 567 | dependencies: 568 | path-exists "^2.0.0" 569 | pinkie-promise "^2.0.0" 570 | 571 | forever-agent@~0.6.1: 572 | version "0.6.1" 573 | resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 574 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 575 | 576 | form-data@~2.3.2: 577 | version "2.3.3" 578 | resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 579 | integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= 580 | dependencies: 581 | asynckit "^0.4.0" 582 | combined-stream "^1.0.6" 583 | mime-types "^2.1.12" 584 | 585 | formidable@^1.1.1: 586 | version "1.2.1" 587 | resolved "http://registry.npm.taobao.org/formidable/download/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" 588 | integrity sha1-cPt8oCkO5v+WEJBBX0s989IIJlk= 589 | 590 | fresh@~0.5.2: 591 | version "0.5.2" 592 | resolved "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 593 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 594 | 595 | fs-extra@^1.0.0: 596 | version "1.0.0" 597 | resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" 598 | integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= 599 | dependencies: 600 | graceful-fs "^4.1.2" 601 | jsonfile "^2.1.0" 602 | klaw "^1.0.0" 603 | 604 | fs-extra@^4.0.2: 605 | version "4.0.3" 606 | resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" 607 | integrity sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ= 608 | dependencies: 609 | graceful-fs "^4.1.2" 610 | jsonfile "^4.0.0" 611 | universalify "^0.1.0" 612 | 613 | fs-extra@^7.0.1: 614 | version "7.0.1" 615 | resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 616 | integrity sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= 617 | dependencies: 618 | graceful-fs "^4.1.2" 619 | jsonfile "^4.0.0" 620 | universalify "^0.1.0" 621 | 622 | fs-minipass@^1.2.5: 623 | version "1.2.5" 624 | resolved "http://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 625 | integrity sha1-BsJ3IYRU7CiN93raVKA7hwKqy50= 626 | dependencies: 627 | minipass "^2.2.1" 628 | 629 | fs.realpath@^1.0.0: 630 | version "1.0.0" 631 | resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 632 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 633 | 634 | fstream@^1.0.0, fstream@^1.0.2: 635 | version "1.0.11" 636 | resolved "http://registry.npm.taobao.org/fstream/download/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 637 | integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= 638 | dependencies: 639 | graceful-fs "^4.1.2" 640 | inherits "~2.0.0" 641 | mkdirp ">=0.5 0" 642 | rimraf "2" 643 | 644 | gauge@~2.7.3: 645 | version "2.7.4" 646 | resolved "http://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 647 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 648 | dependencies: 649 | aproba "^1.0.3" 650 | console-control-strings "^1.0.0" 651 | has-unicode "^2.0.0" 652 | object-assign "^4.1.0" 653 | signal-exit "^3.0.0" 654 | string-width "^1.0.1" 655 | strip-ansi "^3.0.1" 656 | wide-align "^1.1.0" 657 | 658 | gaze@^1.0.0: 659 | version "1.1.3" 660 | resolved "http://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" 661 | integrity sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko= 662 | dependencies: 663 | globule "^1.0.0" 664 | 665 | generic-pool@^3.4.0: 666 | version "3.4.2" 667 | resolved "http://registry.npm.taobao.org/generic-pool/download/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59" 668 | integrity sha1-kv9xllINZwg5pnMICSoSqt8valk= 669 | 670 | get-caller-file@^1.0.1: 671 | version "1.0.3" 672 | resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 673 | integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= 674 | 675 | get-paths@^0.0.2: 676 | version "0.0.2" 677 | resolved "http://registry.npm.taobao.org/get-paths/download/get-paths-0.0.2.tgz#a9c27b1a8d006c931a4f26fcf7d1546e3ad71bea" 678 | integrity sha1-qcJ7Go0AbJMaTyb899FUbjrXG+o= 679 | dependencies: 680 | fs-extra "^4.0.2" 681 | 682 | get-stdin@^4.0.1: 683 | version "4.0.1" 684 | resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 685 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 686 | 687 | getpass@^0.1.1: 688 | version "0.1.7" 689 | resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 690 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 691 | dependencies: 692 | assert-plus "^1.0.0" 693 | 694 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: 695 | version "7.1.3" 696 | resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 697 | integrity sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE= 698 | dependencies: 699 | fs.realpath "^1.0.0" 700 | inflight "^1.0.4" 701 | inherits "2" 702 | minimatch "^3.0.4" 703 | once "^1.3.0" 704 | path-is-absolute "^1.0.0" 705 | 706 | globule@^1.0.0: 707 | version "1.2.1" 708 | resolved "http://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" 709 | integrity sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0= 710 | dependencies: 711 | glob "~7.1.1" 712 | lodash "~4.17.10" 713 | minimatch "~3.0.2" 714 | 715 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: 716 | version "4.1.15" 717 | resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 718 | integrity sha1-/7cD4QZuig7qpMi4C6klPu77+wA= 719 | 720 | har-schema@^2.0.0: 721 | version "2.0.0" 722 | resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 723 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 724 | 725 | har-validator@~5.1.0: 726 | version "5.1.2" 727 | resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.2.tgz#a3891924f815c88e41c7f31112079cfef5e129e5" 728 | integrity sha1-o4kZJPgVyI5Bx/MREgec/vXhKeU= 729 | dependencies: 730 | ajv "^6.5.5" 731 | har-schema "^2.0.0" 732 | 733 | has-ansi@^2.0.0: 734 | version "2.0.0" 735 | resolved "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 736 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 737 | dependencies: 738 | ansi-regex "^2.0.0" 739 | 740 | has-unicode@^2.0.0: 741 | version "2.0.1" 742 | resolved "http://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 743 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 744 | 745 | hat@^0.0.3: 746 | version "0.0.3" 747 | resolved "http://registry.npm.taobao.org/hat/download/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a" 748 | integrity sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo= 749 | 750 | hosted-git-info@^2.1.4: 751 | version "2.7.1" 752 | resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 753 | integrity sha1-l/I2l3vW4SVAiTD/bePuxigewEc= 754 | 755 | http-assert@^1.3.0: 756 | version "1.4.0" 757 | resolved "http://registry.npm.taobao.org/http-assert/download/http-assert-1.4.0.tgz#0e550b4fca6adf121bbeed83248c17e62f593a9a" 758 | integrity sha1-DlULT8pq3xIbvu2DJIwX5i9ZOpo= 759 | dependencies: 760 | deep-equal "~1.0.1" 761 | http-errors "~1.7.1" 762 | 763 | http-errors@1.6.3, http-errors@~1.6.2: 764 | version "1.6.3" 765 | resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 766 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 767 | dependencies: 768 | depd "~1.1.2" 769 | inherits "2.0.3" 770 | setprototypeof "1.1.0" 771 | statuses ">= 1.4.0 < 2" 772 | 773 | http-errors@^1.3.1, http-errors@^1.6.1, http-errors@^1.6.3, http-errors@~1.7.1: 774 | version "1.7.1" 775 | resolved "http://registry.npm.taobao.org/http-errors/download/http-errors-1.7.1.tgz#6a4ffe5d35188e1c39f872534690585852e1f027" 776 | integrity sha1-ak/+XTUYjhw5+HJTRpBYWFLh8Cc= 777 | dependencies: 778 | depd "~1.1.2" 779 | inherits "2.0.3" 780 | setprototypeof "1.1.0" 781 | statuses ">= 1.5.0 < 2" 782 | toidentifier "1.0.0" 783 | 784 | http-signature@~1.2.0: 785 | version "1.2.0" 786 | resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 787 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 788 | dependencies: 789 | assert-plus "^1.0.0" 790 | jsprim "^1.2.2" 791 | sshpk "^1.7.0" 792 | 793 | iconv-lite@0.4.23: 794 | version "0.4.23" 795 | resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 796 | integrity sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM= 797 | dependencies: 798 | safer-buffer ">= 2.1.2 < 3" 799 | 800 | iconv-lite@^0.4.4: 801 | version "0.4.24" 802 | resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 803 | integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= 804 | dependencies: 805 | safer-buffer ">= 2.1.2 < 3" 806 | 807 | ignore-walk@^3.0.1: 808 | version "3.0.1" 809 | resolved "http://registry.npm.taobao.org/ignore-walk/download/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 810 | integrity sha1-qD5i59JyrA47VRqqgoMaGbafgvg= 811 | dependencies: 812 | minimatch "^3.0.4" 813 | 814 | in-publish@^2.0.0: 815 | version "2.0.0" 816 | resolved "http://registry.npm.taobao.org/in-publish/download/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" 817 | integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= 818 | 819 | indent-string@^2.1.0: 820 | version "2.1.0" 821 | resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 822 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 823 | dependencies: 824 | repeating "^2.0.0" 825 | 826 | inflation@^2.0.0: 827 | version "2.0.0" 828 | resolved "http://registry.npm.taobao.org/inflation/download/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" 829 | integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= 830 | 831 | inflection@1.12.0: 832 | version "1.12.0" 833 | resolved "http://registry.npm.taobao.org/inflection/download/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" 834 | integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= 835 | 836 | inflight@^1.0.4: 837 | version "1.0.6" 838 | resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 839 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 840 | dependencies: 841 | once "^1.3.0" 842 | wrappy "1" 843 | 844 | inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: 845 | version "2.0.3" 846 | resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 847 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 848 | 849 | ini@^1.3.4, ini@~1.3.0: 850 | version "1.3.5" 851 | resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 852 | integrity sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc= 853 | 854 | invert-kv@^1.0.0: 855 | version "1.0.0" 856 | resolved "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 857 | integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= 858 | 859 | is-arrayish@^0.2.1: 860 | version "0.2.1" 861 | resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 862 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 863 | 864 | is-bluebird@^1.0.2: 865 | version "1.0.2" 866 | resolved "http://registry.npm.taobao.org/is-bluebird/download/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" 867 | integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI= 868 | 869 | is-buffer@^1.1.5: 870 | version "1.1.6" 871 | resolved "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 872 | integrity sha1-76ouqdqg16suoTqXsritUf776L4= 873 | 874 | is-builtin-module@^1.0.0: 875 | version "1.0.0" 876 | resolved "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 877 | integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= 878 | dependencies: 879 | builtin-modules "^1.0.0" 880 | 881 | is-extendable@^0.1.0: 882 | version "0.1.1" 883 | resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 884 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 885 | 886 | is-finite@^1.0.0: 887 | version "1.0.2" 888 | resolved "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 889 | integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= 890 | dependencies: 891 | number-is-nan "^1.0.0" 892 | 893 | is-fullwidth-code-point@^1.0.0: 894 | version "1.0.0" 895 | resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 896 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 897 | dependencies: 898 | number-is-nan "^1.0.0" 899 | 900 | is-fullwidth-code-point@^2.0.0: 901 | version "2.0.0" 902 | resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 903 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 904 | 905 | is-generator-function@^1.0.7: 906 | version "1.0.7" 907 | resolved "http://registry.npm.taobao.org/is-generator-function/download/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" 908 | integrity sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI= 909 | 910 | is-typedarray@~1.0.0: 911 | version "1.0.0" 912 | resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 913 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 914 | 915 | is-utf8@^0.2.0: 916 | version "0.2.1" 917 | resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 918 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 919 | 920 | is-whitespace@^0.3.0: 921 | version "0.3.0" 922 | resolved "http://registry.npm.taobao.org/is-whitespace/download/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" 923 | integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38= 924 | 925 | isarray@0.0.1: 926 | version "0.0.1" 927 | resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 928 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 929 | 930 | isarray@~1.0.0: 931 | version "1.0.0" 932 | resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 933 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 934 | 935 | isexe@^2.0.0: 936 | version "2.0.0" 937 | resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 938 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 939 | 940 | isstream@~0.1.2: 941 | version "0.1.2" 942 | resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 943 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 944 | 945 | js-base64@^2.1.8: 946 | version "2.4.9" 947 | resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" 948 | integrity sha1-dIkR+wT0imDEdxs3XKxFqA3xHAM= 949 | 950 | js-beautify@^1.6.12: 951 | version "1.8.8" 952 | resolved "http://registry.npm.taobao.org/js-beautify/download/js-beautify-1.8.8.tgz#1eb175b73a3571a5f1ed8d98e7cf2b05bfa98471" 953 | integrity sha1-HrF1tzo1caXx7Y2Y588rBb+phHE= 954 | dependencies: 955 | config-chain "~1.1.5" 956 | editorconfig "^0.15.0" 957 | mkdirp "~0.5.0" 958 | nopt "~4.0.1" 959 | 960 | jsbn@~0.1.0: 961 | version "0.1.1" 962 | resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 963 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 964 | 965 | json-schema-traverse@^0.4.1: 966 | version "0.4.1" 967 | resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 968 | integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= 969 | 970 | json-schema@0.2.3: 971 | version "0.2.3" 972 | resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 973 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 974 | 975 | json-stringify-safe@~5.0.1: 976 | version "5.0.1" 977 | resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 978 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 979 | 980 | jsonfile@^2.1.0: 981 | version "2.4.0" 982 | resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 983 | integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= 984 | optionalDependencies: 985 | graceful-fs "^4.1.6" 986 | 987 | jsonfile@^4.0.0: 988 | version "4.0.0" 989 | resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 990 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 991 | optionalDependencies: 992 | graceful-fs "^4.1.6" 993 | 994 | jsprim@^1.2.2: 995 | version "1.4.1" 996 | resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 997 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 998 | dependencies: 999 | assert-plus "1.0.0" 1000 | extsprintf "1.3.0" 1001 | json-schema "0.2.3" 1002 | verror "1.10.0" 1003 | 1004 | keygrip@~1.0.3: 1005 | version "1.0.3" 1006 | resolved "http://registry.npm.taobao.org/keygrip/download/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc" 1007 | integrity sha1-OZ1wnwrtK6sKBZ4M3TpQI6BT4dw= 1008 | 1009 | kind-of@5.0.2: 1010 | version "5.0.2" 1011 | resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-5.0.2.tgz#f57bec933d9a2209ffa96c5c08343607b7035fda" 1012 | integrity sha1-9Xvskz2aIgn/qWxcCDQ2B7cDX9o= 1013 | 1014 | kind-of@^3.0.2: 1015 | version "3.2.2" 1016 | resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1017 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1018 | dependencies: 1019 | is-buffer "^1.1.5" 1020 | 1021 | klaw@^1.0.0: 1022 | version "1.3.1" 1023 | resolved "http://registry.npm.taobao.org/klaw/download/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 1024 | integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= 1025 | optionalDependencies: 1026 | graceful-fs "^4.1.9" 1027 | 1028 | koa-better-serve@^2.0.7: 1029 | version "2.0.7" 1030 | resolved "http://registry.npm.taobao.org/koa-better-serve/download/koa-better-serve-2.0.7.tgz#29002a4f39fc973d1a03bdfc898236f47d97169c" 1031 | integrity sha1-KQAqTzn8lz0aA738iYI29H2XFpw= 1032 | dependencies: 1033 | kind-of "5.0.2" 1034 | koa-send "4.1.1" 1035 | 1036 | koa-body@^4.0.4: 1037 | version "4.0.4" 1038 | resolved "http://registry.npm.taobao.org/koa-body/download/koa-body-4.0.4.tgz#70c04ba21b37f230476c280a41858dc37ca838ee" 1039 | integrity sha1-cMBLohs38jBHbCgKQYWNw3yoOO4= 1040 | dependencies: 1041 | "@types/formidable" "^1.0.31" 1042 | co-body "^5.1.1" 1043 | formidable "^1.1.1" 1044 | 1045 | koa-compose@^3.0.0: 1046 | version "3.2.1" 1047 | resolved "http://registry.npm.taobao.org/koa-compose/download/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 1048 | integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= 1049 | dependencies: 1050 | any-promise "^1.1.0" 1051 | 1052 | koa-compose@^4.1.0: 1053 | version "4.1.0" 1054 | resolved "http://registry.npm.taobao.org/koa-compose/download/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 1055 | integrity sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc= 1056 | 1057 | koa-convert@^1.2.0: 1058 | version "1.2.0" 1059 | resolved "http://registry.npm.taobao.org/koa-convert/download/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 1060 | integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= 1061 | dependencies: 1062 | co "^4.6.0" 1063 | koa-compose "^3.0.0" 1064 | 1065 | koa-is-json@^1.0.0: 1066 | version "1.0.0" 1067 | resolved "http://registry.npm.taobao.org/koa-is-json/download/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" 1068 | integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= 1069 | 1070 | koa-mount@^2.0.0: 1071 | version "2.0.0" 1072 | resolved "http://registry.npm.taobao.org/koa-mount/download/koa-mount-2.0.0.tgz#728b7d01ab23e7e58dc588e52fc554d67ee981db" 1073 | integrity sha1-cot9Aasj5+WNxYjlL8VU1n7pgds= 1074 | dependencies: 1075 | debug "*" 1076 | koa-compose "^3.0.0" 1077 | 1078 | koa-multer@^1.0.2: 1079 | version "1.0.2" 1080 | resolved "http://registry.npm.taobao.org/koa-multer/download/koa-multer-1.0.2.tgz#d38f7ffd1db97b1aad33e7774732f000ebd67259" 1081 | integrity sha1-049//R25exqtM+d3RzLwAOvWclk= 1082 | dependencies: 1083 | multer "1.3.0" 1084 | 1085 | koa-router@^7.4.0: 1086 | version "7.4.0" 1087 | resolved "http://registry.npm.taobao.org/koa-router/download/koa-router-7.4.0.tgz#aee1f7adc02d5cb31d7d67465c9eacc825e8c5e0" 1088 | integrity sha1-ruH3rcAtXLMdfWdGXJ6syCXoxeA= 1089 | dependencies: 1090 | debug "^3.1.0" 1091 | http-errors "^1.3.1" 1092 | koa-compose "^3.0.0" 1093 | methods "^1.0.1" 1094 | path-to-regexp "^1.1.1" 1095 | urijs "^1.19.0" 1096 | 1097 | koa-send@4.1.1: 1098 | version "4.1.1" 1099 | resolved "http://registry.npm.taobao.org/koa-send/download/koa-send-4.1.1.tgz#bd3fa116b1f592f5fff23c9670aae69787f6cb57" 1100 | integrity sha1-vT+hFrH1kvX/8jyWcKrml4f2y1c= 1101 | dependencies: 1102 | debug "^2.6.3" 1103 | http-errors "^1.6.1" 1104 | mz "^2.6.0" 1105 | resolve-path "^1.3.3" 1106 | 1107 | koa-send@^3.2.0: 1108 | version "3.3.0" 1109 | resolved "http://registry.npm.taobao.org/koa-send/download/koa-send-3.3.0.tgz#5a4ae245564680c6ecf6079e9275fa5173a861dc" 1110 | integrity sha1-WkriRVZGgMbs9geeknX6UXOoYdw= 1111 | dependencies: 1112 | co "^4.6.0" 1113 | debug "^2.6.0" 1114 | mz "^2.3.1" 1115 | resolve-path "^1.3.1" 1116 | 1117 | koa-send@^4.0.0: 1118 | version "4.1.3" 1119 | resolved "http://registry.npm.taobao.org/koa-send/download/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6" 1120 | integrity sha1-CCIge79SU6QUyPF2Xrwp+kE1PLY= 1121 | dependencies: 1122 | debug "^2.6.3" 1123 | http-errors "^1.6.1" 1124 | mz "^2.6.0" 1125 | resolve-path "^1.4.0" 1126 | 1127 | koa-send@^5.0.0: 1128 | version "5.0.0" 1129 | resolved "http://registry.npm.taobao.org/koa-send/download/koa-send-5.0.0.tgz#5e8441e07ef55737734d7ced25b842e50646e7eb" 1130 | integrity sha1-XoRB4H71VzdzTXztJbhC5QZG5+s= 1131 | dependencies: 1132 | debug "^3.1.0" 1133 | http-errors "^1.6.3" 1134 | mz "^2.7.0" 1135 | resolve-path "^1.4.0" 1136 | 1137 | koa-static@^3.0.0: 1138 | version "3.0.0" 1139 | resolved "http://registry.npm.taobao.org/koa-static/download/koa-static-3.0.0.tgz#40442233d2c0b35c225e450199c10bf8a539e416" 1140 | integrity sha1-QEQiM9LAs1wiXkUBmcEL+KU55BY= 1141 | dependencies: 1142 | debug "*" 1143 | koa-send "^3.2.0" 1144 | 1145 | koa-views@^6.1.4: 1146 | version "6.1.4" 1147 | resolved "http://registry.npm.taobao.org/koa-views/download/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d" 1148 | integrity sha1-WV62g8oX2N+qHRALQrpONMdiFU0= 1149 | dependencies: 1150 | consolidate "^0.15.0" 1151 | debug "^3.1.0" 1152 | get-paths "^0.0.2" 1153 | koa-send "^4.0.0" 1154 | mz "^2.4.0" 1155 | pretty "^2.0.0" 1156 | 1157 | koa.sass@^1.0.3: 1158 | version "1.0.3" 1159 | resolved "http://registry.npm.taobao.org/koa.sass/download/koa.sass-1.0.3.tgz#8ca2db1300be1cee8abb8ab36f5e4be87329c60d" 1160 | integrity sha1-jKLbEwC+HO6Ku4qzb15L6HMpxg0= 1161 | dependencies: 1162 | fs-extra "^1.0.0" 1163 | koa-mount "^2.0.0" 1164 | koa-static "^3.0.0" 1165 | node-sass "^4.1.1" 1166 | node-sass-glob-importer "^3.0.0" 1167 | 1168 | koa@^2.4.1: 1169 | version "2.6.1" 1170 | resolved "http://registry.npm.taobao.org/koa/download/koa-2.6.1.tgz#88cabb18cd297e0577a37e40f400c4b6f1699fef" 1171 | integrity sha1-iMq7GM0pfgV3o35A9ADEtvFpn+8= 1172 | dependencies: 1173 | accepts "^1.3.5" 1174 | cache-content-type "^1.0.0" 1175 | content-disposition "~0.5.2" 1176 | content-type "^1.0.4" 1177 | cookies "~0.7.1" 1178 | debug "~3.1.0" 1179 | delegates "^1.0.0" 1180 | depd "^1.1.2" 1181 | destroy "^1.0.4" 1182 | error-inject "^1.0.0" 1183 | escape-html "^1.0.3" 1184 | fresh "~0.5.2" 1185 | http-assert "^1.3.0" 1186 | http-errors "^1.6.3" 1187 | is-generator-function "^1.0.7" 1188 | koa-compose "^4.1.0" 1189 | koa-convert "^1.2.0" 1190 | koa-is-json "^1.0.0" 1191 | on-finished "^2.3.0" 1192 | only "~0.0.2" 1193 | parseurl "^1.3.2" 1194 | statuses "^1.5.0" 1195 | type-is "^1.6.16" 1196 | vary "^1.1.2" 1197 | 1198 | lcid@^1.0.0: 1199 | version "1.0.0" 1200 | resolved "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1201 | integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 1202 | dependencies: 1203 | invert-kv "^1.0.0" 1204 | 1205 | load-json-file@^1.0.0: 1206 | version "1.1.0" 1207 | resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1208 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1209 | dependencies: 1210 | graceful-fs "^4.1.2" 1211 | parse-json "^2.2.0" 1212 | pify "^2.0.0" 1213 | pinkie-promise "^2.0.0" 1214 | strip-bom "^2.0.0" 1215 | 1216 | lodash.assign@^4.2.0: 1217 | version "4.2.0" 1218 | resolved "http://registry.npm.taobao.org/lodash.assign/download/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 1219 | integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= 1220 | 1221 | lodash.clonedeep@^4.3.2: 1222 | version "4.5.0" 1223 | resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 1224 | integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= 1225 | 1226 | lodash.mergewith@^4.6.0: 1227 | version "4.6.1" 1228 | resolved "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" 1229 | integrity sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc= 1230 | 1231 | lodash@^4.0.0, lodash@^4.17.1, lodash@~4.17.10: 1232 | version "4.17.11" 1233 | resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 1234 | integrity sha1-s56mIp72B+zYniyN8SU2iRysm40= 1235 | 1236 | log4js@^3.0.6: 1237 | version "3.0.6" 1238 | resolved "http://registry.npm.taobao.org/log4js/download/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" 1239 | integrity sha1-5srO2Uln7uuc45n5+GgqSysoyP8= 1240 | dependencies: 1241 | circular-json "^0.5.5" 1242 | date-format "^1.2.0" 1243 | debug "^3.1.0" 1244 | rfdc "^1.1.2" 1245 | streamroller "0.7.0" 1246 | 1247 | loud-rejection@^1.0.0: 1248 | version "1.6.0" 1249 | resolved "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1250 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 1251 | dependencies: 1252 | currently-unhandled "^0.4.1" 1253 | signal-exit "^3.0.0" 1254 | 1255 | lru-cache@^4.0.1, lru-cache@^4.1.3: 1256 | version "4.1.3" 1257 | resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 1258 | integrity sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw= 1259 | dependencies: 1260 | pseudomap "^1.0.2" 1261 | yallist "^2.1.2" 1262 | 1263 | map-obj@^1.0.0, map-obj@^1.0.1: 1264 | version "1.0.1" 1265 | resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1266 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 1267 | 1268 | media-typer@0.3.0: 1269 | version "0.3.0" 1270 | resolved "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1271 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1272 | 1273 | meow@^3.7.0: 1274 | version "3.7.0" 1275 | resolved "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1276 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 1277 | dependencies: 1278 | camelcase-keys "^2.0.0" 1279 | decamelize "^1.1.2" 1280 | loud-rejection "^1.0.0" 1281 | map-obj "^1.0.1" 1282 | minimist "^1.1.3" 1283 | normalize-package-data "^2.3.4" 1284 | object-assign "^4.0.1" 1285 | read-pkg-up "^1.0.1" 1286 | redent "^1.0.0" 1287 | trim-newlines "^1.0.0" 1288 | 1289 | methods@^1.0.1: 1290 | version "1.1.2" 1291 | resolved "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1292 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1293 | 1294 | mime-db@~1.37.0: 1295 | version "1.37.0" 1296 | resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 1297 | integrity sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng= 1298 | 1299 | mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: 1300 | version "2.1.21" 1301 | resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 1302 | integrity sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y= 1303 | dependencies: 1304 | mime-db "~1.37.0" 1305 | 1306 | minimatch@^3.0.4, minimatch@~3.0.2: 1307 | version "3.0.4" 1308 | resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1309 | integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= 1310 | dependencies: 1311 | brace-expansion "^1.1.7" 1312 | 1313 | minimist@0.0.8: 1314 | version "0.0.8" 1315 | resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1316 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1317 | 1318 | minimist@^1.1.3, minimist@^1.2.0: 1319 | version "1.2.0" 1320 | resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1321 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1322 | 1323 | minipass@^2.2.1, minipass@^2.3.4: 1324 | version "2.3.5" 1325 | resolved "http://registry.npm.taobao.org/minipass/download/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 1326 | integrity sha1-ys6+SSAiSX9law8PUeJoKp7S2Eg= 1327 | dependencies: 1328 | safe-buffer "^5.1.2" 1329 | yallist "^3.0.0" 1330 | 1331 | minizlib@^1.1.1: 1332 | version "1.1.1" 1333 | resolved "http://registry.npm.taobao.org/minizlib/download/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" 1334 | integrity sha1-ZzSswEWkbmHVlqQ7udnNMm4ZzEI= 1335 | dependencies: 1336 | minipass "^2.2.1" 1337 | 1338 | "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: 1339 | version "0.5.1" 1340 | resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1341 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1342 | dependencies: 1343 | minimist "0.0.8" 1344 | 1345 | moment-timezone@^0.5.14: 1346 | version "0.5.23" 1347 | resolved "http://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" 1348 | integrity sha1-fLsA2ywUxxsZMDy0ew+wpthlFGM= 1349 | dependencies: 1350 | moment ">= 2.9.0" 1351 | 1352 | "moment@>= 2.9.0", moment@^2.20.0, moment@^2.22.2: 1353 | version "2.22.2" 1354 | resolved "http://registry.npm.taobao.org/moment/download/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" 1355 | integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= 1356 | 1357 | ms@2.0.0: 1358 | version "2.0.0" 1359 | resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1360 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1361 | 1362 | ms@^2.1.1: 1363 | version "2.1.1" 1364 | resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1365 | integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= 1366 | 1367 | multer@1.3.0: 1368 | version "1.3.0" 1369 | resolved "http://registry.npm.taobao.org/multer/download/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" 1370 | integrity sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI= 1371 | dependencies: 1372 | append-field "^0.1.0" 1373 | busboy "^0.2.11" 1374 | concat-stream "^1.5.0" 1375 | mkdirp "^0.5.1" 1376 | object-assign "^3.0.0" 1377 | on-finished "^2.3.0" 1378 | type-is "^1.6.4" 1379 | xtend "^4.0.0" 1380 | 1381 | mz@^2.3.1, mz@^2.4.0, mz@^2.6.0, mz@^2.7.0: 1382 | version "2.7.0" 1383 | resolved "http://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 1384 | integrity sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI= 1385 | dependencies: 1386 | any-promise "^1.0.0" 1387 | object-assign "^4.0.1" 1388 | thenify-all "^1.0.0" 1389 | 1390 | nan@^2.10.0, nan@^2.11.1: 1391 | version "2.11.1" 1392 | resolved "http://registry.npm.taobao.org/nan/download/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" 1393 | integrity sha1-kOIrzLjKV+pM03zIPTgZtS7qZ2Y= 1394 | 1395 | nan@~2.10.0: 1396 | version "2.10.0" 1397 | resolved "http://registry.npm.taobao.org/nan/download/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" 1398 | integrity sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8= 1399 | 1400 | needle@^2.2.1: 1401 | version "2.2.4" 1402 | resolved "http://registry.npm.taobao.org/needle/download/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" 1403 | integrity sha1-UZMb/4JTOxkot9HWngHxsA/9Kk4= 1404 | dependencies: 1405 | debug "^2.1.2" 1406 | iconv-lite "^0.4.4" 1407 | sax "^1.2.4" 1408 | 1409 | negotiator@0.6.1: 1410 | version "0.6.1" 1411 | resolved "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1412 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 1413 | 1414 | node-cron@^2.0.3: 1415 | version "2.0.3" 1416 | resolved "http://registry.npm.taobao.org/node-cron/download/node-cron-2.0.3.tgz#b9649784d0d6c00758410eef22fa54a10e3f602d" 1417 | integrity sha1-uWSXhNDWwAdYQQ7vIvpUoQ4/YC0= 1418 | dependencies: 1419 | opencollective-postinstall "^2.0.0" 1420 | tz-offset "0.0.1" 1421 | 1422 | node-gyp@^3.8.0: 1423 | version "3.8.0" 1424 | resolved "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" 1425 | integrity sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw= 1426 | dependencies: 1427 | fstream "^1.0.0" 1428 | glob "^7.0.3" 1429 | graceful-fs "^4.1.2" 1430 | mkdirp "^0.5.0" 1431 | nopt "2 || 3" 1432 | npmlog "0 || 1 || 2 || 3 || 4" 1433 | osenv "0" 1434 | request "^2.87.0" 1435 | rimraf "2" 1436 | semver "~5.3.0" 1437 | tar "^2.0.0" 1438 | which "1" 1439 | 1440 | node-pre-gyp@^0.10.3: 1441 | version "0.10.3" 1442 | resolved "http://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 1443 | integrity sha1-MHAEBxav3HeHR7YbaIe/eIgLgPw= 1444 | dependencies: 1445 | detect-libc "^1.0.2" 1446 | mkdirp "^0.5.1" 1447 | needle "^2.2.1" 1448 | nopt "^4.0.1" 1449 | npm-packlist "^1.1.6" 1450 | npmlog "^4.0.2" 1451 | rc "^1.2.7" 1452 | rimraf "^2.6.1" 1453 | semver "^5.3.0" 1454 | tar "^4" 1455 | 1456 | node-sass-glob-importer@^3.0.0: 1457 | version "3.0.2" 1458 | resolved "http://registry.npm.taobao.org/node-sass-glob-importer/download/node-sass-glob-importer-3.0.2.tgz#8a8e7f57a76cb33ee5e9f3da4f263f11d65316e7" 1459 | integrity sha1-io5/V6dssz7l6fPaTyY/EdZTFuc= 1460 | dependencies: 1461 | glob "^7.1.1" 1462 | unique-concat "^0.2.2" 1463 | 1464 | node-sass@^4.1.1: 1465 | version "4.10.0" 1466 | resolved "http://registry.npm.taobao.org/node-sass/download/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4" 1467 | integrity sha1-3MKzZMCRNjCUXMv3orvx+Sbv/KQ= 1468 | dependencies: 1469 | async-foreach "^0.1.3" 1470 | chalk "^1.1.1" 1471 | cross-spawn "^3.0.0" 1472 | gaze "^1.0.0" 1473 | get-stdin "^4.0.1" 1474 | glob "^7.0.3" 1475 | in-publish "^2.0.0" 1476 | lodash.assign "^4.2.0" 1477 | lodash.clonedeep "^4.3.2" 1478 | lodash.mergewith "^4.6.0" 1479 | meow "^3.7.0" 1480 | mkdirp "^0.5.1" 1481 | nan "^2.10.0" 1482 | node-gyp "^3.8.0" 1483 | npmlog "^4.0.0" 1484 | request "^2.88.0" 1485 | sass-graph "^2.2.4" 1486 | stdout-stream "^1.4.0" 1487 | "true-case-path" "^1.0.2" 1488 | 1489 | "nopt@2 || 3": 1490 | version "3.0.6" 1491 | resolved "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1492 | integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= 1493 | dependencies: 1494 | abbrev "1" 1495 | 1496 | nopt@^4.0.1, nopt@~4.0.1: 1497 | version "4.0.1" 1498 | resolved "http://registry.npm.taobao.org/nopt/download/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1499 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1500 | dependencies: 1501 | abbrev "1" 1502 | osenv "^0.1.4" 1503 | 1504 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1505 | version "2.4.0" 1506 | resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1507 | integrity sha1-EvlaMH1YNSB1oEkHuErIvpisAS8= 1508 | dependencies: 1509 | hosted-git-info "^2.1.4" 1510 | is-builtin-module "^1.0.0" 1511 | semver "2 || 3 || 4 || 5" 1512 | validate-npm-package-license "^3.0.1" 1513 | 1514 | npm-bundled@^1.0.1: 1515 | version "1.0.5" 1516 | resolved "http://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 1517 | integrity sha1-PBcyt7qTazoQMlrvYWRnwMy8yXk= 1518 | 1519 | npm-packlist@^1.1.6: 1520 | version "1.1.12" 1521 | resolved "http://registry.npm.taobao.org/npm-packlist/download/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" 1522 | integrity sha1-Ir3i68EucspIKr1nr8UetJN3JDo= 1523 | dependencies: 1524 | ignore-walk "^3.0.1" 1525 | npm-bundled "^1.0.1" 1526 | 1527 | "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: 1528 | version "4.1.2" 1529 | resolved "http://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1530 | integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs= 1531 | dependencies: 1532 | are-we-there-yet "~1.1.2" 1533 | console-control-strings "~1.1.0" 1534 | gauge "~2.7.3" 1535 | set-blocking "~2.0.0" 1536 | 1537 | number-is-nan@^1.0.0: 1538 | version "1.0.1" 1539 | resolved "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1540 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1541 | 1542 | oauth-sign@~0.9.0: 1543 | version "0.9.0" 1544 | resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1545 | integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= 1546 | 1547 | object-assign@^3.0.0: 1548 | version "3.0.0" 1549 | resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 1550 | integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= 1551 | 1552 | object-assign@^4.0.1, object-assign@^4.1.0: 1553 | version "4.1.1" 1554 | resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1555 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1556 | 1557 | on-finished@^2.3.0: 1558 | version "2.3.0" 1559 | resolved "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1560 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1561 | dependencies: 1562 | ee-first "1.1.1" 1563 | 1564 | once@^1.3.0: 1565 | version "1.4.0" 1566 | resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1567 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1568 | dependencies: 1569 | wrappy "1" 1570 | 1571 | only@~0.0.2: 1572 | version "0.0.2" 1573 | resolved "http://registry.npm.taobao.org/only/download/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 1574 | integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= 1575 | 1576 | opencollective-postinstall@^2.0.0: 1577 | version "2.0.1" 1578 | resolved "http://registry.npm.taobao.org/opencollective-postinstall/download/opencollective-postinstall-2.0.1.tgz#798e83e168f7b91949061c2683f762af747f17cc" 1579 | integrity sha1-eY6D4Wj3uRlJBhwmg/dir3R/F8w= 1580 | 1581 | os-homedir@^1.0.0: 1582 | version "1.0.2" 1583 | resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1584 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1585 | 1586 | os-locale@^1.4.0: 1587 | version "1.4.0" 1588 | resolved "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1589 | integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= 1590 | dependencies: 1591 | lcid "^1.0.0" 1592 | 1593 | os-tmpdir@^1.0.0: 1594 | version "1.0.2" 1595 | resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1596 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1597 | 1598 | osenv@0, osenv@^0.1.4: 1599 | version "0.1.5" 1600 | resolved "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1601 | integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= 1602 | dependencies: 1603 | os-homedir "^1.0.0" 1604 | os-tmpdir "^1.0.0" 1605 | 1606 | parse-json@^2.2.0: 1607 | version "2.2.0" 1608 | resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1609 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1610 | dependencies: 1611 | error-ex "^1.2.0" 1612 | 1613 | parseurl@^1.3.2: 1614 | version "1.3.2" 1615 | resolved "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 1616 | integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= 1617 | 1618 | path-exists@^2.0.0: 1619 | version "2.1.0" 1620 | resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1621 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1622 | dependencies: 1623 | pinkie-promise "^2.0.0" 1624 | 1625 | path-is-absolute@1.0.1, path-is-absolute@^1.0.0: 1626 | version "1.0.1" 1627 | resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1628 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1629 | 1630 | path-to-regexp@^1.1.1: 1631 | version "1.7.0" 1632 | resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" 1633 | integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= 1634 | dependencies: 1635 | isarray "0.0.1" 1636 | 1637 | path-type@^1.0.0: 1638 | version "1.1.0" 1639 | resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1640 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1641 | dependencies: 1642 | graceful-fs "^4.1.2" 1643 | pify "^2.0.0" 1644 | pinkie-promise "^2.0.0" 1645 | 1646 | performance-now@^2.1.0: 1647 | version "2.1.0" 1648 | resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1649 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1650 | 1651 | pify@^2.0.0: 1652 | version "2.3.0" 1653 | resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1654 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1655 | 1656 | pinkie-promise@^2.0.0: 1657 | version "2.0.1" 1658 | resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1659 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1660 | dependencies: 1661 | pinkie "^2.0.0" 1662 | 1663 | pinkie@^2.0.0: 1664 | version "2.0.4" 1665 | resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1666 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1667 | 1668 | pretty-bytes@^5.1.0: 1669 | version "5.1.0" 1670 | resolved "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-5.1.0.tgz#6237ecfbdc6525beaef4de722cc60a58ae0e6c6d" 1671 | integrity sha1-Yjfs+9xlJb6u9N5yLMYKWK4ObG0= 1672 | 1673 | pretty@^2.0.0: 1674 | version "2.0.0" 1675 | resolved "http://registry.npm.taobao.org/pretty/download/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" 1676 | integrity sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU= 1677 | dependencies: 1678 | condense-newlines "^0.2.1" 1679 | extend-shallow "^2.0.1" 1680 | js-beautify "^1.6.12" 1681 | 1682 | process-nextick-args@~2.0.0: 1683 | version "2.0.0" 1684 | resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1685 | integrity sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o= 1686 | 1687 | proto-list@~1.2.1: 1688 | version "1.2.4" 1689 | resolved "http://registry.npm.taobao.org/proto-list/download/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" 1690 | integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= 1691 | 1692 | pseudomap@^1.0.2: 1693 | version "1.0.2" 1694 | resolved "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1695 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1696 | 1697 | psl@^1.1.24: 1698 | version "1.1.29" 1699 | resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 1700 | integrity sha1-YPWA02AXC7cip5fMcEQR5tqFDGc= 1701 | 1702 | punycode@^1.4.1: 1703 | version "1.4.1" 1704 | resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1705 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1706 | 1707 | punycode@^2.1.0: 1708 | version "2.1.1" 1709 | resolved "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1710 | integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= 1711 | 1712 | qs@^6.4.0, qs@~6.5.2: 1713 | version "6.5.2" 1714 | resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1715 | integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= 1716 | 1717 | raw-body@^2.2.0: 1718 | version "2.3.3" 1719 | resolved "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 1720 | integrity sha1-GzJOzmtXBuFThVvBFIxlu39uoMM= 1721 | dependencies: 1722 | bytes "3.0.0" 1723 | http-errors "1.6.3" 1724 | iconv-lite "0.4.23" 1725 | unpipe "1.0.0" 1726 | 1727 | rc@^1.2.7: 1728 | version "1.2.8" 1729 | resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1730 | integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= 1731 | dependencies: 1732 | deep-extend "^0.6.0" 1733 | ini "~1.3.0" 1734 | minimist "^1.2.0" 1735 | strip-json-comments "~2.0.1" 1736 | 1737 | read-pkg-up@^1.0.1: 1738 | version "1.0.1" 1739 | resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1740 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1741 | dependencies: 1742 | find-up "^1.0.0" 1743 | read-pkg "^1.0.0" 1744 | 1745 | read-pkg@^1.0.0: 1746 | version "1.1.0" 1747 | resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1748 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 1749 | dependencies: 1750 | load-json-file "^1.0.0" 1751 | normalize-package-data "^2.3.2" 1752 | path-type "^1.0.0" 1753 | 1754 | readable-stream@1.1.x: 1755 | version "1.1.14" 1756 | resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1757 | integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= 1758 | dependencies: 1759 | core-util-is "~1.0.0" 1760 | inherits "~2.0.1" 1761 | isarray "0.0.1" 1762 | string_decoder "~0.10.x" 1763 | 1764 | readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0: 1765 | version "2.3.6" 1766 | resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1767 | integrity sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8= 1768 | dependencies: 1769 | core-util-is "~1.0.0" 1770 | inherits "~2.0.3" 1771 | isarray "~1.0.0" 1772 | process-nextick-args "~2.0.0" 1773 | safe-buffer "~5.1.1" 1774 | string_decoder "~1.1.1" 1775 | util-deprecate "~1.0.1" 1776 | 1777 | redent@^1.0.0: 1778 | version "1.0.0" 1779 | resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1780 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 1781 | dependencies: 1782 | indent-string "^2.1.0" 1783 | strip-indent "^1.0.1" 1784 | 1785 | repeating@^2.0.0: 1786 | version "2.0.1" 1787 | resolved "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1788 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 1789 | dependencies: 1790 | is-finite "^1.0.0" 1791 | 1792 | request@^2.87.0, request@^2.88.0: 1793 | version "2.88.0" 1794 | resolved "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1795 | integrity sha1-nC/KT301tZLv5Xx/ClXoEFIST+8= 1796 | dependencies: 1797 | aws-sign2 "~0.7.0" 1798 | aws4 "^1.8.0" 1799 | caseless "~0.12.0" 1800 | combined-stream "~1.0.6" 1801 | extend "~3.0.2" 1802 | forever-agent "~0.6.1" 1803 | form-data "~2.3.2" 1804 | har-validator "~5.1.0" 1805 | http-signature "~1.2.0" 1806 | is-typedarray "~1.0.0" 1807 | isstream "~0.1.2" 1808 | json-stringify-safe "~5.0.1" 1809 | mime-types "~2.1.19" 1810 | oauth-sign "~0.9.0" 1811 | performance-now "^2.1.0" 1812 | qs "~6.5.2" 1813 | safe-buffer "^5.1.2" 1814 | tough-cookie "~2.4.3" 1815 | tunnel-agent "^0.6.0" 1816 | uuid "^3.3.2" 1817 | 1818 | require-directory@^2.1.1: 1819 | version "2.1.1" 1820 | resolved "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1821 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1822 | 1823 | require-main-filename@^1.0.1: 1824 | version "1.0.1" 1825 | resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1826 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1827 | 1828 | resolve-path@^1.3.1, resolve-path@^1.3.3, resolve-path@^1.4.0: 1829 | version "1.4.0" 1830 | resolved "http://registry.npm.taobao.org/resolve-path/download/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" 1831 | integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= 1832 | dependencies: 1833 | http-errors "~1.6.2" 1834 | path-is-absolute "1.0.1" 1835 | 1836 | retry-as-promised@^2.3.2: 1837 | version "2.3.2" 1838 | resolved "http://registry.npm.taobao.org/retry-as-promised/download/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" 1839 | integrity sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c= 1840 | dependencies: 1841 | bluebird "^3.4.6" 1842 | debug "^2.6.9" 1843 | 1844 | rfdc@^1.1.2: 1845 | version "1.1.2" 1846 | resolved "http://registry.npm.taobao.org/rfdc/download/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" 1847 | integrity sha1-5uctdPXcOd6PU49l4Aw2wYAY40k= 1848 | 1849 | rimraf@2, rimraf@^2.6.1: 1850 | version "2.6.2" 1851 | resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1852 | integrity sha1-LtgVDSShbqhlHm1u8PR8QVjOejY= 1853 | dependencies: 1854 | glob "^7.0.5" 1855 | 1856 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1857 | version "5.1.2" 1858 | resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1859 | integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= 1860 | 1861 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1862 | version "2.1.2" 1863 | resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1864 | integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= 1865 | 1866 | sass-graph@^2.2.4: 1867 | version "2.2.4" 1868 | resolved "http://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" 1869 | integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= 1870 | dependencies: 1871 | glob "^7.0.0" 1872 | lodash "^4.0.0" 1873 | scss-tokenizer "^0.2.3" 1874 | yargs "^7.0.0" 1875 | 1876 | sax@^1.2.4: 1877 | version "1.2.4" 1878 | resolved "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1879 | integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= 1880 | 1881 | scss-tokenizer@^0.2.3: 1882 | version "0.2.3" 1883 | resolved "http://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" 1884 | integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= 1885 | dependencies: 1886 | js-base64 "^2.1.8" 1887 | source-map "^0.4.2" 1888 | 1889 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: 1890 | version "5.6.0" 1891 | resolved "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 1892 | integrity sha1-fnQlb7qknHWqfHogXMInmcrIAAQ= 1893 | 1894 | semver@~5.3.0: 1895 | version "5.3.0" 1896 | resolved "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1897 | integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= 1898 | 1899 | sequelize@^4.33.4: 1900 | version "4.41.1" 1901 | resolved "http://registry.npm.taobao.org/sequelize/download/sequelize-4.41.1.tgz#03dc3a1e675aeef5a4ee07d7a9206edce5800e5d" 1902 | integrity sha1-A9w6Hmda7vWk7gfXqSBu3OWADl0= 1903 | dependencies: 1904 | bluebird "^3.5.0" 1905 | cls-bluebird "^2.1.0" 1906 | debug "^3.1.0" 1907 | depd "^1.1.0" 1908 | dottie "^2.0.0" 1909 | generic-pool "^3.4.0" 1910 | inflection "1.12.0" 1911 | lodash "^4.17.1" 1912 | moment "^2.20.0" 1913 | moment-timezone "^0.5.14" 1914 | retry-as-promised "^2.3.2" 1915 | semver "^5.5.0" 1916 | terraformer-wkt-parser "^1.1.2" 1917 | toposort-class "^1.0.1" 1918 | uuid "^3.2.1" 1919 | validator "^10.4.0" 1920 | wkx "^0.4.1" 1921 | 1922 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1923 | version "2.0.0" 1924 | resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1925 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1926 | 1927 | setprototypeof@1.1.0: 1928 | version "1.1.0" 1929 | resolved "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 1930 | integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= 1931 | 1932 | shimmer@^1.1.0: 1933 | version "1.2.0" 1934 | resolved "http://registry.npm.taobao.org/shimmer/download/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" 1935 | integrity sha1-+Wb3VVeJdj502IQRk2haXnhzZmU= 1936 | 1937 | sigmund@^1.0.1: 1938 | version "1.0.1" 1939 | resolved "http://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 1940 | integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= 1941 | 1942 | signal-exit@^3.0.0: 1943 | version "3.0.2" 1944 | resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1945 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1946 | 1947 | source-map@^0.4.2: 1948 | version "0.4.4" 1949 | resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1950 | integrity sha1-66T12pwNyZneaAMti092FzZSA2s= 1951 | dependencies: 1952 | amdefine ">=0.0.4" 1953 | 1954 | spdx-correct@^3.0.0: 1955 | version "3.0.2" 1956 | resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" 1957 | integrity sha1-GbtAnpG0exrVQVkkP3MSqFjbPC4= 1958 | dependencies: 1959 | spdx-expression-parse "^3.0.0" 1960 | spdx-license-ids "^3.0.0" 1961 | 1962 | spdx-exceptions@^2.1.0: 1963 | version "2.2.0" 1964 | resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 1965 | integrity sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= 1966 | 1967 | spdx-expression-parse@^3.0.0: 1968 | version "3.0.0" 1969 | resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1970 | integrity sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= 1971 | dependencies: 1972 | spdx-exceptions "^2.1.0" 1973 | spdx-license-ids "^3.0.0" 1974 | 1975 | spdx-license-ids@^3.0.0: 1976 | version "3.0.2" 1977 | resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" 1978 | integrity sha1-pZ78CXhMKlutoTz+r1x13SFARNI= 1979 | 1980 | sqlite3@^4.0.3: 1981 | version "4.0.3" 1982 | resolved "http://registry.npm.taobao.org/sqlite3/download/sqlite3-4.0.3.tgz#da8c167a87941657fd22e27b248aa371e192b715" 1983 | integrity sha1-2owWeoeUFlf9IuJ7JIqjceGStxU= 1984 | dependencies: 1985 | nan "~2.10.0" 1986 | node-pre-gyp "^0.10.3" 1987 | request "^2.87.0" 1988 | 1989 | sshpk@^1.7.0: 1990 | version "1.15.2" 1991 | resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" 1992 | integrity sha1-yUbWvZsaOdDoY1dj9SQtbtbctik= 1993 | dependencies: 1994 | asn1 "~0.2.3" 1995 | assert-plus "^1.0.0" 1996 | bcrypt-pbkdf "^1.0.0" 1997 | dashdash "^1.12.0" 1998 | ecc-jsbn "~0.1.1" 1999 | getpass "^0.1.1" 2000 | jsbn "~0.1.0" 2001 | safer-buffer "^2.0.2" 2002 | tweetnacl "~0.14.0" 2003 | 2004 | "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: 2005 | version "1.5.0" 2006 | resolved "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 2007 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 2008 | 2009 | stdout-stream@^1.4.0: 2010 | version "1.4.1" 2011 | resolved "http://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" 2012 | integrity sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4= 2013 | dependencies: 2014 | readable-stream "^2.0.1" 2015 | 2016 | streamroller@0.7.0: 2017 | version "0.7.0" 2018 | resolved "http://registry.npm.taobao.org/streamroller/download/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" 2019 | integrity sha1-odG3z4PTmvsNYwSaWsv5NJO99ks= 2020 | dependencies: 2021 | date-format "^1.2.0" 2022 | debug "^3.1.0" 2023 | mkdirp "^0.5.1" 2024 | readable-stream "^2.3.0" 2025 | 2026 | streamsearch@0.1.2: 2027 | version "0.1.2" 2028 | resolved "http://registry.npm.taobao.org/streamsearch/download/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 2029 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 2030 | 2031 | string-width@^1.0.1, string-width@^1.0.2: 2032 | version "1.0.2" 2033 | resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2034 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2035 | dependencies: 2036 | code-point-at "^1.0.0" 2037 | is-fullwidth-code-point "^1.0.0" 2038 | strip-ansi "^3.0.0" 2039 | 2040 | "string-width@^1.0.2 || 2": 2041 | version "2.1.1" 2042 | resolved "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2043 | integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= 2044 | dependencies: 2045 | is-fullwidth-code-point "^2.0.0" 2046 | strip-ansi "^4.0.0" 2047 | 2048 | string_decoder@~0.10.x: 2049 | version "0.10.31" 2050 | resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2051 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 2052 | 2053 | string_decoder@~1.1.1: 2054 | version "1.1.1" 2055 | resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2056 | integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= 2057 | dependencies: 2058 | safe-buffer "~5.1.0" 2059 | 2060 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2061 | version "3.0.1" 2062 | resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2063 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2064 | dependencies: 2065 | ansi-regex "^2.0.0" 2066 | 2067 | strip-ansi@^4.0.0: 2068 | version "4.0.0" 2069 | resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2070 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2071 | dependencies: 2072 | ansi-regex "^3.0.0" 2073 | 2074 | strip-bom@^2.0.0: 2075 | version "2.0.0" 2076 | resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2077 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 2078 | dependencies: 2079 | is-utf8 "^0.2.0" 2080 | 2081 | strip-indent@^1.0.1: 2082 | version "1.0.1" 2083 | resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 2084 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 2085 | dependencies: 2086 | get-stdin "^4.0.1" 2087 | 2088 | strip-json-comments@~2.0.1: 2089 | version "2.0.1" 2090 | resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2091 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2092 | 2093 | supports-color@^2.0.0: 2094 | version "2.0.0" 2095 | resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2096 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2097 | 2098 | tar@^2.0.0: 2099 | version "2.2.1" 2100 | resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2101 | integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= 2102 | dependencies: 2103 | block-stream "*" 2104 | fstream "^1.0.2" 2105 | inherits "2" 2106 | 2107 | tar@^4: 2108 | version "4.4.7" 2109 | resolved "http://registry.npm.taobao.org/tar/download/tar-4.4.7.tgz#14df45023ffdcd0c233befa2fc01ebb76ee39e7c" 2110 | integrity sha1-FN9FAj/9zQwjO++i/AHrt27jnnw= 2111 | dependencies: 2112 | chownr "^1.1.1" 2113 | fs-minipass "^1.2.5" 2114 | minipass "^2.3.4" 2115 | minizlib "^1.1.1" 2116 | mkdirp "^0.5.0" 2117 | safe-buffer "^5.1.2" 2118 | yallist "^3.0.2" 2119 | 2120 | terraformer-wkt-parser@^1.1.2: 2121 | version "1.2.0" 2122 | resolved "http://registry.npm.taobao.org/terraformer-wkt-parser/download/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34" 2123 | integrity sha1-ydasPf8l9MC9NE6WH0JpSWGDTDQ= 2124 | dependencies: 2125 | "@types/geojson" "^1.0.0" 2126 | terraformer "~1.0.5" 2127 | 2128 | terraformer@~1.0.5: 2129 | version "1.0.9" 2130 | resolved "http://registry.npm.taobao.org/terraformer/download/terraformer-1.0.9.tgz#77851fef4a49c90b345dc53cf26809fdf29dcda6" 2131 | integrity sha1-d4Uf70pJyQs0XcU88mgJ/fKdzaY= 2132 | optionalDependencies: 2133 | "@types/geojson" "^1.0.0" 2134 | 2135 | thenify-all@^1.0.0: 2136 | version "1.6.0" 2137 | resolved "http://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 2138 | integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 2139 | dependencies: 2140 | thenify ">= 3.1.0 < 4" 2141 | 2142 | "thenify@>= 3.1.0 < 4": 2143 | version "3.3.0" 2144 | resolved "http://registry.npm.taobao.org/thenify/download/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" 2145 | integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= 2146 | dependencies: 2147 | any-promise "^1.0.0" 2148 | 2149 | toidentifier@1.0.0: 2150 | version "1.0.0" 2151 | resolved "http://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 2152 | integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= 2153 | 2154 | toposort-class@^1.0.1: 2155 | version "1.0.1" 2156 | resolved "http://registry.npm.taobao.org/toposort-class/download/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" 2157 | integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= 2158 | 2159 | tough-cookie@~2.4.3: 2160 | version "2.4.3" 2161 | resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 2162 | integrity sha1-U/Nto/R3g7CSWvoG/587FlKA94E= 2163 | dependencies: 2164 | psl "^1.1.24" 2165 | punycode "^1.4.1" 2166 | 2167 | trim-newlines@^1.0.0: 2168 | version "1.0.0" 2169 | resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 2170 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 2171 | 2172 | "true-case-path@^1.0.2": 2173 | version "1.0.3" 2174 | resolved "http://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" 2175 | integrity sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0= 2176 | dependencies: 2177 | glob "^7.1.2" 2178 | 2179 | tunnel-agent@^0.6.0: 2180 | version "0.6.0" 2181 | resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2182 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2183 | dependencies: 2184 | safe-buffer "^5.0.1" 2185 | 2186 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2187 | version "0.14.5" 2188 | resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2189 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2190 | 2191 | type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4: 2192 | version "1.6.16" 2193 | resolved "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 2194 | integrity sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ= 2195 | dependencies: 2196 | media-typer "0.3.0" 2197 | mime-types "~2.1.18" 2198 | 2199 | typedarray@^0.0.6: 2200 | version "0.0.6" 2201 | resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2202 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2203 | 2204 | tz-offset@0.0.1: 2205 | version "0.0.1" 2206 | resolved "http://registry.npm.taobao.org/tz-offset/download/tz-offset-0.0.1.tgz#fef920257024d3583ed9072a767721a18bdb8a76" 2207 | integrity sha1-/vkgJXAk01g+2QcqdnchoYvbinY= 2208 | 2209 | unique-concat@^0.2.2: 2210 | version "0.2.2" 2211 | resolved "http://registry.npm.taobao.org/unique-concat/download/unique-concat-0.2.2.tgz#9210f9bdcaacc5e1e3929490d7c019df96f18712" 2212 | integrity sha1-khD5vcqsxeHjkpSQ18AZ35bxhxI= 2213 | 2214 | universalify@^0.1.0: 2215 | version "0.1.2" 2216 | resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2217 | integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= 2218 | 2219 | unpipe@1.0.0: 2220 | version "1.0.0" 2221 | resolved "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2222 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2223 | 2224 | uri-js@^4.2.2: 2225 | version "4.2.2" 2226 | resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 2227 | integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA= 2228 | dependencies: 2229 | punycode "^2.1.0" 2230 | 2231 | urijs@^1.19.0: 2232 | version "1.19.1" 2233 | resolved "http://registry.npm.taobao.org/urijs/download/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" 2234 | integrity sha1-Ww/1MMDL3oOG9jQiNbpcpumV0lo= 2235 | 2236 | util-deprecate@~1.0.1: 2237 | version "1.0.2" 2238 | resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2239 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2240 | 2241 | uuid@^3.2.1, uuid@^3.3.2: 2242 | version "3.3.2" 2243 | resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 2244 | integrity sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE= 2245 | 2246 | validate-npm-package-license@^3.0.1: 2247 | version "3.0.4" 2248 | resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2249 | integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= 2250 | dependencies: 2251 | spdx-correct "^3.0.0" 2252 | spdx-expression-parse "^3.0.0" 2253 | 2254 | validator@^10.4.0: 2255 | version "10.9.0" 2256 | resolved "http://registry.npm.taobao.org/validator/download/validator-10.9.0.tgz#d10c11673b5061fb7ccf4c1114412411b2bac2a8" 2257 | integrity sha1-0QwRZztQYft8z0wRFEEkEbK6wqg= 2258 | 2259 | vary@^1.1.2: 2260 | version "1.1.2" 2261 | resolved "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2262 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2263 | 2264 | verror@1.10.0: 2265 | version "1.10.0" 2266 | resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2267 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 2268 | dependencies: 2269 | assert-plus "^1.0.0" 2270 | core-util-is "1.0.2" 2271 | extsprintf "^1.2.0" 2272 | 2273 | which-module@^1.0.0: 2274 | version "1.0.0" 2275 | resolved "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2276 | integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= 2277 | 2278 | which@1, which@^1.2.9: 2279 | version "1.3.1" 2280 | resolved "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2281 | integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= 2282 | dependencies: 2283 | isexe "^2.0.0" 2284 | 2285 | wide-align@^1.1.0: 2286 | version "1.1.3" 2287 | resolved "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2288 | integrity sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= 2289 | dependencies: 2290 | string-width "^1.0.2 || 2" 2291 | 2292 | wkx@^0.4.1: 2293 | version "0.4.5" 2294 | resolved "http://registry.npm.taobao.org/wkx/download/wkx-0.4.5.tgz#a85e15a6e69d1bfaec2f3c523be3dfa40ab861d0" 2295 | integrity sha1-qF4VpuadG/rsLzxSO+PfpAq4YdA= 2296 | dependencies: 2297 | "@types/node" "*" 2298 | 2299 | wrap-ansi@^2.0.0: 2300 | version "2.1.0" 2301 | resolved "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2302 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 2303 | dependencies: 2304 | string-width "^1.0.1" 2305 | strip-ansi "^3.0.1" 2306 | 2307 | wrappy@1: 2308 | version "1.0.2" 2309 | resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2310 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2311 | 2312 | xtend@^4.0.0: 2313 | version "4.0.1" 2314 | resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2315 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 2316 | 2317 | y18n@^3.2.1: 2318 | version "3.2.1" 2319 | resolved "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2320 | integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= 2321 | 2322 | yallist@^2.1.2: 2323 | version "2.1.2" 2324 | resolved "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2325 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 2326 | 2327 | yallist@^3.0.0, yallist@^3.0.2: 2328 | version "3.0.2" 2329 | resolved "http://registry.npm.taobao.org/yallist/download/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 2330 | integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= 2331 | 2332 | yargs-parser@^5.0.0: 2333 | version "5.0.0" 2334 | resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 2335 | integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= 2336 | dependencies: 2337 | camelcase "^3.0.0" 2338 | 2339 | yargs@^7.0.0: 2340 | version "7.1.0" 2341 | resolved "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 2342 | integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= 2343 | dependencies: 2344 | camelcase "^3.0.0" 2345 | cliui "^3.2.0" 2346 | decamelize "^1.1.1" 2347 | get-caller-file "^1.0.1" 2348 | os-locale "^1.4.0" 2349 | read-pkg-up "^1.0.1" 2350 | require-directory "^2.1.1" 2351 | require-main-filename "^1.0.1" 2352 | set-blocking "^2.0.0" 2353 | string-width "^1.0.2" 2354 | which-module "^1.0.0" 2355 | y18n "^3.2.1" 2356 | yargs-parser "^5.0.0" 2357 | 2358 | ylru@^1.2.0: 2359 | version "1.2.1" 2360 | resolved "http://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" 2361 | integrity sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8= 2362 | --------------------------------------------------------------------------------