+Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket. +
+ +[](https://github.com/sub-store-org/Sub-Store/actions/workflows/main.yml)      + +[](https://www.buymeacoffee.com/PengYM) + +Core functionalities: -Subscription manager for QX, Loon and Surge. -Core functionality: 1. Conversion among various formats. 2. Subscription formatting. -3. Collect multiple subscription in one URL. +3. Collect multiple subscriptions in one URL. + +> The following descriptions of features may not be updated in real-time. Please refer to the actual available features for accurate information. + ## 1. Subscription Conversion + ### Supported Input Formats + - [x] SS URI - [x] SSR URI +- [x] SSD URI - [x] V2RayN URI -- [x] QX (SS, SSR, VMess, Trojan, HTTP) -- [x] Loon (SS, SSR, VMess, Trojan, HTTP) -- [x] Surge (SS, VMess, Trojan, HTTP) +- [x] Hysteria2 URI +- [x] QX (SS, SSR, VMess, Trojan, HTTP, SOCKS5) +- [x] Loon (SS, SSR, VMess, Trojan, HTTP, SOCKS5, WireGuard, VLESS, Hysteria2) +- [x] Surge (SS, VMess, Trojan, HTTP, SOCKS5, TUIC, Snell, Hysteria2, SSR(external, only for macOS), WireGuard(Surge to Surge)) +- [x] Surfboard (SS, VMess, Trojan, HTTP, SOCKS5, WireGuard(Surfboard to Surfboard)) +- [x] Shadowrocket (SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard, Hysteria, Hysteria2, TUIC) +- [x] Clash.Meta (SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard, Hysteria, Hysteria2, TUIC) +- [x] Stash (SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard, Hysteria, TUIC) +- [x] Clash (SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard) ### Supported Target Platforms + - [x] QX - [x] Loon - [x] Surge +- [x] Surfboard +- [x] Stash +- [x] Clash.Meta +- [x] Clash +- [x] Shadowrocket +- [x] V2Ray +- [x] V2Ray URI +- [x] Plain JSON ## 2. Subscription Formatting + ### Filtering -- [x] **Keyword filter** -- [x] **Discard keywords filter** + - [x] **Regex filter** - [x] **Discard regex filter** - [x] **Region filter** @@ -32,13 +66,44 @@ Core functionality: - [x] **Script filter** ### Proxy Operations + - [x] **Set property operator**: set some proxy properties such as `udp`,`tfo`, `skip-cert-verify` etc. - [x] **Flag operator**: add flags or remove flags for proxies. - [x] **Sort operator**: sort proxies by name. -- [x] **Keyword sort operator**: sort proxies by keywords (fallback to normal sort). -- [x] **Keyword rename operator**: replace by keywords in proxy names. -- [x] **Keyword delete operator**: delete by keywords in proxy names. +- [x] **Regex sort operator**: sort proxies by keywords (fallback to normal sort). - [x] **Regex rename operator**: replace by regex in proxy names. - [x] **Regex delete operator**: delete by regex in proxy names. - [x] **Script operator**: modify proxy by script. +- [x] **Resolve Domain Operator**: resolve the domain of nodes to an IP address. + +### Development + +Install `pnpm` + +Go to `backend` directories, install node dependencies: + +``` +pnpm install +``` + +1. In `backend`, run the backend server on http://localhost:3000 + +``` +pnpm start +``` + +## LICENSE + +This project is under the GPL V3 LICENSE. + +[](https://app.fossa.com/projects/git%2Bgithub.com%2FPeng-YM%2FSub-Store?ref=badge_large) + +## Star History + +[](https://star-history.com/#sub-store-org/sub-store&Date) + + +## Acknowledgements +- Special thanks to @KOP-XIAO for his awesome resource-parser. Please give a [star](https://github.com/KOP-XIAO/QuantumultX) for his great work! +- Special thanks to @Orz-3 and @58xinian for their awesome icons. diff --git a/backend/.babelrc b/backend/.babelrc new file mode 100644 index 000000000..d45171f44 --- /dev/null +++ b/backend/.babelrc @@ -0,0 +1,27 @@ +{ + "presets": [ + [ + "@babel/preset-env" + ] + ], + "env": { + "test": { + "presets": [ + "@babel/preset-env" + ] + } + }, + "plugins": [ + [ + "babel-plugin-relative-path-import", + { + "paths": [ + { + "rootPathPrefix": "@", + "rootPathSuffix": "src" + } + ] + } + ] + ] +} \ No newline at end of file diff --git a/backend/.eslintrc.json b/backend/.eslintrc.json new file mode 100644 index 000000000..919fea0ca --- /dev/null +++ b/backend/.eslintrc.json @@ -0,0 +1,15 @@ +{ + "ignorePatterns": ["*.min.js", "src/vendor/*.js"], + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + } +} diff --git a/backend/.prettierrc.json b/backend/.prettierrc.json new file mode 100644 index 000000000..984872170 --- /dev/null +++ b/backend/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4, + "bracketSpacing": true +} diff --git a/backend/banner b/backend/banner new file mode 100644 index 000000000..53a7f6b64 --- /dev/null +++ b/backend/banner @@ -0,0 +1,15 @@ +/** + * ███████╗██╗ ██╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗ + * ██╔════╝██║ ██║██╔══██╗ ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔════╝ + * ███████╗██║ ██║██████╔╝█████╗███████╗ ██║ ██║ ██║██████╔╝█████╗ + * ╚════██║██║ ██║██╔══██╗╚════╝╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ + * ███████║╚██████╔╝██████╔╝ ███████║ ██║ ╚██████╔╝██║ ██║███████╗ + * ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + * Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket! + * @updated: <%= updated %> + * @version: <%= pkg.version %> + * @author: Peng-YM + * @github: https://github.com/sub-store-org/Sub-Store + * @documentation: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 + */ + diff --git a/backend/bundle.js b/backend/bundle.js new file mode 100644 index 000000000..da61dedbc --- /dev/null +++ b/backend/bundle.js @@ -0,0 +1,25 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const { build } = require('esbuild'); + +let content = fs.readFileSync(path.join(__dirname, 'sub-store.min.js'), { + encoding: 'utf8', +}); +content = content.replace( + /eval\(('|")(require\(('|").*?('|")\))('|")\)/g, + '$2', +); +fs.writeFileSync(path.join(__dirname, 'dist/sub-store.no-bundle.js'), content, { + encoding: 'utf8', +}); + +build({ + entryPoints: ['dist/sub-store.no-bundle.js'], + bundle: true, + minify: true, + sourcemap: true, + platform: 'node', + format: 'cjs', + outfile: 'dist/sub-store.bundle.js', +}); diff --git a/backend/dist/.gitkeep b/backend/dist/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/backend/gulpfile.babel.js b/backend/gulpfile.babel.js new file mode 100644 index 000000000..d865f71c9 --- /dev/null +++ b/backend/gulpfile.babel.js @@ -0,0 +1,118 @@ +import fs from 'fs'; +import browserify from 'browserify'; +import gulp from 'gulp'; +import prettier from 'gulp-prettier'; +import header from 'gulp-header'; +import eslint from 'gulp-eslint-new'; +import newFile from 'gulp-file'; +import path from 'path'; +import tap from 'gulp-tap'; + +import pkg from './package.json'; + +export function peggy() { + return gulp.src('src/**/*.peg').pipe( + tap(function (file) { + const filename = path.basename(file.path).split('.')[0] + '.js'; + const raw = fs.readFileSync(file.path, 'utf8'); + const contents = `import * as peggy from 'peggy'; +const grammars = String.raw\`\n${raw}\n\`; +let parser; +export default function getParser() { + if (!parser) { + parser = peggy.generate(grammars); + } + return parser; +}\n`; + return newFile(filename, contents).pipe( + gulp.dest(path.dirname(file.path)), + ); + }), + ); +} + +export function lint() { + return gulp + .src('src/**/*.js') + .pipe(eslint({ fix: true })) + .pipe(eslint.fix()) + .pipe(eslint.format()) + .pipe(eslint.failAfterError()); +} + +export function styles() { + return gulp + .src('src/**/*.js') + .pipe( + prettier({ + singleQuote: true, + trailingComma: 'all', + tabWidth: 4, + bracketSpacing: true, + }), + ) + .pipe(gulp.dest((file) => file.base)); +} + +function scripts(src, dest) { + return () => { + return browserify(src) + .transform('babelify', { + presets: [['@babel/preset-env']], + plugins: [ + [ + 'babel-plugin-relative-path-import', + { + paths: [ + { + rootPathPrefix: '@', + rootPathSuffix: 'src', + }, + ], + }, + ], + ], + }) + .plugin('tinyify') + .bundle() + .pipe(fs.createWriteStream(dest)); + }; +} + +function banner(dest) { + return () => + gulp + .src(dest) + .pipe( + header(fs.readFileSync('./banner', 'utf-8'), { + pkg, + updated: new Date().toLocaleString('zh-CN'), + }), + ) + .pipe(gulp.dest((file) => file.base)); +} + +const artifacts = [ + { src: 'src/main.js', dest: 'sub-store.min.js' }, + { + src: 'src/products/resource-parser.loon.js', + dest: 'dist/sub-store-parser.loon.min.js', + }, + { + src: 'src/products/cron-sync-artifacts.js', + dest: 'dist/cron-sync-artifacts.min.js', + }, + { src: 'src/products/sub-store-0.js', dest: 'dist/sub-store-0.min.js' }, + { src: 'src/products/sub-store-1.js', dest: 'dist/sub-store-1.min.js' }, +]; + +export const build = gulp.series( + gulp.parallel( + artifacts.map((artifact) => scripts(artifact.src, artifact.dest)), + ), + gulp.parallel(artifacts.map((artifact) => banner(artifact.dest))), +); + +const all = gulp.series(peggy, lint, styles, build); + +export default all; diff --git a/backend/jsconfig.json b/backend/jsconfig.json new file mode 100644 index 000000000..df83de409 --- /dev/null +++ b/backend/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + } +} \ No newline at end of file diff --git a/backend/package.json b/backend/package.json index c5780687e..990d6638f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,11 +1,59 @@ { - "name": "sub-store-backend", - "version": "0.0.1", - "description": "Advanced Subscription Manager for QX, Loon, and Surge.", - "main": "sub-store.js", + "name": "sub-store", + "version": "2.14.155", + "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", + "main": "src/main.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "preinstall": "npx only-allow pnpm", + "test": "gulp peggy && npx cross-env BABEL_ENV=test mocha src/test/**/*.spec.js --require @babel/register --recursive", + "serve": "node sub-store.min.js", + "start": "nodemon -w src -w package.json --exec babel-node src/main.js", + "build": "gulp", + "bundle": "node bundle.js" }, - "author": "", - "license": "GPL" -} + "author": "Peng-YM", + "license": "GPL-3.0", + "dependencies": { + "automerge": "1.0.1-preview.7", + "body-parser": "^1.19.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.17.1", + "http-proxy-middleware": "^2.0.6", + "js-base64": "^3.7.2", + "lodash": "^4.17.21", + "nunjucks": "^3.2.4", + "request": "^2.88.2", + "requests": "^0.3.0", + "semver": "^7.3.7", + "static-js-yaml": "^1.0.0", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@babel/core": "^7.18.0", + "@babel/node": "^7.17.10", + "@babel/preset-env": "^7.18.0", + "@babel/register": "^7.17.7", + "@types/gulp": "^4.0.9", + "axios": "^0.21.2", + "babel-plugin-relative-path-import": "^2.0.1", + "babelify": "^10.0.0", + "browser-pack-flat": "^3.4.2", + "browserify": "^17.0.0", + "chai": "^4.3.6", + "esbuild": "^0.19.8", + "eslint": "^8.16.0", + "gulp": "^4.0.2", + "gulp-babel": "^8.0.0", + "gulp-eslint-new": "^1.4.4", + "gulp-file": "^0.4.0", + "gulp-header": "^2.0.9", + "gulp-prettier": "^4.0.0", + "gulp-tap": "^2.0.0", + "mocha": "^10.0.0", + "nodemon": "^2.0.16", + "peggy": "^2.0.1", + "prettier": "2.6.2", + "prettier-plugin-sort-imports": "^1.6.1", + "tinyify": "^3.0.0" + } +} \ No newline at end of file diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml new file mode 100644 index 000000000..0da977580 --- /dev/null +++ b/backend/pnpm-lock.yaml @@ -0,0 +1,10290 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + automerge: + specifier: 1.0.1-preview.7 + version: registry.npmmirror.com/automerge@1.0.1-preview.7 + body-parser: + specifier: ^1.19.0 + version: registry.npmmirror.com/body-parser@1.19.0 + connect-history-api-fallback: + specifier: ^2.0.0 + version: registry.npmmirror.com/connect-history-api-fallback@2.0.0 + express: + specifier: ^4.17.1 + version: registry.npmmirror.com/express@4.17.1 + http-proxy-middleware: + specifier: ^2.0.6 + version: registry.npmmirror.com/http-proxy-middleware@2.0.6 + js-base64: + specifier: ^3.7.2 + version: registry.npmmirror.com/js-base64@3.7.2 + lodash: + specifier: ^4.17.21 + version: registry.npmmirror.com/lodash@4.17.21 + nunjucks: + specifier: ^3.2.4 + version: registry.npmmirror.com/nunjucks@3.2.4 + request: + specifier: ^2.88.2 + version: registry.npmmirror.com/request@2.88.2 + requests: + specifier: ^0.3.0 + version: registry.npmmirror.com/requests@0.3.0 + semver: + specifier: ^7.3.7 + version: registry.npmmirror.com/semver@7.3.7 + static-js-yaml: + specifier: ^1.0.0 + version: registry.npmmirror.com/static-js-yaml@1.0.0 + uuid: + specifier: ^8.3.2 + version: registry.npmmirror.com/uuid@8.3.2 + +devDependencies: + '@babel/core': + specifier: ^7.18.0 + version: registry.npmmirror.com/@babel/core@7.18.0 + '@babel/node': + specifier: ^7.17.10 + version: registry.npmmirror.com/@babel/node@7.17.10(@babel/core@7.18.0) + '@babel/preset-env': + specifier: ^7.18.0 + version: registry.npmmirror.com/@babel/preset-env@7.18.0(@babel/core@7.18.0) + '@babel/register': + specifier: ^7.17.7 + version: registry.npmmirror.com/@babel/register@7.17.7(@babel/core@7.18.0) + '@types/gulp': + specifier: ^4.0.9 + version: registry.npmmirror.com/@types/gulp@4.0.9 + axios: + specifier: ^0.21.2 + version: 0.21.2 + babel-plugin-relative-path-import: + specifier: ^2.0.1 + version: registry.npmmirror.com/babel-plugin-relative-path-import@2.0.1 + babelify: + specifier: ^10.0.0 + version: registry.npmmirror.com/babelify@10.0.0(@babel/core@7.18.0) + browser-pack-flat: + specifier: ^3.4.2 + version: registry.npmmirror.com/browser-pack-flat@3.4.2 + browserify: + specifier: ^17.0.0 + version: registry.npmmirror.com/browserify@17.0.0 + chai: + specifier: ^4.3.6 + version: registry.npmmirror.com/chai@4.3.6 + esbuild: + specifier: ^0.19.8 + version: registry.npmmirror.com/esbuild@0.19.8 + eslint: + specifier: ^8.16.0 + version: registry.npmmirror.com/eslint@8.16.0 + gulp: + specifier: ^4.0.2 + version: registry.npmmirror.com/gulp@4.0.2 + gulp-babel: + specifier: ^8.0.0 + version: registry.npmmirror.com/gulp-babel@8.0.0(@babel/core@7.18.0) + gulp-eslint-new: + specifier: ^1.4.4 + version: registry.npmmirror.com/gulp-eslint-new@1.4.4 + gulp-file: + specifier: ^0.4.0 + version: registry.npmmirror.com/gulp-file@0.4.0 + gulp-header: + specifier: ^2.0.9 + version: registry.npmmirror.com/gulp-header@2.0.9 + gulp-prettier: + specifier: ^4.0.0 + version: registry.npmmirror.com/gulp-prettier@4.0.0 + gulp-tap: + specifier: ^2.0.0 + version: registry.npmmirror.com/gulp-tap@2.0.0 + mocha: + specifier: ^10.0.0 + version: registry.npmmirror.com/mocha@10.0.0 + nodemon: + specifier: ^2.0.16 + version: registry.npmmirror.com/nodemon@2.0.16 + peggy: + specifier: ^2.0.1 + version: registry.npmmirror.com/peggy@2.0.1 + prettier: + specifier: 2.6.2 + version: registry.npmmirror.com/prettier@2.6.2 + prettier-plugin-sort-imports: + specifier: ^1.6.1 + version: registry.npmmirror.com/prettier-plugin-sort-imports@1.6.1 + tinyify: + specifier: ^3.0.0 + version: registry.npmmirror.com/tinyify@3.0.0 + +packages: + + /@esbuild/android-arm64@0.19.8: + resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.8: + resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.8: + resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.8: + resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.8: + resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.8: + resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.8: + resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.8: + resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.8: + resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.8: + resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.8: + resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.8: + resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.8: + resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.8: + resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.8: + resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.8: + resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.8: + resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.8: + resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.8: + resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.8: + resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.8: + resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.8: + resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /axios@0.21.2: + resolution: {integrity: sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg==} + dependencies: + follow-redirects: 1.15.5 + transitivePeerDependencies: + - debug + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + dev: true + optional: true + + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.15.0 + dev: true + optional: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /nan@2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + requiresBuild: true + dev: true + optional: true + + /source-map@0.1.43: + resolution: {integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + amdefine: registry.npmmirror.com/amdefine@1.0.1 + dev: false + optional: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + requiresBuild: true + optional: true + + registry.npmmirror.com/@ampproject/remapping@2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz} + name: '@ampproject/remapping' + version: 2.2.0 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.1.1 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.13 + dev: true + + registry.npmmirror.com/@babel/code-frame@7.16.7: + resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.16.7.tgz} + name: '@babel/code-frame' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': registry.npmmirror.com/@babel/highlight@7.17.12 + dev: true + + registry.npmmirror.com/@babel/compat-data@7.17.10: + resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.17.10.tgz} + name: '@babel/compat-data' + version: 7.17.10 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/core@7.18.0: + resolution: {integrity: sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.18.0.tgz} + name: '@babel/core' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping@2.2.0 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.16.7 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.18.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.17.10(@babel/core@7.18.0) + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.18.0 + '@babel/helpers': registry.npmmirror.com/@babel/helpers@7.18.0 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.18.0 + '@babel/template': registry.npmmirror.com/@babel/template@7.16.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + gensync: registry.npmmirror.com/gensync@1.0.0-beta.2 + json5: registry.npmmirror.com/json5@2.2.1 + semver: registry.npmmirror.com/semver@6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/generator@7.18.0: + resolution: {integrity: sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.18.0.tgz} + name: '@babel/generator' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.1 + jsesc: registry.npmmirror.com/jsesc@2.5.2 + dev: true + + registry.npmmirror.com/@babel/helper-annotate-as-pure@7.16.7: + resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz} + name: '@babel/helper-annotate-as-pure' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor@7.16.7: + resolution: {integrity: sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz} + name: '@babel/helper-builder-binary-assignment-operator-visitor' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': registry.npmmirror.com/@babel/helper-explode-assignable-expression@7.16.7 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-compilation-targets@7.17.10(@babel/core@7.18.0): + resolution: {integrity: sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz} + id: registry.npmmirror.com/@babel/helper-compilation-targets/7.17.10 + name: '@babel/helper-compilation-targets' + version: 7.17.10 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.17.10 + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option@7.16.7 + browserslist: registry.npmmirror.com/browserslist@4.20.3 + semver: registry.npmmirror.com/semver@6.3.0 + dev: true + + registry.npmmirror.com/@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz} + id: registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.18.0 + name: '@babel/helper-create-class-features-plugin' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure@7.16.7 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.16.7 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.17.9 + '@babel/helper-member-expression-to-functions': registry.npmmirror.com/@babel/helper-member-expression-to-functions@7.17.7 + '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression@7.16.7 + '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers@7.16.7 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-create-regexp-features-plugin@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz} + id: registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/7.17.12 + name: '@babel/helper-create-regexp-features-plugin' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure@7.16.7 + regexpu-core: registry.npmmirror.com/regexpu-core@5.0.1 + dev: true + + registry.npmmirror.com/@babel/helper-define-polyfill-provider@0.3.1(@babel/core@7.18.0): + resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz} + id: registry.npmmirror.com/@babel/helper-define-polyfill-provider/0.3.1 + name: '@babel/helper-define-polyfill-provider' + version: 0.3.1 + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.17.10(@babel/core@7.18.0) + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports@7.16.7 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.18.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + lodash.debounce: registry.npmmirror.com/lodash.debounce@4.0.8 + resolve: registry.npmmirror.com/resolve@1.22.0 + semver: registry.npmmirror.com/semver@6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-environment-visitor@7.16.7: + resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz} + name: '@babel/helper-environment-visitor' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-explode-assignable-expression@7.16.7: + resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz} + name: '@babel/helper-explode-assignable-expression' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-function-name@7.17.9: + resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz} + name: '@babel/helper-function-name' + version: 7.17.9 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template@7.16.7 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-hoist-variables@7.16.7: + resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz} + name: '@babel/helper-hoist-variables' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-member-expression-to-functions@7.17.7: + resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz} + name: '@babel/helper-member-expression-to-functions' + version: 7.17.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-module-imports@7.16.7: + resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz} + name: '@babel/helper-module-imports' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-module-transforms@7.18.0: + resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz} + name: '@babel/helper-module-transforms' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.16.7 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports@7.16.7 + '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access@7.17.7 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.16.7 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.16.7 + '@babel/template': registry.npmmirror.com/@babel/template@7.16.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-optimise-call-expression@7.16.7: + resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz} + name: '@babel/helper-optimise-call-expression' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12: + resolution: {integrity: sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz} + name: '@babel/helper-plugin-utils' + version: 7.17.12 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-remap-async-to-generator@7.16.8: + resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz} + name: '@babel/helper-remap-async-to-generator' + version: 7.16.8 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure@7.16.7 + '@babel/helper-wrap-function': registry.npmmirror.com/@babel/helper-wrap-function@7.16.8 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-replace-supers@7.16.7: + resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz} + name: '@babel/helper-replace-supers' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.16.7 + '@babel/helper-member-expression-to-functions': registry.npmmirror.com/@babel/helper-member-expression-to-functions@7.17.7 + '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression@7.16.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helper-simple-access@7.17.7: + resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz} + name: '@babel/helper-simple-access' + version: 7.17.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers@7.16.0: + resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz} + name: '@babel/helper-skip-transparent-expression-wrappers' + version: 7.16.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-split-export-declaration@7.16.7: + resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz} + name: '@babel/helper-split-export-declaration' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/helper-validator-identifier@7.16.7: + resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz} + name: '@babel/helper-validator-identifier' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-validator-option@7.16.7: + resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz} + name: '@babel/helper-validator-option' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-wrap-function@7.16.8: + resolution: {integrity: sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz} + name: '@babel/helper-wrap-function' + version: 7.16.8 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.17.9 + '@babel/template': registry.npmmirror.com/@babel/template@7.16.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/helpers@7.18.0: + resolution: {integrity: sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.18.0.tgz} + name: '@babel/helpers' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template@7.16.7 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/highlight@7.17.12: + resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.17.12.tgz} + name: '@babel/highlight' + version: 7.17.12 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.16.7 + chalk: registry.npmmirror.com/chalk@2.4.2 + js-tokens: registry.npmmirror.com/js-tokens@4.0.0 + dev: true + + registry.npmmirror.com/@babel/node@7.17.10(@babel/core@7.18.0): + resolution: {integrity: sha512-sFFMyvw23U8QOcTnLJnw2/Myr01e4+iLVy7rHAHrNSnXAfnwS3j2NqihpmZm7TotyNKKf/y8cJ96T5asY46eyw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/node/-/node-7.17.10.tgz} + id: registry.npmmirror.com/@babel/node/7.17.10 + name: '@babel/node' + version: 7.17.10 + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/register': registry.npmmirror.com/@babel/register@7.17.7(@babel/core@7.18.0) + commander: registry.npmmirror.com/commander@4.1.1 + core-js: registry.npmmirror.com/core-js@3.22.6 + node-environment-flags: registry.npmmirror.com/node-environment-flags@1.0.6 + regenerator-runtime: registry.npmmirror.com/regenerator-runtime@0.13.9 + v8flags: registry.npmmirror.com/v8flags@3.2.0 + dev: true + + registry.npmmirror.com/@babel/parser@7.18.0: + resolution: {integrity: sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.18.0.tgz} + name: '@babel/parser' + version: 7.18.0 + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.17.12 + name: '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.17.12 + name: '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers@7.16.0 + '@babel/plugin-proposal-optional-chaining': registry.npmmirror.com/@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/7.17.12 + name: '@babel/plugin-proposal-async-generator-functions' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-remap-async-to-generator': registry.npmmirror.com/@babel/helper-remap-async-to-generator@7.16.8 + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.0) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-class-properties@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-class-properties/7.17.12 + name: '@babel/plugin-proposal-class-properties' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-class-static-block@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-class-static-block/7.18.0 + name: '@babel/plugin-proposal-class-static-block' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-class-static-block': registry.npmmirror.com/@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.18.0) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-dynamic-import@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/7.16.7 + name: '@babel/plugin-proposal-dynamic-import' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-dynamic-import': registry.npmmirror.com/@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/7.17.12 + name: '@babel/plugin-proposal-export-namespace-from' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-export-namespace-from': registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-json-strings@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-json-strings/7.17.12 + name: '@babel/plugin-proposal-json-strings' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/7.17.12 + name: '@babel/plugin-proposal-logical-assignment-operators' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/7.17.12 + name: '@babel/plugin-proposal-nullish-coalescing-operator' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-numeric-separator@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/7.16.7 + name: '@babel/plugin-proposal-numeric-separator' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/7.18.0 + name: '@babel/plugin-proposal-object-rest-spread' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.17.10 + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.17.10(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.0) + '@babel/plugin-transform-parameters': registry.npmmirror.com/@babel/plugin-transform-parameters@7.17.12(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/7.16.7 + name: '@babel/plugin-proposal-optional-catch-binding' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/7.17.12 + name: '@babel/plugin-proposal-optional-chaining' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers@7.16.0 + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.0) + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-private-methods@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-private-methods/7.17.12 + name: '@babel/plugin-proposal-private-methods' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/7.17.12 + name: '@babel/plugin-proposal-private-property-in-object' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure@7.16.7 + '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin@7.18.0(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-syntax-private-property-in-object': registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.18.0) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/7.17.12 + name: '@babel/plugin-proposal-unicode-property-regex' + version: 7.17.12 + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin@7.17.12(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 + name: '@babel/plugin-syntax-async-generators' + version: 7.8.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 + name: '@babel/plugin-syntax-class-properties' + version: 7.12.13 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.18.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-class-static-block/7.14.5 + name: '@babel/plugin-syntax-class-static-block' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/7.8.3 + name: '@babel/plugin-syntax-dynamic-import' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/7.8.3 + name: '@babel/plugin-syntax-export-namespace-from' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-import-assertions@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-import-assertions/7.17.12 + name: '@babel/plugin-syntax-import-assertions' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 + name: '@babel/plugin-syntax-json-strings' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 + name: '@babel/plugin-syntax-logical-assignment-operators' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 + name: '@babel/plugin-syntax-nullish-coalescing-operator' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 + name: '@babel/plugin-syntax-numeric-separator' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 + name: '@babel/plugin-syntax-object-rest-spread' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 + name: '@babel/plugin-syntax-optional-catch-binding' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 + name: '@babel/plugin-syntax-optional-chaining' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.18.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/7.14.5 + name: '@babel/plugin-syntax-private-property-in-object' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 + name: '@babel/plugin-syntax-top-level-await' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-arrow-functions@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-arrow-functions/7.17.12 + name: '@babel/plugin-transform-arrow-functions' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-async-to-generator@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-async-to-generator/7.17.12 + name: '@babel/plugin-transform-async-to-generator' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports@7.16.7 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-remap-async-to-generator': registry.npmmirror.com/@babel/helper-remap-async-to-generator@7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/7.16.7 + name: '@babel/plugin-transform-block-scoped-functions' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-block-scoping@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-block-scoping/7.17.12 + name: '@babel/plugin-transform-block-scoping' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-classes@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-classes/7.17.12 + name: '@babel/plugin-transform-classes' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure@7.16.7 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.16.7 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.17.9 + '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression@7.16.7 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers@7.16.7 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.16.7 + globals: registry.npmmirror.com/globals@11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-computed-properties@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-computed-properties/7.17.12 + name: '@babel/plugin-transform-computed-properties' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-destructuring@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-destructuring/7.18.0 + name: '@babel/plugin-transform-destructuring' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-dotall-regex@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-dotall-regex/7.16.7 + name: '@babel/plugin-transform-dotall-regex' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin@7.17.12(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-duplicate-keys@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/7.17.12 + name: '@babel/plugin-transform-duplicate-keys' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/7.16.7 + name: '@babel/plugin-transform-exponentiation-operator' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-builder-binary-assignment-operator-visitor': registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor@7.16.7 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-for-of@7.18.1(@babel/core@7.18.0): + resolution: {integrity: sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-for-of/7.18.1 + name: '@babel/plugin-transform-for-of' + version: 7.18.1 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-function-name@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-function-name/7.16.7 + name: '@babel/plugin-transform-function-name' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.17.10(@babel/core@7.18.0) + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.17.9 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-literals@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-literals/7.17.12 + name: '@babel/plugin-transform-literals' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-member-expression-literals@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/7.16.7 + name: '@babel/plugin-transform-member-expression-literals' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-amd@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-amd/7.18.0 + name: '@babel/plugin-transform-modules-amd' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + babel-plugin-dynamic-import-node: registry.npmmirror.com/babel-plugin-dynamic-import-node@2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-commonjs@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/7.18.0 + name: '@babel/plugin-transform-modules-commonjs' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access@7.17.7 + babel-plugin-dynamic-import-node: registry.npmmirror.com/babel-plugin-dynamic-import-node@2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-systemjs@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/7.18.0 + name: '@babel/plugin-transform-modules-systemjs' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables@7.16.7 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.16.7 + babel-plugin-dynamic-import-node: registry.npmmirror.com/babel-plugin-dynamic-import-node@2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-modules-umd@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-modules-umd/7.18.0 + name: '@babel/plugin-transform-modules-umd' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/7.17.12 + name: '@babel/plugin-transform-named-capturing-groups-regex' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin@7.17.12(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-new-target@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-new-target/7.17.12 + name: '@babel/plugin-transform-new-target' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-object-super@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-object-super/7.16.7 + name: '@babel/plugin-transform-object-super' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers@7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/plugin-transform-parameters@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-parameters/7.17.12 + name: '@babel/plugin-transform-parameters' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-property-literals@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-property-literals/7.16.7 + name: '@babel/plugin-transform-property-literals' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-regenerator@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-regenerator/7.18.0 + name: '@babel/plugin-transform-regenerator' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + regenerator-transform: registry.npmmirror.com/regenerator-transform@0.15.0 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-reserved-words@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-reserved-words/7.17.12 + name: '@babel/plugin-transform-reserved-words' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-shorthand-properties@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/7.16.7 + name: '@babel/plugin-transform-shorthand-properties' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-spread@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-spread/7.17.12 + name: '@babel/plugin-transform-spread' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-skip-transparent-expression-wrappers': registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers@7.16.0 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-sticky-regex@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-sticky-regex/7.16.7 + name: '@babel/plugin-transform-sticky-regex' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-template-literals@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-template-literals/7.17.12 + name: '@babel/plugin-transform-template-literals' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-typeof-symbol@7.17.12(@babel/core@7.18.0): + resolution: {integrity: sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/7.17.12 + name: '@babel/plugin-transform-typeof-symbol' + version: 7.17.12 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-unicode-escapes@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/7.16.7 + name: '@babel/plugin-transform-unicode-escapes' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/plugin-transform-unicode-regex@7.16.7(@babel/core@7.18.0): + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz} + id: registry.npmmirror.com/@babel/plugin-transform-unicode-regex/7.16.7 + name: '@babel/plugin-transform-unicode-regex' + version: 7.16.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-create-regexp-features-plugin': registry.npmmirror.com/@babel/helper-create-regexp-features-plugin@7.17.12(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + dev: true + + registry.npmmirror.com/@babel/preset-env@7.18.0(@babel/core@7.18.0): + resolution: {integrity: sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.18.0.tgz} + id: registry.npmmirror.com/@babel/preset-env/7.18.0 + name: '@babel/preset-env' + version: 7.18.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.17.10 + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.17.10(@babel/core@7.18.0) + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option@7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.17.12(@babel/core@7.18.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-async-generator-functions': registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-class-properties': registry.npmmirror.com/@babel/plugin-proposal-class-properties@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-class-static-block': registry.npmmirror.com/@babel/plugin-proposal-class-static-block@7.18.0(@babel/core@7.18.0) + '@babel/plugin-proposal-dynamic-import': registry.npmmirror.com/@babel/plugin-proposal-dynamic-import@7.16.7(@babel/core@7.18.0) + '@babel/plugin-proposal-export-namespace-from': registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-json-strings': registry.npmmirror.com/@babel/plugin-proposal-json-strings@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-numeric-separator': registry.npmmirror.com/@babel/plugin-proposal-numeric-separator@7.16.7(@babel/core@7.18.0) + '@babel/plugin-proposal-object-rest-spread': registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread@7.18.0(@babel/core@7.18.0) + '@babel/plugin-proposal-optional-catch-binding': registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding@7.16.7(@babel/core@7.18.0) + '@babel/plugin-proposal-optional-chaining': registry.npmmirror.com/@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-private-methods': registry.npmmirror.com/@babel/plugin-proposal-private-methods@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-private-property-in-object': registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object@7.17.12(@babel/core@7.18.0) + '@babel/plugin-proposal-unicode-property-regex': registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex@7.17.12(@babel/core@7.18.0) + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.0) + '@babel/plugin-syntax-class-properties': registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.0) + '@babel/plugin-syntax-class-static-block': registry.npmmirror.com/@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.18.0) + '@babel/plugin-syntax-dynamic-import': registry.npmmirror.com/@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-export-namespace-from': registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-import-assertions': registry.npmmirror.com/@babel/plugin-syntax-import-assertions@7.17.12(@babel/core@7.18.0) + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.0) + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.0) + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.0) + '@babel/plugin-syntax-private-property-in-object': registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.18.0) + '@babel/plugin-syntax-top-level-await': registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.0) + '@babel/plugin-transform-arrow-functions': registry.npmmirror.com/@babel/plugin-transform-arrow-functions@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-async-to-generator': registry.npmmirror.com/@babel/plugin-transform-async-to-generator@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-block-scoped-functions': registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-block-scoping': registry.npmmirror.com/@babel/plugin-transform-block-scoping@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-classes': registry.npmmirror.com/@babel/plugin-transform-classes@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-computed-properties': registry.npmmirror.com/@babel/plugin-transform-computed-properties@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-destructuring': registry.npmmirror.com/@babel/plugin-transform-destructuring@7.18.0(@babel/core@7.18.0) + '@babel/plugin-transform-dotall-regex': registry.npmmirror.com/@babel/plugin-transform-dotall-regex@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-duplicate-keys': registry.npmmirror.com/@babel/plugin-transform-duplicate-keys@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-exponentiation-operator': registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-for-of': registry.npmmirror.com/@babel/plugin-transform-for-of@7.18.1(@babel/core@7.18.0) + '@babel/plugin-transform-function-name': registry.npmmirror.com/@babel/plugin-transform-function-name@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-literals': registry.npmmirror.com/@babel/plugin-transform-literals@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-member-expression-literals': registry.npmmirror.com/@babel/plugin-transform-member-expression-literals@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-modules-amd': registry.npmmirror.com/@babel/plugin-transform-modules-amd@7.18.0(@babel/core@7.18.0) + '@babel/plugin-transform-modules-commonjs': registry.npmmirror.com/@babel/plugin-transform-modules-commonjs@7.18.0(@babel/core@7.18.0) + '@babel/plugin-transform-modules-systemjs': registry.npmmirror.com/@babel/plugin-transform-modules-systemjs@7.18.0(@babel/core@7.18.0) + '@babel/plugin-transform-modules-umd': registry.npmmirror.com/@babel/plugin-transform-modules-umd@7.18.0(@babel/core@7.18.0) + '@babel/plugin-transform-named-capturing-groups-regex': registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-new-target': registry.npmmirror.com/@babel/plugin-transform-new-target@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-object-super': registry.npmmirror.com/@babel/plugin-transform-object-super@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-parameters': registry.npmmirror.com/@babel/plugin-transform-parameters@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-property-literals': registry.npmmirror.com/@babel/plugin-transform-property-literals@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-regenerator': registry.npmmirror.com/@babel/plugin-transform-regenerator@7.18.0(@babel/core@7.18.0) + '@babel/plugin-transform-reserved-words': registry.npmmirror.com/@babel/plugin-transform-reserved-words@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-shorthand-properties': registry.npmmirror.com/@babel/plugin-transform-shorthand-properties@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-spread': registry.npmmirror.com/@babel/plugin-transform-spread@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-sticky-regex': registry.npmmirror.com/@babel/plugin-transform-sticky-regex@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-template-literals': registry.npmmirror.com/@babel/plugin-transform-template-literals@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-typeof-symbol': registry.npmmirror.com/@babel/plugin-transform-typeof-symbol@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-unicode-escapes': registry.npmmirror.com/@babel/plugin-transform-unicode-escapes@7.16.7(@babel/core@7.18.0) + '@babel/plugin-transform-unicode-regex': registry.npmmirror.com/@babel/plugin-transform-unicode-regex@7.16.7(@babel/core@7.18.0) + '@babel/preset-modules': registry.npmmirror.com/@babel/preset-modules@0.1.5(@babel/core@7.18.0) + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + babel-plugin-polyfill-corejs2: registry.npmmirror.com/babel-plugin-polyfill-corejs2@0.3.1(@babel/core@7.18.0) + babel-plugin-polyfill-corejs3: registry.npmmirror.com/babel-plugin-polyfill-corejs3@0.5.2(@babel/core@7.18.0) + babel-plugin-polyfill-regenerator: registry.npmmirror.com/babel-plugin-polyfill-regenerator@0.3.1(@babel/core@7.18.0) + core-js-compat: registry.npmmirror.com/core-js-compat@3.22.6 + semver: registry.npmmirror.com/semver@6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/preset-modules@0.1.5(@babel/core@7.18.0): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz} + id: registry.npmmirror.com/@babel/preset-modules/0.1.5 + name: '@babel/preset-modules' + version: 0.1.5 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.17.12 + '@babel/plugin-proposal-unicode-property-regex': registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex@7.17.12(@babel/core@7.18.0) + '@babel/plugin-transform-dotall-regex': registry.npmmirror.com/@babel/plugin-transform-dotall-regex@7.16.7(@babel/core@7.18.0) + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + dev: true + + registry.npmmirror.com/@babel/register@7.17.7(@babel/core@7.18.0): + resolution: {integrity: sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/register/-/register-7.17.7.tgz} + id: registry.npmmirror.com/@babel/register/7.17.7 + name: '@babel/register' + version: 7.17.7 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + clone-deep: registry.npmmirror.com/clone-deep@4.0.1 + find-cache-dir: registry.npmmirror.com/find-cache-dir@2.1.0 + make-dir: registry.npmmirror.com/make-dir@2.1.0 + pirates: registry.npmmirror.com/pirates@4.0.5 + source-map-support: registry.npmmirror.com/source-map-support@0.5.21 + dev: true + + registry.npmmirror.com/@babel/runtime@7.18.0: + resolution: {integrity: sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.0.tgz} + name: '@babel/runtime' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: registry.npmmirror.com/regenerator-runtime@0.13.9 + dev: true + + registry.npmmirror.com/@babel/template@7.16.7: + resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.16.7.tgz} + name: '@babel/template' + version: 7.16.7 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.16.7 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + dev: true + + registry.npmmirror.com/@babel/traverse@7.18.0: + resolution: {integrity: sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.18.0.tgz} + name: '@babel/traverse' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.16.7 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.18.0 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.16.7 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.17.9 + '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables@7.16.7 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.16.7 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.18.0 + '@babel/types': registry.npmmirror.com/@babel/types@7.18.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globals: registry.npmmirror.com/globals@11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/types@7.18.0: + resolution: {integrity: sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.18.0.tgz} + name: '@babel/types' + version: 7.18.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.16.7 + to-fast-properties: registry.npmmirror.com/to-fast-properties@2.0.0 + dev: true + + registry.npmmirror.com/@eslint/eslintrc@1.3.0: + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz} + name: '@eslint/eslintrc' + version: 1.3.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: registry.npmmirror.com/ajv@6.12.4 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + espree: registry.npmmirror.com/espree@9.3.2 + globals: registry.npmmirror.com/globals@13.15.0 + ignore: registry.npmmirror.com/ignore@5.2.0 + import-fresh: registry.npmmirror.com/import-fresh@3.3.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@goto-bus-stop/common-shake@2.4.0: + resolution: {integrity: sha512-LO+7v+UbxE3IyAS4Suf/KYB7Zq9DEIHibwDe6Wph4apNEfDyyxP7BSxzRS/Qa9lUH5gsm9eL9nF8EE1E0/nQkQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@goto-bus-stop/common-shake/-/common-shake-2.4.0.tgz} + name: '@goto-bus-stop/common-shake' + version: 2.4.0 + dependencies: + acorn-walk: registry.npmmirror.com/acorn-walk@7.2.0 + debug: registry.npmmirror.com/debug@3.2.7(supports-color@5.5.0) + escope: registry.npmmirror.com/escope@3.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@goto-bus-stop/envify@5.0.0: + resolution: {integrity: sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@goto-bus-stop/envify/-/envify-5.0.0.tgz} + name: '@goto-bus-stop/envify' + version: 5.0.0 + hasBin: true + dependencies: + acorn-node: registry.npmmirror.com/acorn-node@2.0.1 + dash-ast: registry.npmmirror.com/dash-ast@2.0.1 + multisplice: registry.npmmirror.com/multisplice@1.0.0 + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/@humanwhocodes/config-array@0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz} + name: '@humanwhocodes/config-array' + version: 0.9.5 + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': registry.npmmirror.com/@humanwhocodes/object-schema@1.2.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + minimatch: registry.npmmirror.com/minimatch@3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz} + name: '@humanwhocodes/object-schema' + version: 1.2.1 + dev: true + + registry.npmmirror.com/@jridgewell/gen-mapping@0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz} + name: '@jridgewell/gen-mapping' + version: 0.1.1 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array@1.1.1 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.13 + dev: true + + registry.npmmirror.com/@jridgewell/gen-mapping@0.3.1: + resolution: {integrity: sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz} + name: '@jridgewell/gen-mapping' + version: 0.3.1 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array@1.1.1 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.13 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.13 + dev: true + + registry.npmmirror.com/@jridgewell/resolve-uri@3.0.7: + resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz} + name: '@jridgewell/resolve-uri' + version: 3.0.7 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmmirror.com/@jridgewell/set-array@1.1.1: + resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.1.tgz} + name: '@jridgewell/set-array' + version: 1.1.1 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.13: + resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz} + name: '@jridgewell/sourcemap-codec' + version: 1.4.13 + dev: true + + registry.npmmirror.com/@jridgewell/trace-mapping@0.3.13: + resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz} + name: '@jridgewell/trace-mapping' + version: 0.3.13 + dependencies: + '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri@3.0.7 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.13 + dev: true + + registry.npmmirror.com/@sindresorhus/is@0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz} + name: '@sindresorhus/is' + version: 0.14.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/@szmarczak/http-timer@1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz} + name: '@szmarczak/http-timer' + version: 1.1.2 + engines: {node: '>=6'} + dependencies: + defer-to-connect: registry.npmmirror.com/defer-to-connect@1.1.3 + dev: true + + registry.npmmirror.com/@types/eslint@8.4.2: + resolution: {integrity: sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/eslint/-/eslint-8.4.2.tgz} + name: '@types/eslint' + version: 8.4.2 + dependencies: + '@types/estree': registry.npmmirror.com/@types/estree@0.0.51 + '@types/json-schema': registry.npmmirror.com/@types/json-schema@7.0.11 + dev: true + + registry.npmmirror.com/@types/estree@0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/estree/-/estree-0.0.51.tgz} + name: '@types/estree' + version: 0.0.51 + dev: true + + registry.npmmirror.com/@types/expect@1.20.4: + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/expect/-/expect-1.20.4.tgz} + name: '@types/expect' + version: 1.20.4 + dev: true + + registry.npmmirror.com/@types/glob-stream@6.1.1: + resolution: {integrity: sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/glob-stream/-/glob-stream-6.1.1.tgz} + name: '@types/glob-stream' + version: 6.1.1 + dependencies: + '@types/glob': registry.npmmirror.com/@types/glob@7.2.0 + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + dev: true + + registry.npmmirror.com/@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz} + name: '@types/glob' + version: 7.2.0 + dependencies: + '@types/minimatch': registry.npmmirror.com/@types/minimatch@3.0.5 + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + dev: true + + registry.npmmirror.com/@types/gulp@4.0.9: + resolution: {integrity: sha512-zzT+wfQ8uwoXjDhRK9Zkmmk09/fbLLmN/yDHFizJiEKIve85qutOnXcP/TM2sKPBTU+Jc16vfPbOMkORMUBN7Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/gulp/-/gulp-4.0.9.tgz} + name: '@types/gulp' + version: 4.0.9 + dependencies: + '@types/undertaker': registry.npmmirror.com/@types/undertaker@1.2.8 + '@types/vinyl-fs': registry.npmmirror.com/@types/vinyl-fs@2.4.12 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + dev: true + + registry.npmmirror.com/@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.14.tgz} + name: '@types/http-proxy' + version: 1.17.14 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + dev: false + + registry.npmmirror.com/@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz} + name: '@types/json-schema' + version: 7.0.11 + dev: true + + registry.npmmirror.com/@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz} + name: '@types/keyv' + version: 3.1.4 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + dev: true + + registry.npmmirror.com/@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz} + name: '@types/minimatch' + version: 3.0.5 + dev: true + + registry.npmmirror.com/@types/node@17.0.35: + resolution: {integrity: sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-17.0.35.tgz} + name: '@types/node' + version: 17.0.35 + + registry.npmmirror.com/@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.0.tgz} + name: '@types/responselike' + version: 1.0.0 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + dev: true + + registry.npmmirror.com/@types/undertaker-registry@1.0.1: + resolution: {integrity: sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz} + name: '@types/undertaker-registry' + version: 1.0.1 + dev: true + + registry.npmmirror.com/@types/undertaker@1.2.8: + resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/undertaker/-/undertaker-1.2.8.tgz} + name: '@types/undertaker' + version: 1.2.8 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + '@types/undertaker-registry': registry.npmmirror.com/@types/undertaker-registry@1.0.1 + async-done: registry.npmmirror.com/async-done@1.3.2 + dev: true + + registry.npmmirror.com/@types/vinyl-fs@2.4.12: + resolution: {integrity: sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/vinyl-fs/-/vinyl-fs-2.4.12.tgz} + name: '@types/vinyl-fs' + version: 2.4.12 + dependencies: + '@types/glob-stream': registry.npmmirror.com/@types/glob-stream@6.1.1 + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + '@types/vinyl': registry.npmmirror.com/@types/vinyl@2.0.6 + dev: true + + registry.npmmirror.com/@types/vinyl@2.0.6: + resolution: {integrity: sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/vinyl/-/vinyl-2.0.6.tgz} + name: '@types/vinyl' + version: 2.0.6 + dependencies: + '@types/expect': registry.npmmirror.com/@types/expect@1.20.4 + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + dev: true + + registry.npmmirror.com/@ungap/promise-all-settled@1.1.2: + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz} + name: '@ungap/promise-all-settled' + version: 1.1.2 + dev: true + + registry.npmmirror.com/JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz} + name: JSONStream + version: 1.3.5 + hasBin: true + dependencies: + jsonparse: registry.npmmirror.com/jsonparse@1.3.1 + through: registry.npmmirror.com/through@2.3.8 + dev: true + + registry.npmmirror.com/a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz} + name: a-sync-waterfall + version: 1.0.1 + dev: false + + registry.npmmirror.com/abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz} + name: abbrev + version: 1.1.1 + dev: true + + registry.npmmirror.com/accepts@1.3.7: + resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/accepts/-/accepts-1.3.7.tgz} + name: accepts + version: 1.3.7 + engines: {node: '>= 0.6'} + dependencies: + mime-types: registry.npmmirror.com/mime-types@2.1.27 + negotiator: registry.npmmirror.com/negotiator@0.6.2 + dev: false + + registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.7.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz} + id: registry.npmmirror.com/acorn-jsx/5.3.2 + name: acorn-jsx + version: 5.3.2 + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: registry.npmmirror.com/acorn@8.7.1 + dev: true + + registry.npmmirror.com/acorn-node@1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz} + name: acorn-node + version: 1.8.2 + dependencies: + acorn: registry.npmmirror.com/acorn@7.4.1 + acorn-walk: registry.npmmirror.com/acorn-walk@7.2.0 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/acorn-node@2.0.1: + resolution: {integrity: sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-node/-/acorn-node-2.0.1.tgz} + name: acorn-node + version: 2.0.1 + dependencies: + acorn: registry.npmmirror.com/acorn@7.4.1 + acorn-walk: registry.npmmirror.com/acorn-walk@7.2.0 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz} + name: acorn-walk + version: 7.2.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn/-/acorn-5.7.4.tgz} + name: acorn + version: 5.7.4 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + registry.npmmirror.com/acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz} + name: acorn + version: 7.4.1 + engines: {node: '>=0.4.0'} + hasBin: true + + registry.npmmirror.com/acorn@8.7.1: + resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn/-/acorn-8.7.1.tgz} + name: acorn + version: 8.7.1 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + registry.npmmirror.com/ajv@6.12.4: + resolution: {integrity: sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.4.tgz} + name: ajv + version: 6.12.4 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + json-schema-traverse: registry.npmmirror.com/json-schema-traverse@0.4.1 + uri-js: registry.npmmirror.com/uri-js@4.2.2 + + registry.npmmirror.com/amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz} + name: amdefine + version: 1.0.1 + engines: {node: '>=0.4.2'} + requiresBuild: true + + registry.npmmirror.com/ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz} + name: ansi-align + version: 3.0.1 + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + dev: true + + registry.npmmirror.com/ansi-colors@1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-1.1.0.tgz} + name: ansi-colors + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: registry.npmmirror.com/ansi-wrap@0.1.0 + dev: true + + registry.npmmirror.com/ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz} + name: ansi-colors + version: 4.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/ansi-gray@0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-gray/-/ansi-gray-0.1.1.tgz} + name: ansi-gray + version: 0.1.1 + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: registry.npmmirror.com/ansi-wrap@0.1.0 + dev: true + + registry.npmmirror.com/ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz} + name: ansi-regex + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz} + name: ansi-regex + version: 5.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz} + name: ansi-styles + version: 2.2.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz} + name: ansi-styles + version: 3.2.1 + engines: {node: '>=4'} + dependencies: + color-convert: registry.npmmirror.com/color-convert@1.9.3 + dev: true + + registry.npmmirror.com/ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} + name: ansi-styles + version: 4.3.0 + engines: {node: '>=8'} + dependencies: + color-convert: registry.npmmirror.com/color-convert@2.0.1 + dev: true + + registry.npmmirror.com/ansi-wrap@0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz} + name: ansi-wrap + version: 0.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz} + name: anymatch + version: 2.0.0 + dependencies: + micromatch: registry.npmmirror.com/micromatch@3.1.10 + normalize-path: registry.npmmirror.com/normalize-path@2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/anymatch@3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz} + name: anymatch + version: 3.1.2 + engines: {node: '>= 8'} + dependencies: + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/append-buffer@1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/append-buffer/-/append-buffer-1.0.2.tgz} + name: append-buffer + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + buffer-equal: registry.npmmirror.com/buffer-equal@1.0.0 + dev: true + + registry.npmmirror.com/archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz} + name: archy + version: 1.0.0 + dev: true + + registry.npmmirror.com/argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} + name: argparse + version: 1.0.10 + dependencies: + sprintf-js: registry.npmmirror.com/sprintf-js@1.0.3 + dev: false + + registry.npmmirror.com/argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz} + name: argparse + version: 2.0.1 + dev: true + + registry.npmmirror.com/arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz} + name: arr-diff + version: 4.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/arr-filter@1.1.2: + resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-filter/-/arr-filter-1.1.2.tgz} + name: arr-filter + version: 1.1.2 + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: registry.npmmirror.com/make-iterator@1.0.1 + dev: true + + registry.npmmirror.com/arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz} + name: arr-flatten + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/arr-map@2.0.2: + resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-map/-/arr-map-2.0.2.tgz} + name: arr-map + version: 2.0.2 + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: registry.npmmirror.com/make-iterator@1.0.1 + dev: true + + registry.npmmirror.com/arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz} + name: arr-union + version: 3.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-each/-/array-each-1.0.1.tgz} + name: array-each + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz} + name: array-flatten + version: 1.1.1 + dev: false + + registry.npmmirror.com/array-from@2.1.1: + resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-from/-/array-from-2.1.1.tgz} + name: array-from + version: 2.1.1 + dev: true + + registry.npmmirror.com/array-initial@1.1.0: + resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-initial/-/array-initial-1.1.0.tgz} + name: array-initial + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + array-slice: registry.npmmirror.com/array-slice@1.1.0 + is-number: registry.npmmirror.com/is-number@4.0.0 + dev: true + + registry.npmmirror.com/array-last@1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-last/-/array-last-1.3.0.tgz} + name: array-last + version: 1.3.0 + engines: {node: '>=0.10.0'} + dependencies: + is-number: registry.npmmirror.com/is-number@4.0.0 + dev: true + + registry.npmmirror.com/array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-slice/-/array-slice-1.1.0.tgz} + name: array-slice + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/array-sort@1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-sort/-/array-sort-1.0.0.tgz} + name: array-sort + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + default-compare: registry.npmmirror.com/default-compare@1.0.0 + get-value: registry.npmmirror.com/get-value@2.0.6 + kind-of: registry.npmmirror.com/kind-of@5.1.0 + dev: true + + registry.npmmirror.com/array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz} + name: array-unique + version: 0.3.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/array.prototype.reduce@1.0.4: + resolution: {integrity: sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz} + name: array.prototype.reduce + version: 1.0.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + es-array-method-boxes-properly: registry.npmmirror.com/es-array-method-boxes-properly@1.0.0 + is-string: registry.npmmirror.com/is-string@1.0.7 + dev: true + + registry.npmmirror.com/asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz} + name: asap + version: 2.0.6 + dev: false + + registry.npmmirror.com/asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asn1.js/-/asn1.js-5.4.1.tgz} + name: asn1.js + version: 5.4.1 + dependencies: + bn.js: registry.npmmirror.com/bn.js@4.12.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimalistic-assert: registry.npmmirror.com/minimalistic-assert@1.0.1 + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: true + + registry.npmmirror.com/asn1@0.2.4: + resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asn1/-/asn1-0.2.4.tgz} + name: asn1 + version: 0.2.4 + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: false + + registry.npmmirror.com/assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz} + name: assert-plus + version: 1.0.0 + engines: {node: '>=0.8'} + dev: false + + registry.npmmirror.com/assert@1.5.0: + resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assert/-/assert-1.5.0.tgz} + name: assert + version: 1.5.0 + dependencies: + object-assign: registry.npmmirror.com/object-assign@4.1.1 + util: registry.npmmirror.com/util@0.10.3 + dev: true + + registry.npmmirror.com/assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz} + name: assertion-error + version: 1.1.0 + dev: true + + registry.npmmirror.com/assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz} + name: assign-symbols + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/async-done@1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-done/-/async-done-1.3.2.tgz} + name: async-done + version: 1.3.2 + engines: {node: '>= 0.10'} + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + once: registry.npmmirror.com/once@1.4.0 + process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 + stream-exhaust: registry.npmmirror.com/stream-exhaust@1.0.2 + dev: true + + registry.npmmirror.com/async-each@1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-each/-/async-each-1.0.3.tgz} + name: async-each + version: 1.0.3 + dev: true + + registry.npmmirror.com/async-settle@1.0.0: + resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-settle/-/async-settle-1.0.0.tgz} + name: async-settle + version: 1.0.0 + engines: {node: '>= 0.10'} + dependencies: + async-done: registry.npmmirror.com/async-done@1.3.2 + dev: true + + registry.npmmirror.com/asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz} + name: asynckit + version: 0.4.0 + dev: false + + registry.npmmirror.com/atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz} + name: atob + version: 2.1.2 + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + registry.npmmirror.com/automerge@1.0.1-preview.7: + resolution: {integrity: sha512-Fz5fJdU59xYYj0viteMKTGg/bQWTyibZlkY3V8VQqx9Do1Eg3jtud2+BAI5ZQiKwdWocXc4KKC5o5vT1dzouag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/automerge/-/automerge-1.0.1-preview.7.tgz} + name: automerge + version: 1.0.1-preview.7 + dependencies: + fast-sha256: registry.npmmirror.com/fast-sha256@1.3.0 + pako: registry.npmmirror.com/pako@2.0.4 + uuid: registry.npmmirror.com/uuid@3.4.0 + dev: false + + registry.npmmirror.com/available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz} + name: available-typed-arrays + version: 1.0.5 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz} + name: aws-sign2 + version: 0.7.0 + dev: false + + registry.npmmirror.com/aws4@1.10.1: + resolution: {integrity: sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/aws4/-/aws4-1.10.1.tgz} + name: aws4 + version: 1.10.1 + dev: false + + registry.npmmirror.com/axo@0.0.2: + resolution: {integrity: sha512-8CC4Mb+OhK97UEng0PgiqUDNZjzVcWDsV+G2vLYCQn1jEL7y6VqiRVlZlRu+aA/ckSznmNzW6X1I6nj2As/haQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axo/-/axo-0.0.2.tgz} + name: axo + version: 0.0.2 + dev: false + + registry.npmmirror.com/babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz} + name: babel-plugin-dynamic-import-node + version: 2.3.3 + dependencies: + object.assign: registry.npmmirror.com/object.assign@4.1.2 + dev: true + + registry.npmmirror.com/babel-plugin-polyfill-corejs2@0.3.1(@babel/core@7.18.0): + resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz} + id: registry.npmmirror.com/babel-plugin-polyfill-corejs2/0.3.1 + name: babel-plugin-polyfill-corejs2 + version: 0.3.1 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.17.10 + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-define-polyfill-provider': registry.npmmirror.com/@babel/helper-define-polyfill-provider@0.3.1(@babel/core@7.18.0) + semver: registry.npmmirror.com/semver@6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-polyfill-corejs3@0.5.2(@babel/core@7.18.0): + resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz} + id: registry.npmmirror.com/babel-plugin-polyfill-corejs3/0.5.2 + name: babel-plugin-polyfill-corejs3 + version: 0.5.2 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-define-polyfill-provider': registry.npmmirror.com/@babel/helper-define-polyfill-provider@0.3.1(@babel/core@7.18.0) + core-js-compat: registry.npmmirror.com/core-js-compat@3.22.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-polyfill-regenerator@0.3.1(@babel/core@7.18.0): + resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz} + id: registry.npmmirror.com/babel-plugin-polyfill-regenerator/0.3.1 + name: babel-plugin-polyfill-regenerator + version: 0.3.1 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + '@babel/helper-define-polyfill-provider': registry.npmmirror.com/@babel/helper-define-polyfill-provider@0.3.1(@babel/core@7.18.0) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-relative-path-import@2.0.1: + resolution: {integrity: sha512-jOtB/Lef7QFNAEGRV4VmUvP/VsizpvOVonrTeTTE8TxVIR0FL/wJTzFQp4ei5Jf5+EWklFORmnsXOjLxvNVeRg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-relative-path-import/-/babel-plugin-relative-path-import-2.0.1.tgz} + name: babel-plugin-relative-path-import + version: 2.0.1 + dependencies: + slash: registry.npmmirror.com/slash@1.0.0 + dev: true + + registry.npmmirror.com/babelify@10.0.0(@babel/core@7.18.0): + resolution: {integrity: sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babelify/-/babelify-10.0.0.tgz} + id: registry.npmmirror.com/babelify/10.0.0 + name: babelify + version: 10.0.0 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + dev: true + + registry.npmmirror.com/bach@1.2.0: + resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bach/-/bach-1.2.0.tgz} + name: bach + version: 1.2.0 + engines: {node: '>= 0.10'} + dependencies: + arr-filter: registry.npmmirror.com/arr-filter@1.1.2 + arr-flatten: registry.npmmirror.com/arr-flatten@1.1.0 + arr-map: registry.npmmirror.com/arr-map@2.0.2 + array-each: registry.npmmirror.com/array-each@1.0.1 + array-initial: registry.npmmirror.com/array-initial@1.1.0 + array-last: registry.npmmirror.com/array-last@1.3.0 + async-done: registry.npmmirror.com/async-done@1.3.2 + async-settle: registry.npmmirror.com/async-settle@1.0.0 + now-and-later: registry.npmmirror.com/now-and-later@2.0.1 + dev: true + + registry.npmmirror.com/balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz} + name: balanced-match + version: 1.0.2 + dev: true + + registry.npmmirror.com/base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz} + name: base64-js + version: 1.5.1 + dev: true + + registry.npmmirror.com/base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base/-/base-0.11.2.tgz} + name: base + version: 0.11.2 + engines: {node: '>=0.10.0'} + dependencies: + cache-base: registry.npmmirror.com/cache-base@1.0.1 + class-utils: registry.npmmirror.com/class-utils@0.3.6 + component-emitter: registry.npmmirror.com/component-emitter@1.3.0 + define-property: registry.npmmirror.com/define-property@1.0.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + mixin-deep: registry.npmmirror.com/mixin-deep@1.3.2 + pascalcase: registry.npmmirror.com/pascalcase@0.1.1 + dev: true + + registry.npmmirror.com/bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz} + name: bcrypt-pbkdf + version: 1.0.2 + dependencies: + tweetnacl: registry.npmmirror.com/tweetnacl@0.14.5 + dev: false + + registry.npmmirror.com/binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz} + name: binary-extensions + version: 1.13.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz} + name: binary-extensions + version: 2.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz} + name: bn.js + version: 4.12.0 + dev: true + + registry.npmmirror.com/bn.js@5.2.0: + resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bn.js/-/bn.js-5.2.0.tgz} + name: bn.js + version: 5.2.0 + dev: true + + registry.npmmirror.com/body-parser@1.19.0: + resolution: {integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/body-parser/-/body-parser-1.19.0.tgz} + name: body-parser + version: 1.19.0 + engines: {node: '>= 0.8'} + dependencies: + bytes: registry.npmmirror.com/bytes@3.1.0 + content-type: registry.npmmirror.com/content-type@1.0.4 + debug: registry.npmmirror.com/debug@2.6.9 + depd: registry.npmmirror.com/depd@1.1.2 + http-errors: registry.npmmirror.com/http-errors@1.7.2 + iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 + on-finished: registry.npmmirror.com/on-finished@2.3.0 + qs: registry.npmmirror.com/qs@6.7.0 + raw-body: registry.npmmirror.com/raw-body@2.4.0 + type-is: registry.npmmirror.com/type-is@1.6.18 + transitivePeerDependencies: + - supports-color + dev: false + + registry.npmmirror.com/boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/boxen/-/boxen-5.1.2.tgz} + name: boxen + version: 5.1.2 + engines: {node: '>=10'} + dependencies: + ansi-align: registry.npmmirror.com/ansi-align@3.0.1 + camelcase: registry.npmmirror.com/camelcase@6.3.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cli-boxes: registry.npmmirror.com/cli-boxes@2.2.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + type-fest: registry.npmmirror.com/type-fest@0.20.2 + widest-line: registry.npmmirror.com/widest-line@3.1.0 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz} + name: brace-expansion + version: 1.1.11 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + concat-map: registry.npmmirror.com/concat-map@0.0.1 + dev: true + + registry.npmmirror.com/brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz} + name: brace-expansion + version: 2.0.1 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + dev: true + + registry.npmmirror.com/braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz} + name: braces + version: 2.3.2 + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: registry.npmmirror.com/arr-flatten@1.1.0 + array-unique: registry.npmmirror.com/array-unique@0.3.2 + extend-shallow: registry.npmmirror.com/extend-shallow@2.0.1 + fill-range: registry.npmmirror.com/fill-range@4.0.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + repeat-element: registry.npmmirror.com/repeat-element@1.1.4 + snapdragon: registry.npmmirror.com/snapdragon@0.8.2 + snapdragon-node: registry.npmmirror.com/snapdragon-node@2.1.1 + split-string: registry.npmmirror.com/split-string@3.1.0 + to-regex: registry.npmmirror.com/to-regex@3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz} + name: braces + version: 3.0.2 + engines: {node: '>=8'} + dependencies: + fill-range: registry.npmmirror.com/fill-range@7.0.1 + + registry.npmmirror.com/brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz} + name: brorand + version: 1.1.0 + dev: true + + registry.npmmirror.com/browser-pack-flat@3.4.2: + resolution: {integrity: sha512-TrUo6n2fGSOCYFAKkt/EkgenytAuuCI88fmXFA60aNFVHvz3CZEBTXYSvvXVpU6xpjM8lj/6vkC6Exn8KPjtPw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-pack-flat/-/browser-pack-flat-3.4.2.tgz} + name: browser-pack-flat + version: 3.4.2 + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream@1.3.5 + combine-source-map: registry.npmmirror.com/combine-source-map@0.8.0 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + count-lines: registry.npmmirror.com/count-lines@0.1.2 + dedent: registry.npmmirror.com/dedent@0.7.0 + estree-is-member-expression: registry.npmmirror.com/estree-is-member-expression@1.0.0 + estree-is-require: registry.npmmirror.com/estree-is-require@1.0.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + path-parse: registry.npmmirror.com/path-parse@1.0.7 + scope-analyzer: registry.npmmirror.com/scope-analyzer@2.1.2 + stream-combiner: registry.npmmirror.com/stream-combiner@0.2.2 + through2: registry.npmmirror.com/through2@2.0.5 + transform-ast: registry.npmmirror.com/transform-ast@2.4.4 + umd: registry.npmmirror.com/umd@3.0.3 + wrap-comment: registry.npmmirror.com/wrap-comment@1.0.1 + dev: true + + registry.npmmirror.com/browser-pack@6.1.0: + resolution: {integrity: sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-pack/-/browser-pack-6.1.0.tgz} + name: browser-pack + version: 6.1.0 + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream@1.3.5 + combine-source-map: registry.npmmirror.com/combine-source-map@0.8.0 + defined: registry.npmmirror.com/defined@1.0.0 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + through2: registry.npmmirror.com/through2@2.0.5 + umd: registry.npmmirror.com/umd@3.0.3 + dev: true + + registry.npmmirror.com/browser-process-hrtime@0.1.3: + resolution: {integrity: sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz} + name: browser-process-hrtime + version: 0.1.3 + dev: true + + registry.npmmirror.com/browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-resolve/-/browser-resolve-2.0.0.tgz} + name: browser-resolve + version: 2.0.0 + dependencies: + resolve: registry.npmmirror.com/resolve@1.22.0 + dev: true + + registry.npmmirror.com/browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz} + name: browser-stdout + version: 1.3.1 + dev: true + + registry.npmmirror.com/browser-unpack@1.4.2: + resolution: {integrity: sha512-uHkiY4bmXjjBBWoKH1aRnEGTQxUUCCcVtoJfH9w1lmGGjETY4u93Zk+GRYkCE/SRMrdoMTINQ/1/manr/3aMVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browser-unpack/-/browser-unpack-1.4.2.tgz} + name: browser-unpack + version: 1.4.2 + hasBin: true + dependencies: + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + minimist: registry.npmmirror.com/minimist@1.2.6 + dev: true + + registry.npmmirror.com/browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz} + name: browserify-aes + version: 1.2.0 + dependencies: + buffer-xor: registry.npmmirror.com/buffer-xor@1.0.3 + cipher-base: registry.npmmirror.com/cipher-base@1.0.4 + create-hash: registry.npmmirror.com/create-hash@1.2.0 + evp_bytestokey: registry.npmmirror.com/evp_bytestokey@1.0.3 + inherits: registry.npmmirror.com/inherits@2.0.4 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz} + name: browserify-cipher + version: 1.0.1 + dependencies: + browserify-aes: registry.npmmirror.com/browserify-aes@1.2.0 + browserify-des: registry.npmmirror.com/browserify-des@1.0.2 + evp_bytestokey: registry.npmmirror.com/evp_bytestokey@1.0.3 + dev: true + + registry.npmmirror.com/browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz} + name: browserify-des + version: 1.0.2 + dependencies: + cipher-base: registry.npmmirror.com/cipher-base@1.0.4 + des.js: registry.npmmirror.com/des.js@1.0.1 + inherits: registry.npmmirror.com/inherits@2.0.4 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz} + name: browserify-rsa + version: 4.1.0 + dependencies: + bn.js: registry.npmmirror.com/bn.js@5.2.0 + randombytes: registry.npmmirror.com/randombytes@2.1.0 + dev: true + + registry.npmmirror.com/browserify-sign@4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.1.tgz} + name: browserify-sign + version: 4.2.1 + dependencies: + bn.js: registry.npmmirror.com/bn.js@5.2.0 + browserify-rsa: registry.npmmirror.com/browserify-rsa@4.1.0 + create-hash: registry.npmmirror.com/create-hash@1.2.0 + create-hmac: registry.npmmirror.com/create-hmac@1.1.7 + elliptic: registry.npmmirror.com/elliptic@6.5.4 + inherits: registry.npmmirror.com/inherits@2.0.4 + parse-asn1: registry.npmmirror.com/parse-asn1@5.1.6 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz} + name: browserify-zlib + version: 0.2.0 + dependencies: + pako: registry.npmmirror.com/pako@1.0.11 + dev: true + + registry.npmmirror.com/browserify@17.0.0: + resolution: {integrity: sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserify/-/browserify-17.0.0.tgz} + name: browserify + version: 17.0.0 + engines: {node: '>= 0.8'} + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream@1.3.5 + assert: registry.npmmirror.com/assert@1.5.0 + browser-pack: registry.npmmirror.com/browser-pack@6.1.0 + browser-resolve: registry.npmmirror.com/browser-resolve@2.0.0 + browserify-zlib: registry.npmmirror.com/browserify-zlib@0.2.0 + buffer: registry.npmmirror.com/buffer@5.2.1 + cached-path-relative: registry.npmmirror.com/cached-path-relative@1.1.0 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + console-browserify: registry.npmmirror.com/console-browserify@1.2.0 + constants-browserify: registry.npmmirror.com/constants-browserify@1.0.0 + crypto-browserify: registry.npmmirror.com/crypto-browserify@3.12.0 + defined: registry.npmmirror.com/defined@1.0.0 + deps-sort: registry.npmmirror.com/deps-sort@2.0.1 + domain-browser: registry.npmmirror.com/domain-browser@1.2.0 + duplexer2: registry.npmmirror.com/duplexer2@0.1.4 + events: registry.npmmirror.com/events@3.3.0 + glob: registry.npmmirror.com/glob@7.2.3 + has: registry.npmmirror.com/has@1.0.3 + htmlescape: registry.npmmirror.com/htmlescape@1.1.1 + https-browserify: registry.npmmirror.com/https-browserify@1.0.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + insert-module-globals: registry.npmmirror.com/insert-module-globals@7.2.1 + labeled-stream-splicer: registry.npmmirror.com/labeled-stream-splicer@2.0.2 + mkdirp-classic: registry.npmmirror.com/mkdirp-classic@0.5.3 + module-deps: registry.npmmirror.com/module-deps@6.2.3 + os-browserify: registry.npmmirror.com/os-browserify@0.3.0 + parents: registry.npmmirror.com/parents@1.0.1 + path-browserify: registry.npmmirror.com/path-browserify@1.0.1 + process: registry.npmmirror.com/process@0.11.10 + punycode: registry.npmmirror.com/punycode@1.4.1 + querystring-es3: registry.npmmirror.com/querystring-es3@0.2.1 + read-only-stream: registry.npmmirror.com/read-only-stream@2.0.0 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + resolve: registry.npmmirror.com/resolve@1.22.0 + shasum-object: registry.npmmirror.com/shasum-object@1.0.0 + shell-quote: registry.npmmirror.com/shell-quote@1.7.3 + stream-browserify: registry.npmmirror.com/stream-browserify@3.0.0 + stream-http: registry.npmmirror.com/stream-http@3.2.0 + string_decoder: registry.npmmirror.com/string_decoder@1.3.0 + subarg: registry.npmmirror.com/subarg@1.0.0 + syntax-error: registry.npmmirror.com/syntax-error@1.4.0 + through2: registry.npmmirror.com/through2@2.0.5 + timers-browserify: registry.npmmirror.com/timers-browserify@1.4.2 + tty-browserify: registry.npmmirror.com/tty-browserify@0.0.1 + url: registry.npmmirror.com/url@0.11.0 + util: registry.npmmirror.com/util@0.12.4 + vm-browserify: registry.npmmirror.com/vm-browserify@1.1.2 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/browserslist@4.20.3: + resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.20.3.tgz} + name: browserslist + version: 4.20.3 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: registry.npmmirror.com/caniuse-lite@1.0.30001342 + electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.137 + escalade: registry.npmmirror.com/escalade@3.1.1 + node-releases: registry.npmmirror.com/node-releases@2.0.4 + picocolors: registry.npmmirror.com/picocolors@1.0.0 + dev: true + + registry.npmmirror.com/buffer-equal@1.0.0: + resolution: {integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-equal/-/buffer-equal-1.0.0.tgz} + name: buffer-equal + version: 1.0.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 + + registry.npmmirror.com/buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz} + name: buffer-xor + version: 1.0.3 + dev: true + + registry.npmmirror.com/buffer@5.2.1: + resolution: {integrity: sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer/-/buffer-5.2.1.tgz} + name: buffer + version: 5.2.1 + dependencies: + base64-js: registry.npmmirror.com/base64-js@1.5.1 + ieee754: registry.npmmirror.com/ieee754@1.2.1 + dev: true + + registry.npmmirror.com/builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz} + name: builtin-status-codes + version: 3.0.0 + dev: true + + registry.npmmirror.com/bundle-collapser@1.4.0: + resolution: {integrity: sha512-Gd3K3+3KI1Utuk+gwAvuOVOjT/2XLGL8tU6FwDKk04LlOZkYfT0pwQllsG1Dv8RRhgcjNxZSDmmSXb0AOkwSwg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bundle-collapser/-/bundle-collapser-1.4.0.tgz} + name: bundle-collapser + version: 1.4.0 + hasBin: true + dependencies: + browser-pack: registry.npmmirror.com/browser-pack@6.1.0 + browser-unpack: registry.npmmirror.com/browser-unpack@1.4.2 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + falafel: registry.npmmirror.com/falafel@2.2.5 + minimist: registry.npmmirror.com/minimist@1.2.6 + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bytes/-/bytes-3.1.0.tgz} + name: bytes + version: 3.1.0 + engines: {node: '>= 0.8'} + dev: false + + registry.npmmirror.com/cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz} + name: cache-base + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: registry.npmmirror.com/collection-visit@1.0.0 + component-emitter: registry.npmmirror.com/component-emitter@1.3.0 + get-value: registry.npmmirror.com/get-value@2.0.6 + has-value: registry.npmmirror.com/has-value@1.0.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + set-value: registry.npmmirror.com/set-value@2.0.1 + to-object-path: registry.npmmirror.com/to-object-path@0.3.0 + union-value: registry.npmmirror.com/union-value@1.0.1 + unset-value: registry.npmmirror.com/unset-value@1.0.0 + dev: true + + registry.npmmirror.com/cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-6.1.0.tgz} + name: cacheable-request + version: 6.1.0 + engines: {node: '>=8'} + dependencies: + clone-response: registry.npmmirror.com/clone-response@1.0.2 + get-stream: registry.npmmirror.com/get-stream@5.2.0 + http-cache-semantics: registry.npmmirror.com/http-cache-semantics@4.1.0 + keyv: registry.npmmirror.com/keyv@3.1.0 + lowercase-keys: registry.npmmirror.com/lowercase-keys@2.0.0 + normalize-url: registry.npmmirror.com/normalize-url@4.5.1 + responselike: registry.npmmirror.com/responselike@1.0.2 + dev: true + + registry.npmmirror.com/cached-path-relative@1.1.0: + resolution: {integrity: sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz} + name: cached-path-relative + version: 1.1.0 + dev: true + + registry.npmmirror.com/call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz} + name: call-bind + version: 1.0.2 + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.1.1 + dev: true + + registry.npmmirror.com/call-matcher@2.0.0: + resolution: {integrity: sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/call-matcher/-/call-matcher-2.0.0.tgz} + name: call-matcher + version: 2.0.0 + dependencies: + deep-equal: registry.npmmirror.com/deep-equal@1.1.1 + espurify: registry.npmmirror.com/espurify@2.1.1 + estraverse: registry.npmmirror.com/estraverse@4.3.0 + dev: true + + registry.npmmirror.com/callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz} + name: callsites + version: 3.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-3.0.0.tgz} + name: camelcase + version: 3.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz} + name: camelcase + version: 6.3.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/caniuse-lite@1.0.30001342: + resolution: {integrity: sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz} + name: caniuse-lite + version: 1.0.30001342 + dev: true + + registry.npmmirror.com/caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz} + name: caseless + version: 0.12.0 + dev: false + + registry.npmmirror.com/chai@4.3.6: + resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chai/-/chai-4.3.6.tgz} + name: chai + version: 4.3.6 + engines: {node: '>=4'} + dependencies: + assertion-error: registry.npmmirror.com/assertion-error@1.1.0 + check-error: registry.npmmirror.com/check-error@1.0.2 + deep-eql: registry.npmmirror.com/deep-eql@3.0.1 + get-func-name: registry.npmmirror.com/get-func-name@2.0.0 + loupe: registry.npmmirror.com/loupe@2.3.4 + pathval: registry.npmmirror.com/pathval@1.1.1 + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz} + name: chalk + version: 1.1.3 + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@2.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 + has-ansi: registry.npmmirror.com/has-ansi@2.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@3.0.1 + supports-color: registry.npmmirror.com/supports-color@2.0.0 + dev: true + + registry.npmmirror.com/chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz} + name: chalk + version: 2.4.2 + engines: {node: '>=4'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@3.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 + supports-color: registry.npmmirror.com/supports-color@5.5.0 + dev: true + + registry.npmmirror.com/chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz} + name: chalk + version: 4.1.2 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 + dev: true + + registry.npmmirror.com/check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.2.tgz} + name: check-error + version: 1.0.2 + dev: true + + registry.npmmirror.com/chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz} + name: chokidar + version: 2.1.8 + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: registry.npmmirror.com/anymatch@2.0.0 + async-each: registry.npmmirror.com/async-each@1.0.3 + braces: registry.npmmirror.com/braces@2.3.2 + glob-parent: registry.npmmirror.com/glob-parent@3.1.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + is-binary-path: registry.npmmirror.com/is-binary-path@1.0.1 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + readdirp: registry.npmmirror.com/readdirp@2.2.1 + upath: registry.npmmirror.com/upath@1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} + name: chokidar + version: 3.5.3 + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: registry.npmmirror.com/anymatch@3.1.2 + braces: registry.npmmirror.com/braces@3.0.2 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + is-binary-path: registry.npmmirror.com/is-binary-path@2.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readdirp: registry.npmmirror.com/readdirp@3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + registry.npmmirror.com/ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz} + name: ci-info + version: 2.0.0 + dev: true + + registry.npmmirror.com/cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz} + name: cipher-base + version: 1.0.4 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz} + name: class-utils + version: 0.3.6 + engines: {node: '>=0.10.0'} + dependencies: + arr-union: registry.npmmirror.com/arr-union@3.1.0 + define-property: registry.npmmirror.com/define-property@0.2.5 + isobject: registry.npmmirror.com/isobject@3.0.1 + static-extend: registry.npmmirror.com/static-extend@0.1.2 + dev: true + + registry.npmmirror.com/cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cli-boxes/-/cli-boxes-2.2.1.tgz} + name: cli-boxes + version: 2.2.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cliui/-/cliui-3.2.0.tgz} + name: cliui + version: 3.2.0 + dependencies: + string-width: registry.npmmirror.com/string-width@1.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@3.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@2.1.0 + dev: true + + registry.npmmirror.com/cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz} + name: cliui + version: 7.0.4 + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone-buffer/-/clone-buffer-1.0.0.tgz} + name: clone-buffer + version: 1.0.0 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz} + name: clone-deep + version: 4.0.1 + engines: {node: '>=6'} + dependencies: + is-plain-object: registry.npmmirror.com/is-plain-object@2.0.4 + kind-of: registry.npmmirror.com/kind-of@6.0.3 + shallow-clone: registry.npmmirror.com/shallow-clone@3.0.1 + dev: true + + registry.npmmirror.com/clone-response@1.0.2: + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone-response/-/clone-response-1.0.2.tgz} + name: clone-response + version: 1.0.2 + dependencies: + mimic-response: registry.npmmirror.com/mimic-response@1.0.1 + dev: true + + registry.npmmirror.com/clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone-stats/-/clone-stats-1.0.0.tgz} + name: clone-stats + version: 1.0.0 + dev: true + + registry.npmmirror.com/clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz} + name: clone + version: 2.1.2 + engines: {node: '>=0.8'} + dev: true + + registry.npmmirror.com/cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz} + name: cloneable-readable + version: 1.1.3 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz} + name: code-point-at + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/collection-map@1.0.0: + resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/collection-map/-/collection-map-1.0.0.tgz} + name: collection-map + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + arr-map: registry.npmmirror.com/arr-map@2.0.2 + for-own: registry.npmmirror.com/for-own@1.0.0 + make-iterator: registry.npmmirror.com/make-iterator@1.0.1 + dev: true + + registry.npmmirror.com/collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz} + name: collection-visit + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + map-visit: registry.npmmirror.com/map-visit@1.0.0 + object-visit: registry.npmmirror.com/object-visit@1.0.1 + dev: true + + registry.npmmirror.com/color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} + name: color-convert + version: 1.9.3 + dependencies: + color-name: registry.npmmirror.com/color-name@1.1.3 + dev: true + + registry.npmmirror.com/color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} + name: color-convert + version: 2.0.1 + engines: {node: '>=7.0.0'} + dependencies: + color-name: registry.npmmirror.com/color-name@1.1.4 + dev: true + + registry.npmmirror.com/color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz} + name: color-name + version: 1.1.3 + dev: true + + registry.npmmirror.com/color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} + name: color-name + version: 1.1.4 + dev: true + + registry.npmmirror.com/color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz} + name: color-support + version: 1.1.3 + hasBin: true + dev: true + + registry.npmmirror.com/combine-source-map@0.8.0: + resolution: {integrity: sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/combine-source-map/-/combine-source-map-0.8.0.tgz} + name: combine-source-map + version: 0.8.0 + dependencies: + convert-source-map: registry.npmmirror.com/convert-source-map@1.1.3 + inline-source-map: registry.npmmirror.com/inline-source-map@0.6.2 + lodash.memoize: registry.npmmirror.com/lodash.memoize@3.0.4 + source-map: registry.npmmirror.com/source-map@0.5.7 + dev: true + + registry.npmmirror.com/combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz} + name: combined-stream + version: 1.0.8 + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: registry.npmmirror.com/delayed-stream@1.0.0 + dev: false + + registry.npmmirror.com/commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz} + name: commander + version: 2.20.3 + dev: true + + registry.npmmirror.com/commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz} + name: commander + version: 4.1.1 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz} + name: commander + version: 5.1.0 + engines: {node: '>= 6'} + dev: false + + registry.npmmirror.com/commander@9.3.0: + resolution: {integrity: sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commander/-/commander-9.3.0.tgz} + name: commander + version: 9.3.0 + engines: {node: ^12.20.0 || >=14} + dev: true + + registry.npmmirror.com/common-shakeify@0.6.2: + resolution: {integrity: sha512-vxlXr26fqxm8ZJ0jh8MlvpeN6IbyUKqsVmgb4rAjDM/0f4nKebiHaAXpF/Mm86W9ENR5iSI7UOnUTylpVyplUA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/common-shakeify/-/common-shakeify-0.6.2.tgz} + name: common-shakeify + version: 0.6.2 + dependencies: + '@goto-bus-stop/common-shake': registry.npmmirror.com/@goto-bus-stop/common-shake@2.4.0 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + through2: registry.npmmirror.com/through2@2.0.5 + transform-ast: registry.npmmirror.com/transform-ast@2.4.4 + wrap-comment: registry.npmmirror.com/wrap-comment@1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz} + name: commondir + version: 1.0.1 + dev: true + + registry.npmmirror.com/component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz} + name: component-emitter + version: 1.3.0 + dev: true + + registry.npmmirror.com/concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz} + name: concat-map + version: 0.0.1 + dev: true + + registry.npmmirror.com/concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz} + name: concat-stream + version: 1.6.2 + engines: {'0': node >= 0.8} + dependencies: + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + typedarray: registry.npmmirror.com/typedarray@0.0.6 + + registry.npmmirror.com/concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz} + name: concat-stream + version: 2.0.0 + engines: {'0': node >= 6.0} + dependencies: + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + typedarray: registry.npmmirror.com/typedarray@0.0.6 + dev: true + + registry.npmmirror.com/concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz} + name: concat-with-sourcemaps + version: 1.1.0 + dependencies: + source-map: registry.npmmirror.com/source-map@0.6.1 + dev: true + + registry.npmmirror.com/configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/configstore/-/configstore-5.0.1.tgz} + name: configstore + version: 5.0.1 + engines: {node: '>=8'} + dependencies: + dot-prop: registry.npmmirror.com/dot-prop@5.3.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + make-dir: registry.npmmirror.com/make-dir@3.1.0 + unique-string: registry.npmmirror.com/unique-string@2.0.0 + write-file-atomic: registry.npmmirror.com/write-file-atomic@3.0.3 + xdg-basedir: registry.npmmirror.com/xdg-basedir@4.0.0 + dev: true + + registry.npmmirror.com/connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz} + name: connect-history-api-fallback + version: 2.0.0 + engines: {node: '>=0.8'} + dev: false + + registry.npmmirror.com/console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz} + name: console-browserify + version: 1.2.0 + dev: true + + registry.npmmirror.com/constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz} + name: constants-browserify + version: 1.0.0 + dev: true + + registry.npmmirror.com/content-disposition@0.5.3: + resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.3.tgz} + name: content-disposition + version: 0.5.3 + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + dev: false + + registry.npmmirror.com/content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz} + name: content-type + version: 1.0.4 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/convert-source-map@1.1.3: + resolution: {integrity: sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.1.3.tgz} + name: convert-source-map + version: 1.1.3 + dev: true + + registry.npmmirror.com/convert-source-map@1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz} + name: convert-source-map + version: 1.8.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + dev: true + + registry.npmmirror.com/cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz} + name: cookie-signature + version: 1.0.6 + dev: false + + registry.npmmirror.com/cookie@0.4.0: + resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cookie/-/cookie-0.4.0.tgz} + name: cookie + version: 0.4.0 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz} + name: copy-descriptor + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/copy-props@2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/copy-props/-/copy-props-2.0.5.tgz} + name: copy-props + version: 2.0.5 + dependencies: + each-props: registry.npmmirror.com/each-props@1.3.2 + is-plain-object: registry.npmmirror.com/is-plain-object@5.0.0 + dev: true + + registry.npmmirror.com/core-js-compat@3.22.6: + resolution: {integrity: sha512-dQ/SxlHcuiywaPIoSUCU6Fx+Mk/H5TXENqd/ZJcK85ta0ZcQkbzHwblxPeL0hF5o+NsT2uK3q9ZOG5TboiVuWw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.22.6.tgz} + name: core-js-compat + version: 3.22.6 + dependencies: + browserslist: registry.npmmirror.com/browserslist@4.20.3 + semver: registry.npmmirror.com/semver@7.0.0 + dev: true + + registry.npmmirror.com/core-js@3.22.6: + resolution: {integrity: sha512-2IGcGH00z9I4twgNWU4uGCNEsBFG1s2JudVQrgSCoVhOfwoTwQjxC8aMo9exrpTMOxvobggEpaHnGMmQY4cfBQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js/-/core-js-3.22.6.tgz} + name: core-js + version: 3.22.6 + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: true + + registry.npmmirror.com/core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz} + name: core-util-is + version: 1.0.2 + + registry.npmmirror.com/count-lines@0.1.2: + resolution: {integrity: sha512-YS8P4UYXX/hrDyLU3r/A5OcCNwdNbJFJckbe8j+x2Jhxsr2J4/rYl0sDwOljLZL7Uxc4s7mRSNcQD8dSjobz+g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/count-lines/-/count-lines-0.1.2.tgz} + name: count-lines + version: 0.1.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz} + name: create-ecdh + version: 4.0.4 + dependencies: + bn.js: registry.npmmirror.com/bn.js@4.12.0 + elliptic: registry.npmmirror.com/elliptic@6.5.4 + dev: true + + registry.npmmirror.com/create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz} + name: create-hash + version: 1.2.0 + dependencies: + cipher-base: registry.npmmirror.com/cipher-base@1.0.4 + inherits: registry.npmmirror.com/inherits@2.0.4 + md5.js: registry.npmmirror.com/md5.js@1.3.5 + ripemd160: registry.npmmirror.com/ripemd160@2.0.2 + sha.js: registry.npmmirror.com/sha.js@2.4.11 + dev: true + + registry.npmmirror.com/create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz} + name: create-hmac + version: 1.1.7 + dependencies: + cipher-base: registry.npmmirror.com/cipher-base@1.0.4 + create-hash: registry.npmmirror.com/create-hash@1.2.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + ripemd160: registry.npmmirror.com/ripemd160@2.0.2 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + sha.js: registry.npmmirror.com/sha.js@2.4.11 + dev: true + + registry.npmmirror.com/cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz} + name: cross-spawn + version: 7.0.3 + engines: {node: '>= 8'} + dependencies: + path-key: registry.npmmirror.com/path-key@3.1.1 + shebang-command: registry.npmmirror.com/shebang-command@2.0.0 + which: registry.npmmirror.com/which@2.0.2 + dev: true + + registry.npmmirror.com/crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz} + name: crypto-browserify + version: 3.12.0 + dependencies: + browserify-cipher: registry.npmmirror.com/browserify-cipher@1.0.1 + browserify-sign: registry.npmmirror.com/browserify-sign@4.2.1 + create-ecdh: registry.npmmirror.com/create-ecdh@4.0.4 + create-hash: registry.npmmirror.com/create-hash@1.2.0 + create-hmac: registry.npmmirror.com/create-hmac@1.1.7 + diffie-hellman: registry.npmmirror.com/diffie-hellman@5.0.3 + inherits: registry.npmmirror.com/inherits@2.0.4 + pbkdf2: registry.npmmirror.com/pbkdf2@3.1.2 + public-encrypt: registry.npmmirror.com/public-encrypt@4.0.3 + randombytes: registry.npmmirror.com/randombytes@2.1.0 + randomfill: registry.npmmirror.com/randomfill@1.0.4 + dev: true + + registry.npmmirror.com/crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz} + name: crypto-random-string + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/d/-/d-1.0.1.tgz} + name: d + version: 1.0.1 + dependencies: + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + type: registry.npmmirror.com/type@1.2.0 + dev: true + + registry.npmmirror.com/dash-ast@1.0.0: + resolution: {integrity: sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dash-ast/-/dash-ast-1.0.0.tgz} + name: dash-ast + version: 1.0.0 + dev: true + + registry.npmmirror.com/dash-ast@2.0.1: + resolution: {integrity: sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz} + name: dash-ast + version: 2.0.1 + dev: true + + registry.npmmirror.com/dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz} + name: dashdash + version: 1.14.1 + engines: {node: '>=0.10'} + dependencies: + assert-plus: registry.npmmirror.com/assert-plus@1.0.0 + dev: false + + registry.npmmirror.com/debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz} + name: debug + version: 2.6.9 + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms@2.0.0 + + registry.npmmirror.com/debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz} + id: registry.npmmirror.com/debug/3.2.7 + name: debug + version: 3.2.7 + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms@2.1.3 + supports-color: registry.npmmirror.com/supports-color@5.5.0 + dev: true + + registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} + id: registry.npmmirror.com/debug/4.3.4 + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms@2.1.2 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + dev: true + + registry.npmmirror.com/decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz} + name: decamelize + version: 1.2.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz} + name: decamelize + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/decode-uri-component@0.2.0: + resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz} + name: decode-uri-component + version: 0.2.0 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz} + name: decompress-response + version: 3.3.0 + engines: {node: '>=4'} + dependencies: + mimic-response: registry.npmmirror.com/mimic-response@1.0.1 + dev: true + + registry.npmmirror.com/dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz} + name: dedent + version: 0.7.0 + dev: true + + registry.npmmirror.com/deep-eql@3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-3.0.1.tgz} + name: deep-eql + version: 3.0.1 + engines: {node: '>=0.12'} + dependencies: + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/deep-equal@1.1.1: + resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.1.tgz} + name: deep-equal + version: 1.1.1 + dependencies: + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-date-object: registry.npmmirror.com/is-date-object@1.0.5 + is-regex: registry.npmmirror.com/is-regex@1.1.4 + object-is: registry.npmmirror.com/object-is@1.1.5 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.4.3 + dev: true + + registry.npmmirror.com/deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz} + name: deep-extend + version: 0.6.0 + engines: {node: '>=4.0.0'} + dev: true + + registry.npmmirror.com/deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz} + name: deep-is + version: 0.1.4 + dev: true + + registry.npmmirror.com/default-compare@1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/default-compare/-/default-compare-1.0.0.tgz} + name: default-compare + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@5.1.0 + dev: true + + registry.npmmirror.com/default-resolution@2.0.0: + resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/default-resolution/-/default-resolution-2.0.0.tgz} + name: default-resolution + version: 2.0.0 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz} + name: defer-to-connect + version: 1.1.3 + dev: true + + registry.npmmirror.com/define-properties@1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz} + name: define-properties + version: 1.1.4 + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.0 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + dev: true + + registry.npmmirror.com/define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz} + name: define-property + version: 0.2.5 + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: registry.npmmirror.com/is-descriptor@0.1.6 + dev: true + + registry.npmmirror.com/define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz} + name: define-property + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: registry.npmmirror.com/is-descriptor@1.0.2 + dev: true + + registry.npmmirror.com/define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz} + name: define-property + version: 2.0.2 + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: registry.npmmirror.com/is-descriptor@1.0.2 + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/defined@1.0.0: + resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/defined/-/defined-1.0.0.tgz} + name: defined + version: 1.0.0 + dev: true + + registry.npmmirror.com/delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz} + name: delayed-stream + version: 1.0.0 + engines: {node: '>=0.4.0'} + dev: false + + registry.npmmirror.com/depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz} + name: depd + version: 1.1.2 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/deps-sort@2.0.1: + resolution: {integrity: sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deps-sort/-/deps-sort-2.0.1.tgz} + name: deps-sort + version: 2.0.1 + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream@1.3.5 + shasum-object: registry.npmmirror.com/shasum-object@1.0.0 + subarg: registry.npmmirror.com/subarg@1.0.0 + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/des.js@1.0.1: + resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/des.js/-/des.js-1.0.1.tgz} + name: des.js + version: 1.0.1 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + minimalistic-assert: registry.npmmirror.com/minimalistic-assert@1.0.1 + dev: true + + registry.npmmirror.com/destroy@1.0.4: + resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/destroy/-/destroy-1.0.4.tgz} + name: destroy + version: 1.0.4 + dev: false + + registry.npmmirror.com/detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz} + name: detect-file + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/detective@5.2.0: + resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/detective/-/detective-5.2.0.tgz} + name: detective + version: 5.2.0 + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + defined: registry.npmmirror.com/defined@1.0.0 + minimist: registry.npmmirror.com/minimist@1.2.6 + dev: true + + registry.npmmirror.com/diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz} + name: diff + version: 5.0.0 + engines: {node: '>=0.3.1'} + dev: true + + registry.npmmirror.com/diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz} + name: diffie-hellman + version: 5.0.3 + dependencies: + bn.js: registry.npmmirror.com/bn.js@4.12.0 + miller-rabin: registry.npmmirror.com/miller-rabin@4.0.1 + randombytes: registry.npmmirror.com/randombytes@2.1.0 + dev: true + + registry.npmmirror.com/doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz} + name: doctrine + version: 3.0.0 + engines: {node: '>=6.0.0'} + dependencies: + esutils: registry.npmmirror.com/esutils@2.0.3 + dev: true + + registry.npmmirror.com/domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz} + name: domain-browser + version: 1.2.0 + engines: {node: '>=0.4', npm: '>=1.2'} + dev: true + + registry.npmmirror.com/dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz} + name: dot-prop + version: 5.3.0 + engines: {node: '>=8'} + dependencies: + is-obj: registry.npmmirror.com/is-obj@2.0.0 + dev: true + + registry.npmmirror.com/duplexer2@0.0.2: + resolution: {integrity: sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.0.2.tgz} + name: duplexer2 + version: 0.0.2 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@1.1.14 + dev: false + + registry.npmmirror.com/duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz} + name: duplexer2 + version: 0.1.4 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/duplexer3@0.1.4: + resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.4.tgz} + name: duplexer3 + version: 0.1.4 + dev: true + + registry.npmmirror.com/duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz} + name: duplexer + version: 0.1.2 + dev: true + + registry.npmmirror.com/duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz} + name: duplexify + version: 3.7.1 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + stream-shift: registry.npmmirror.com/stream-shift@1.0.1 + dev: true + + registry.npmmirror.com/duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/duplexify/-/duplexify-4.1.2.tgz} + name: duplexify + version: 4.1.2 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + stream-shift: registry.npmmirror.com/stream-shift@1.0.1 + dev: true + + registry.npmmirror.com/each-props@1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/each-props/-/each-props-1.3.2.tgz} + name: each-props + version: 1.3.2 + dependencies: + is-plain-object: registry.npmmirror.com/is-plain-object@2.0.4 + object.defaults: registry.npmmirror.com/object.defaults@1.1.0 + dev: true + + registry.npmmirror.com/ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz} + name: ecc-jsbn + version: 0.1.2 + dependencies: + jsbn: registry.npmmirror.com/jsbn@0.1.1 + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: false + + registry.npmmirror.com/ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz} + name: ee-first + version: 1.1.1 + dev: false + + registry.npmmirror.com/electron-to-chromium@1.4.137: + resolution: {integrity: sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz} + name: electron-to-chromium + version: 1.4.137 + dev: true + + registry.npmmirror.com/elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/elliptic/-/elliptic-6.5.4.tgz} + name: elliptic + version: 6.5.4 + dependencies: + bn.js: registry.npmmirror.com/bn.js@4.12.0 + brorand: registry.npmmirror.com/brorand@1.1.0 + hash.js: registry.npmmirror.com/hash.js@1.1.7 + hmac-drbg: registry.npmmirror.com/hmac-drbg@1.0.1 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimalistic-assert: registry.npmmirror.com/minimalistic-assert@1.0.1 + minimalistic-crypto-utils: registry.npmmirror.com/minimalistic-crypto-utils@1.0.1 + dev: true + + registry.npmmirror.com/emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz} + name: emoji-regex + version: 8.0.0 + dev: true + + registry.npmmirror.com/encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz} + name: encodeurl + version: 1.0.2 + engines: {node: '>= 0.8'} + dev: false + + registry.npmmirror.com/end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz} + name: end-of-stream + version: 1.4.4 + dependencies: + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz} + name: error-ex + version: 1.3.2 + dependencies: + is-arrayish: registry.npmmirror.com/is-arrayish@0.2.1 + dev: true + + registry.npmmirror.com/es-abstract@1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.1.tgz} + name: es-abstract + version: 1.20.1 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + es-to-primitive: registry.npmmirror.com/es-to-primitive@1.2.1 + function-bind: registry.npmmirror.com/function-bind@1.1.1 + function.prototype.name: registry.npmmirror.com/function.prototype.name@1.1.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.1.1 + get-symbol-description: registry.npmmirror.com/get-symbol-description@1.0.0 + has: registry.npmmirror.com/has@1.0.3 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.0 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + internal-slot: registry.npmmirror.com/internal-slot@1.0.3 + is-callable: registry.npmmirror.com/is-callable@1.2.4 + is-negative-zero: registry.npmmirror.com/is-negative-zero@2.0.2 + is-regex: registry.npmmirror.com/is-regex@1.1.4 + is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer@1.0.2 + is-string: registry.npmmirror.com/is-string@1.0.7 + is-weakref: registry.npmmirror.com/is-weakref@1.0.2 + object-inspect: registry.npmmirror.com/object-inspect@1.12.1 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + object.assign: registry.npmmirror.com/object.assign@4.1.2 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.4.3 + string.prototype.trimend: registry.npmmirror.com/string.prototype.trimend@1.0.5 + string.prototype.trimstart: registry.npmmirror.com/string.prototype.trimstart@1.0.5 + unbox-primitive: registry.npmmirror.com/unbox-primitive@1.0.2 + dev: true + + registry.npmmirror.com/es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz} + name: es-array-method-boxes-properly + version: 1.0.0 + dev: true + + registry.npmmirror.com/es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz} + name: es-to-primitive + version: 1.2.1 + engines: {node: '>= 0.4'} + dependencies: + is-callable: registry.npmmirror.com/is-callable@1.2.4 + is-date-object: registry.npmmirror.com/is-date-object@1.0.5 + is-symbol: registry.npmmirror.com/is-symbol@1.0.4 + dev: true + + registry.npmmirror.com/es5-ext@0.10.61: + resolution: {integrity: sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.61.tgz} + name: es5-ext + version: 0.10.61 + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: registry.npmmirror.com/es6-iterator@2.0.3 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.3 + next-tick: registry.npmmirror.com/next-tick@1.1.0 + dev: true + + registry.npmmirror.com/es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz} + name: es6-iterator + version: 2.0.3 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.3 + dev: true + + registry.npmmirror.com/es6-map@0.1.5: + resolution: {integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz} + name: es6-map + version: 0.1.5 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + es6-iterator: registry.npmmirror.com/es6-iterator@2.0.3 + es6-set: registry.npmmirror.com/es6-set@0.1.5 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.3 + event-emitter: registry.npmmirror.com/event-emitter@0.3.5 + dev: true + + registry.npmmirror.com/es6-set@0.1.5: + resolution: {integrity: sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es6-set/-/es6-set-0.1.5.tgz} + name: es6-set + version: 0.1.5 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + es6-iterator: registry.npmmirror.com/es6-iterator@2.0.3 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.1 + event-emitter: registry.npmmirror.com/event-emitter@0.3.5 + dev: true + + registry.npmmirror.com/es6-symbol@3.1.1: + resolution: {integrity: sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.1.tgz} + name: es6-symbol + version: 3.1.1 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + dev: true + + registry.npmmirror.com/es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz} + name: es6-symbol + version: 3.1.3 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + ext: registry.npmmirror.com/ext@1.6.0 + dev: true + + registry.npmmirror.com/es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz} + name: es6-weak-map + version: 2.0.3 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + es6-iterator: registry.npmmirror.com/es6-iterator@2.0.3 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.3 + dev: true + + registry.npmmirror.com/esbuild@0.19.8: + resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.8.tgz} + name: esbuild + version: 0.19.8 + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.8 + '@esbuild/android-arm64': 0.19.8 + '@esbuild/android-x64': 0.19.8 + '@esbuild/darwin-arm64': 0.19.8 + '@esbuild/darwin-x64': 0.19.8 + '@esbuild/freebsd-arm64': 0.19.8 + '@esbuild/freebsd-x64': 0.19.8 + '@esbuild/linux-arm': 0.19.8 + '@esbuild/linux-arm64': 0.19.8 + '@esbuild/linux-ia32': 0.19.8 + '@esbuild/linux-loong64': 0.19.8 + '@esbuild/linux-mips64el': 0.19.8 + '@esbuild/linux-ppc64': 0.19.8 + '@esbuild/linux-riscv64': 0.19.8 + '@esbuild/linux-s390x': 0.19.8 + '@esbuild/linux-x64': 0.19.8 + '@esbuild/netbsd-x64': 0.19.8 + '@esbuild/openbsd-x64': 0.19.8 + '@esbuild/sunos-x64': 0.19.8 + '@esbuild/win32-arm64': 0.19.8 + '@esbuild/win32-ia32': 0.19.8 + '@esbuild/win32-x64': 0.19.8 + dev: true + + registry.npmmirror.com/escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} + name: escalade + version: 3.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-goat/-/escape-goat-2.1.1.tgz} + name: escape-goat + version: 2.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz} + name: escape-html + version: 1.0.3 + dev: false + + registry.npmmirror.com/escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} + name: escape-string-regexp + version: 1.0.5 + engines: {node: '>=0.8.0'} + dev: true + + registry.npmmirror.com/escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} + name: escape-string-regexp + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/escodegen@0.0.28: + resolution: {integrity: sha512-6ioQhg16lFs5c7XJlJFXIDxBjO4yRvXC9yK6dLNNGuhI3a/fJukHanPF6qtpjGDgAFzI8Wuq3PSIarWmaOq/5A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-0.0.28.tgz} + name: escodegen + version: 0.0.28 + engines: {node: '>=0.4.0'} + hasBin: true + dependencies: + esprima: registry.npmmirror.com/esprima@1.0.4 + estraverse: registry.npmmirror.com/estraverse@1.3.2 + optionalDependencies: + source-map: 0.6.1 + dev: false + + registry.npmmirror.com/escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz} + name: escodegen + version: 1.14.3 + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: registry.npmmirror.com/esprima@4.0.1 + estraverse: registry.npmmirror.com/estraverse@4.3.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + optionator: registry.npmmirror.com/optionator@0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + registry.npmmirror.com/escodegen@1.3.3: + resolution: {integrity: sha512-z9FWgKc48wjMlpzF5ymKS1AF8OIgnKLp9VyN7KbdtyrP/9lndwUFqCtMm+TAJmJf7KJFFYc4cFJfVTTGkKEwsA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-1.3.3.tgz} + name: escodegen + version: 1.3.3 + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + esprima: registry.npmmirror.com/esprima@1.1.1 + estraverse: registry.npmmirror.com/estraverse@1.5.1 + esutils: registry.npmmirror.com/esutils@1.0.0 + optionalDependencies: + source-map: 0.1.43 + dev: false + + registry.npmmirror.com/escope@3.6.0: + resolution: {integrity: sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escope/-/escope-3.6.0.tgz} + name: escope + version: 3.6.0 + engines: {node: '>=0.4.0'} + dependencies: + es6-map: registry.npmmirror.com/es6-map@0.1.5 + es6-weak-map: registry.npmmirror.com/es6-weak-map@2.0.3 + esrecurse: registry.npmmirror.com/esrecurse@4.3.0 + estraverse: registry.npmmirror.com/estraverse@4.3.0 + dev: true + + registry.npmmirror.com/eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz} + name: eslint-scope + version: 7.1.1 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: registry.npmmirror.com/esrecurse@4.3.0 + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/eslint-utils@3.0.0(eslint@8.16.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz} + id: registry.npmmirror.com/eslint-utils/3.0.0 + name: eslint-utils + version: 3.0.0 + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: registry.npmmirror.com/eslint@8.16.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@2.1.0 + dev: true + + registry.npmmirror.com/eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz} + name: eslint-visitor-keys + version: 2.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/eslint-visitor-keys@3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz} + name: eslint-visitor-keys + version: 3.3.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/eslint@8.16.0: + resolution: {integrity: sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eslint/-/eslint-8.16.0.tgz} + name: eslint + version: 8.16.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': registry.npmmirror.com/@eslint/eslintrc@1.3.0 + '@humanwhocodes/config-array': registry.npmmirror.com/@humanwhocodes/config-array@0.9.5 + ajv: registry.npmmirror.com/ajv@6.12.4 + chalk: registry.npmmirror.com/chalk@4.1.2 + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + doctrine: registry.npmmirror.com/doctrine@3.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + eslint-scope: registry.npmmirror.com/eslint-scope@7.1.1 + eslint-utils: registry.npmmirror.com/eslint-utils@3.0.0(eslint@8.16.0) + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.3.0 + espree: registry.npmmirror.com/espree@9.3.2 + esquery: registry.npmmirror.com/esquery@1.4.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + file-entry-cache: registry.npmmirror.com/file-entry-cache@6.0.1 + functional-red-black-tree: registry.npmmirror.com/functional-red-black-tree@1.0.1 + glob-parent: registry.npmmirror.com/glob-parent@6.0.2 + globals: registry.npmmirror.com/globals@13.15.0 + ignore: registry.npmmirror.com/ignore@5.2.0 + import-fresh: registry.npmmirror.com/import-fresh@3.3.0 + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 + levn: registry.npmmirror.com/levn@0.4.1 + lodash.merge: registry.npmmirror.com/lodash.merge@4.6.2 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + optionator: registry.npmmirror.com/optionator@0.9.1 + regexpp: registry.npmmirror.com/regexpp@3.2.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + text-table: registry.npmmirror.com/text-table@0.2.0 + v8-compile-cache: registry.npmmirror.com/v8-compile-cache@2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/espree@9.3.2: + resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/espree/-/espree-9.3.2.tgz} + name: espree + version: 9.3.2 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: registry.npmmirror.com/acorn@8.7.1 + acorn-jsx: registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.7.1) + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.3.0 + dev: true + + registry.npmmirror.com/esprima@1.0.4: + resolution: {integrity: sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esprima/-/esprima-1.0.4.tgz} + name: esprima + version: 1.0.4 + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + registry.npmmirror.com/esprima@1.1.1: + resolution: {integrity: sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esprima/-/esprima-1.1.1.tgz} + name: esprima + version: 1.1.1 + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + registry.npmmirror.com/esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz} + name: esprima + version: 4.0.1 + engines: {node: '>=4'} + hasBin: true + + registry.npmmirror.com/espurify@2.1.1: + resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/espurify/-/espurify-2.1.1.tgz} + name: espurify + version: 2.1.1 + dev: true + + registry.npmmirror.com/esquery@1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz} + name: esquery + version: 1.4.0 + engines: {node: '>=0.10'} + dependencies: + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz} + name: esrecurse + version: 4.3.0 + engines: {node: '>=4.0'} + dependencies: + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/estraverse@1.3.2: + resolution: {integrity: sha512-OkbCPVUu8D9tbsLcUR+CKFRBbhZlogmkbWaP3BPERlkqzWL5Q6IdTz6eUk+b5cid2MTaCqJb2nNRGoJ8TpfPrg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-1.3.2.tgz} + name: estraverse + version: 1.3.2 + engines: {node: '>=0.4.0'} + dev: false + + registry.npmmirror.com/estraverse@1.5.1: + resolution: {integrity: sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-1.5.1.tgz} + name: estraverse + version: 1.5.1 + engines: {node: '>=0.4.0'} + dev: false + + registry.npmmirror.com/estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz} + name: estraverse + version: 4.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmmirror.com/estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz} + name: estraverse + version: 5.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmmirror.com/estree-is-function@1.0.0: + resolution: {integrity: sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-is-function/-/estree-is-function-1.0.0.tgz} + name: estree-is-function + version: 1.0.0 + dev: true + + registry.npmmirror.com/estree-is-identifier@1.0.0: + resolution: {integrity: sha512-2BDRGrkQJV/NhCAmmE33A35WAaxq3WQaGHgQuD//7orGWfpFqj8Srkwvx0TH+20yIdOF1yMQwi8anv5ISec2AQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-is-identifier/-/estree-is-identifier-1.0.0.tgz} + name: estree-is-identifier + version: 1.0.0 + dev: true + + registry.npmmirror.com/estree-is-member-expression@1.0.0: + resolution: {integrity: sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz} + name: estree-is-member-expression + version: 1.0.0 + dev: true + + registry.npmmirror.com/estree-is-require@1.0.0: + resolution: {integrity: sha512-oWxQdSEmnUwNZsDQYiBNpVxKEhMmsJQSSxnDrwsr1MWtooCLfhgzsNGzmokdmfK0EzEIS5V4LPvqxv1Kmb1vvA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-is-require/-/estree-is-require-1.0.0.tgz} + name: estree-is-require + version: 1.0.0 + dependencies: + estree-is-identifier: registry.npmmirror.com/estree-is-identifier@1.0.0 + dev: true + + registry.npmmirror.com/esutils@1.0.0: + resolution: {integrity: sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esutils/-/esutils-1.0.0.tgz} + name: esutils + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: false + + registry.npmmirror.com/esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz} + name: esutils + version: 2.0.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz} + name: etag + version: 1.8.1 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz} + name: event-emitter + version: 0.3.5 + dependencies: + d: registry.npmmirror.com/d@1.0.1 + es5-ext: registry.npmmirror.com/es5-ext@0.10.61 + dev: true + + registry.npmmirror.com/eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz} + name: eventemitter3 + version: 4.0.7 + dev: false + + registry.npmmirror.com/events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/events/-/events-3.3.0.tgz} + name: events + version: 3.3.0 + engines: {node: '>=0.8.x'} + dev: true + + registry.npmmirror.com/evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz} + name: evp_bytestokey + version: 1.0.3 + dependencies: + md5.js: registry.npmmirror.com/md5.js@1.3.5 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz} + name: expand-brackets + version: 2.1.4 + engines: {node: '>=0.10.0'} + dependencies: + debug: registry.npmmirror.com/debug@2.6.9 + define-property: registry.npmmirror.com/define-property@0.2.5 + extend-shallow: registry.npmmirror.com/extend-shallow@2.0.1 + posix-character-classes: registry.npmmirror.com/posix-character-classes@0.1.1 + regex-not: registry.npmmirror.com/regex-not@1.0.2 + snapdragon: registry.npmmirror.com/snapdragon@0.8.2 + to-regex: registry.npmmirror.com/to-regex@3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz} + name: expand-tilde + version: 2.0.2 + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: registry.npmmirror.com/homedir-polyfill@1.0.3 + dev: true + + registry.npmmirror.com/express@4.17.1: + resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/express/-/express-4.17.1.tgz} + name: express + version: 4.17.1 + engines: {node: '>= 0.10.0'} + dependencies: + accepts: registry.npmmirror.com/accepts@1.3.7 + array-flatten: registry.npmmirror.com/array-flatten@1.1.1 + body-parser: registry.npmmirror.com/body-parser@1.19.0 + content-disposition: registry.npmmirror.com/content-disposition@0.5.3 + content-type: registry.npmmirror.com/content-type@1.0.4 + cookie: registry.npmmirror.com/cookie@0.4.0 + cookie-signature: registry.npmmirror.com/cookie-signature@1.0.6 + debug: registry.npmmirror.com/debug@2.6.9 + depd: registry.npmmirror.com/depd@1.1.2 + encodeurl: registry.npmmirror.com/encodeurl@1.0.2 + escape-html: registry.npmmirror.com/escape-html@1.0.3 + etag: registry.npmmirror.com/etag@1.8.1 + finalhandler: registry.npmmirror.com/finalhandler@1.1.2 + fresh: registry.npmmirror.com/fresh@0.5.2 + merge-descriptors: registry.npmmirror.com/merge-descriptors@1.0.1 + methods: registry.npmmirror.com/methods@1.1.2 + on-finished: registry.npmmirror.com/on-finished@2.3.0 + parseurl: registry.npmmirror.com/parseurl@1.3.3 + path-to-regexp: registry.npmmirror.com/path-to-regexp@0.1.7 + proxy-addr: registry.npmmirror.com/proxy-addr@2.0.6 + qs: registry.npmmirror.com/qs@6.7.0 + range-parser: registry.npmmirror.com/range-parser@1.2.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + send: registry.npmmirror.com/send@0.17.1 + serve-static: registry.npmmirror.com/serve-static@1.14.1 + setprototypeof: registry.npmmirror.com/setprototypeof@1.1.1 + statuses: registry.npmmirror.com/statuses@1.5.0 + type-is: registry.npmmirror.com/type-is@1.6.18 + utils-merge: registry.npmmirror.com/utils-merge@1.0.1 + vary: registry.npmmirror.com/vary@1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + registry.npmmirror.com/ext@1.6.0: + resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ext/-/ext-1.6.0.tgz} + name: ext + version: 1.6.0 + dependencies: + type: registry.npmmirror.com/type@2.6.0 + dev: true + + registry.npmmirror.com/extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz} + name: extend-shallow + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: registry.npmmirror.com/is-extendable@0.1.1 + dev: true + + registry.npmmirror.com/extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz} + name: extend-shallow + version: 3.0.2 + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: registry.npmmirror.com/assign-symbols@1.0.0 + is-extendable: registry.npmmirror.com/is-extendable@1.0.1 + dev: true + + registry.npmmirror.com/extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz} + name: extend + version: 3.0.2 + + registry.npmmirror.com/extendible@0.1.1: + resolution: {integrity: sha512-AglckQA0TJV8/ZmhQcNmaaFcFFPXFIoZbfuoQOlGDK7Jh/roWotYzJ7ik1FBBCHBr8n7CgTR8lXXPAN8Rfb7rw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extendible/-/extendible-0.1.1.tgz} + name: extendible + version: 0.1.1 + dev: false + + registry.npmmirror.com/extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz} + name: extglob + version: 2.0.4 + engines: {node: '>=0.10.0'} + dependencies: + array-unique: registry.npmmirror.com/array-unique@0.3.2 + define-property: registry.npmmirror.com/define-property@1.0.0 + expand-brackets: registry.npmmirror.com/expand-brackets@2.1.4 + extend-shallow: registry.npmmirror.com/extend-shallow@2.0.1 + fragment-cache: registry.npmmirror.com/fragment-cache@0.2.1 + regex-not: registry.npmmirror.com/regex-not@1.0.2 + snapdragon: registry.npmmirror.com/snapdragon@0.8.2 + to-regex: registry.npmmirror.com/to-regex@3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz} + name: extsprintf + version: 1.3.0 + engines: {'0': node >=0.6.0} + dev: false + + registry.npmmirror.com/failure@1.1.1: + resolution: {integrity: sha512-lzrrk0NUfjVeU3jLmfU01zP5bfg4XVFxHREYGvgJowaCqHLSQtqIGENH/CU+oSs6yfYObdSM7b9UY/3p2VJOSg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/failure/-/failure-1.1.1.tgz} + name: failure + version: 1.1.1 + dev: false + + registry.npmmirror.com/falafel@2.2.5: + resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/falafel/-/falafel-2.2.5.tgz} + name: falafel + version: 2.2.5 + engines: {node: '>=0.4.0'} + dependencies: + acorn: registry.npmmirror.com/acorn@7.4.1 + isarray: registry.npmmirror.com/isarray@2.0.5 + + registry.npmmirror.com/fancy-log@1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fancy-log/-/fancy-log-1.3.3.tgz} + name: fancy-log + version: 1.3.3 + engines: {node: '>= 0.10'} + dependencies: + ansi-gray: registry.npmmirror.com/ansi-gray@0.1.1 + color-support: registry.npmmirror.com/color-support@1.1.3 + parse-node-version: registry.npmmirror.com/parse-node-version@1.0.1 + time-stamp: registry.npmmirror.com/time-stamp@1.1.0 + dev: true + + registry.npmmirror.com/fancy-log@2.0.0: + resolution: {integrity: sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fancy-log/-/fancy-log-2.0.0.tgz} + name: fancy-log + version: 2.0.0 + engines: {node: '>=10.13.0'} + dependencies: + color-support: registry.npmmirror.com/color-support@1.1.3 + dev: true + + registry.npmmirror.com/fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} + name: fast-deep-equal + version: 3.1.3 + + registry.npmmirror.com/fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} + name: fast-json-stable-stringify + version: 2.1.0 + + registry.npmmirror.com/fast-levenshtein@1.1.4: + resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz} + name: fast-levenshtein + version: 1.1.4 + dev: true + + registry.npmmirror.com/fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} + name: fast-levenshtein + version: 2.0.6 + dev: true + + registry.npmmirror.com/fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz} + name: fast-safe-stringify + version: 2.1.1 + dev: true + + registry.npmmirror.com/fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-sha256/-/fast-sha256-1.3.0.tgz} + name: fast-sha256 + version: 1.3.0 + dev: false + + registry.npmmirror.com/file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz} + name: file-entry-cache + version: 6.0.1 + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: registry.npmmirror.com/flat-cache@3.0.4 + dev: true + + registry.npmmirror.com/fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz} + name: fill-range + version: 4.0.0 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow@2.0.1 + is-number: registry.npmmirror.com/is-number@3.0.0 + repeat-string: registry.npmmirror.com/repeat-string@1.6.1 + to-regex-range: registry.npmmirror.com/to-regex-range@2.1.1 + dev: true + + registry.npmmirror.com/fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz} + name: fill-range + version: 7.0.1 + engines: {node: '>=8'} + dependencies: + to-regex-range: registry.npmmirror.com/to-regex-range@5.0.1 + + registry.npmmirror.com/finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz} + name: finalhandler + version: 1.1.2 + engines: {node: '>= 0.8'} + dependencies: + debug: registry.npmmirror.com/debug@2.6.9 + encodeurl: registry.npmmirror.com/encodeurl@1.0.2 + escape-html: registry.npmmirror.com/escape-html@1.0.3 + on-finished: registry.npmmirror.com/on-finished@2.3.0 + parseurl: registry.npmmirror.com/parseurl@1.3.3 + statuses: registry.npmmirror.com/statuses@1.5.0 + unpipe: registry.npmmirror.com/unpipe@1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + registry.npmmirror.com/find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz} + name: find-cache-dir + version: 2.1.0 + engines: {node: '>=6'} + dependencies: + commondir: registry.npmmirror.com/commondir@1.0.1 + make-dir: registry.npmmirror.com/make-dir@2.1.0 + pkg-dir: registry.npmmirror.com/pkg-dir@3.0.0 + dev: true + + registry.npmmirror.com/find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz} + name: find-up + version: 1.1.2 + engines: {node: '>=0.10.0'} + dependencies: + path-exists: registry.npmmirror.com/path-exists@2.1.0 + pinkie-promise: registry.npmmirror.com/pinkie-promise@2.0.1 + dev: true + + registry.npmmirror.com/find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz} + name: find-up + version: 3.0.0 + engines: {node: '>=6'} + dependencies: + locate-path: registry.npmmirror.com/locate-path@3.0.0 + dev: true + + registry.npmmirror.com/find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz} + name: find-up + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + locate-path: registry.npmmirror.com/locate-path@6.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 + dev: true + + registry.npmmirror.com/findup-sync@2.0.0: + resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/findup-sync/-/findup-sync-2.0.0.tgz} + name: findup-sync + version: 2.0.0 + engines: {node: '>= 0.10'} + dependencies: + detect-file: registry.npmmirror.com/detect-file@1.0.0 + is-glob: registry.npmmirror.com/is-glob@3.1.0 + micromatch: registry.npmmirror.com/micromatch@3.1.10 + resolve-dir: registry.npmmirror.com/resolve-dir@1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/findup-sync@3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/findup-sync/-/findup-sync-3.0.0.tgz} + name: findup-sync + version: 3.0.0 + engines: {node: '>= 0.10'} + dependencies: + detect-file: registry.npmmirror.com/detect-file@1.0.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + micromatch: registry.npmmirror.com/micromatch@3.1.10 + resolve-dir: registry.npmmirror.com/resolve-dir@1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/fined@1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fined/-/fined-1.2.0.tgz} + name: fined + version: 1.2.0 + engines: {node: '>= 0.10'} + dependencies: + expand-tilde: registry.npmmirror.com/expand-tilde@2.0.2 + is-plain-object: registry.npmmirror.com/is-plain-object@2.0.4 + object.defaults: registry.npmmirror.com/object.defaults@1.1.0 + object.pick: registry.npmmirror.com/object.pick@1.3.0 + parse-filepath: registry.npmmirror.com/parse-filepath@1.0.2 + dev: true + + registry.npmmirror.com/flagged-respawn@1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz} + name: flagged-respawn + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz} + name: flat-cache + version: 3.0.4 + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: registry.npmmirror.com/flatted@3.2.5 + rimraf: registry.npmmirror.com/rimraf@3.0.2 + dev: true + + registry.npmmirror.com/flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz} + name: flat + version: 5.0.2 + hasBin: true + dev: true + + registry.npmmirror.com/flatted@3.2.5: + resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.5.tgz} + name: flatted + version: 3.2.5 + dev: true + + registry.npmmirror.com/flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz} + name: flush-write-stream + version: 1.1.1 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz} + name: for-each + version: 0.3.3 + dependencies: + is-callable: registry.npmmirror.com/is-callable@1.2.4 + dev: true + + registry.npmmirror.com/for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz} + name: for-in + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/for-own/-/for-own-1.0.0.tgz} + name: for-own + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + for-in: registry.npmmirror.com/for-in@1.0.2 + dev: true + + registry.npmmirror.com/forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz} + name: forever-agent + version: 0.6.1 + dev: false + + registry.npmmirror.com/fork-stream@0.0.4: + resolution: {integrity: sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fork-stream/-/fork-stream-0.0.4.tgz} + name: fork-stream + version: 0.0.4 + dev: true + + registry.npmmirror.com/form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz} + name: form-data + version: 2.3.3 + engines: {node: '>= 0.12'} + dependencies: + asynckit: registry.npmmirror.com/asynckit@0.4.0 + combined-stream: registry.npmmirror.com/combined-stream@1.0.8 + mime-types: registry.npmmirror.com/mime-types@2.1.27 + dev: false + + registry.npmmirror.com/forwarded@0.1.2: + resolution: {integrity: sha512-Ua9xNhH0b8pwE3yRbFfXJvfdWF0UHNCdeyb2sbi9Ul/M+r3PTdrz7Cv4SCfZRMjmzEM9PhraqfZFbGTIg3OMyA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/forwarded/-/forwarded-0.1.2.tgz} + name: forwarded + version: 0.1.2 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz} + name: fragment-cache + version: 0.2.1 + engines: {node: '>=0.10.0'} + dependencies: + map-cache: registry.npmmirror.com/map-cache@0.2.2 + dev: true + + registry.npmmirror.com/fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz} + name: fresh + version: 0.5.2 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/from2-string@1.1.0: + resolution: {integrity: sha512-m8vCh+KnXXXBtfF2VUbiYlQ+nczLcntB0BrtNgpmLkHylhObe9WF1b2LZjBBzrZzA6P4mkEla6ZYQoOUTG8cYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/from2-string/-/from2-string-1.1.0.tgz} + name: from2-string + version: 1.1.0 + dependencies: + from2: registry.npmmirror.com/from2@2.3.0 + dev: true + + registry.npmmirror.com/from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz} + name: from2 + version: 2.3.0 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/fs-mkdirp-stream@1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz} + name: fs-mkdirp-stream + version: 1.0.0 + engines: {node: '>= 0.10'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz} + name: fs.realpath + version: 1.0.0 + dev: true + + registry.npmmirror.com/function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz} + name: function-bind + version: 1.1.1 + + registry.npmmirror.com/function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz} + name: function.prototype.name + version: 1.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 + dev: true + + registry.npmmirror.com/functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz} + name: functional-red-black-tree + version: 1.0.1 + dev: true + + registry.npmmirror.com/functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz} + name: functions-have-names + version: 1.2.3 + dev: true + + registry.npmmirror.com/gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} + name: gensync + version: 1.0.0-beta.2 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/get-assigned-identifiers@1.2.0: + resolution: {integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz} + name: get-assigned-identifiers + version: 1.2.0 + dev: true + + registry.npmmirror.com/get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-1.0.3.tgz} + name: get-caller-file + version: 1.0.3 + dev: true + + registry.npmmirror.com/get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz} + name: get-caller-file + version: 2.0.5 + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + registry.npmmirror.com/get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.0.tgz} + name: get-func-name + version: 2.0.0 + dev: true + + registry.npmmirror.com/get-intrinsic@1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz} + name: get-intrinsic + version: 1.1.1 + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.1 + has: registry.npmmirror.com/has@1.0.3 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz} + name: get-stream + version: 4.1.0 + engines: {node: '>=6'} + dependencies: + pump: registry.npmmirror.com/pump@3.0.0 + dev: true + + registry.npmmirror.com/get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz} + name: get-stream + version: 5.2.0 + engines: {node: '>=8'} + dependencies: + pump: registry.npmmirror.com/pump@3.0.0 + dev: true + + registry.npmmirror.com/get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz} + name: get-symbol-description + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.1.1 + dev: true + + registry.npmmirror.com/get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz} + name: get-value + version: 2.0.6 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz} + name: getpass + version: 0.1.7 + dependencies: + assert-plus: registry.npmmirror.com/assert-plus@1.0.0 + dev: false + + registry.npmmirror.com/glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz} + name: glob-parent + version: 3.1.0 + dependencies: + is-glob: registry.npmmirror.com/is-glob@3.1.0 + path-dirname: registry.npmmirror.com/path-dirname@1.0.2 + dev: true + + registry.npmmirror.com/glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz} + name: glob-parent + version: 5.1.2 + engines: {node: '>= 6'} + dependencies: + is-glob: registry.npmmirror.com/is-glob@4.0.3 + dev: true + + registry.npmmirror.com/glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz} + name: glob-parent + version: 6.0.2 + engines: {node: '>=10.13.0'} + dependencies: + is-glob: registry.npmmirror.com/is-glob@4.0.3 + dev: true + + registry.npmmirror.com/glob-stream@6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-stream/-/glob-stream-6.1.0.tgz} + name: glob-stream + version: 6.1.0 + engines: {node: '>= 0.10'} + dependencies: + extend: registry.npmmirror.com/extend@3.0.2 + glob: registry.npmmirror.com/glob@7.2.3 + glob-parent: registry.npmmirror.com/glob-parent@3.1.0 + is-negated-glob: registry.npmmirror.com/is-negated-glob@1.0.0 + ordered-read-streams: registry.npmmirror.com/ordered-read-streams@1.0.1 + pumpify: registry.npmmirror.com/pumpify@1.5.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + remove-trailing-separator: registry.npmmirror.com/remove-trailing-separator@1.1.0 + to-absolute-glob: registry.npmmirror.com/to-absolute-glob@2.0.2 + unique-stream: registry.npmmirror.com/unique-stream@2.3.1 + dev: true + + registry.npmmirror.com/glob-watcher@5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob-watcher/-/glob-watcher-5.0.5.tgz} + name: glob-watcher + version: 5.0.5 + engines: {node: '>= 0.10'} + dependencies: + anymatch: registry.npmmirror.com/anymatch@2.0.0 + async-done: registry.npmmirror.com/async-done@1.3.2 + chokidar: registry.npmmirror.com/chokidar@2.1.8 + is-negated-glob: registry.npmmirror.com/is-negated-glob@1.0.0 + just-debounce: registry.npmmirror.com/just-debounce@1.1.0 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + object.defaults: registry.npmmirror.com/object.defaults@1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz} + name: glob + version: 7.2.0 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz} + name: glob + version: 7.2.3 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/global-dirs@3.0.0: + resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.0.tgz} + name: global-dirs + version: 3.0.0 + engines: {node: '>=10'} + dependencies: + ini: registry.npmmirror.com/ini@2.0.0 + dev: true + + registry.npmmirror.com/global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-modules/-/global-modules-1.0.0.tgz} + name: global-modules + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: registry.npmmirror.com/global-prefix@1.0.2 + is-windows: registry.npmmirror.com/is-windows@1.0.2 + resolve-dir: registry.npmmirror.com/resolve-dir@1.0.1 + dev: true + + registry.npmmirror.com/global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/global-prefix/-/global-prefix-1.0.2.tgz} + name: global-prefix + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: registry.npmmirror.com/expand-tilde@2.0.2 + homedir-polyfill: registry.npmmirror.com/homedir-polyfill@1.0.3 + ini: registry.npmmirror.com/ini@1.3.8 + is-windows: registry.npmmirror.com/is-windows@1.0.2 + which: registry.npmmirror.com/which@1.3.1 + dev: true + + registry.npmmirror.com/globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz} + name: globals + version: 11.12.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/globals@13.15.0: + resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globals/-/globals-13.15.0.tgz} + name: globals + version: 13.15.0 + engines: {node: '>=8'} + dependencies: + type-fest: registry.npmmirror.com/type-fest@0.20.2 + dev: true + + registry.npmmirror.com/glogg@1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/glogg/-/glogg-1.0.2.tgz} + name: glogg + version: 1.0.2 + engines: {node: '>= 0.10'} + dependencies: + sparkles: registry.npmmirror.com/sparkles@1.0.1 + dev: true + + registry.npmmirror.com/got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/got/-/got-9.6.0.tgz} + name: got + version: 9.6.0 + engines: {node: '>=8.6'} + dependencies: + '@sindresorhus/is': registry.npmmirror.com/@sindresorhus/is@0.14.0 + '@szmarczak/http-timer': registry.npmmirror.com/@szmarczak/http-timer@1.1.2 + '@types/keyv': registry.npmmirror.com/@types/keyv@3.1.4 + '@types/responselike': registry.npmmirror.com/@types/responselike@1.0.0 + cacheable-request: registry.npmmirror.com/cacheable-request@6.1.0 + decompress-response: registry.npmmirror.com/decompress-response@3.3.0 + duplexer3: registry.npmmirror.com/duplexer3@0.1.4 + get-stream: registry.npmmirror.com/get-stream@4.1.0 + lowercase-keys: registry.npmmirror.com/lowercase-keys@1.0.1 + mimic-response: registry.npmmirror.com/mimic-response@1.0.1 + p-cancelable: registry.npmmirror.com/p-cancelable@1.1.0 + to-readable-stream: registry.npmmirror.com/to-readable-stream@1.0.0 + url-parse-lax: registry.npmmirror.com/url-parse-lax@3.0.0 + dev: true + + registry.npmmirror.com/graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz} + name: graceful-fs + version: 4.2.10 + dev: true + + registry.npmmirror.com/gulp-babel@8.0.0(@babel/core@7.18.0): + resolution: {integrity: sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-babel/-/gulp-babel-8.0.0.tgz} + id: registry.npmmirror.com/gulp-babel/8.0.0 + name: gulp-babel + version: 8.0.0 + engines: {node: '>=6'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.18.0 + plugin-error: registry.npmmirror.com/plugin-error@1.0.1 + replace-ext: registry.npmmirror.com/replace-ext@1.0.1 + through2: registry.npmmirror.com/through2@2.0.5 + vinyl-sourcemaps-apply: registry.npmmirror.com/vinyl-sourcemaps-apply@0.2.1 + dev: true + + registry.npmmirror.com/gulp-cli@2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-cli/-/gulp-cli-2.3.0.tgz} + name: gulp-cli + version: 2.3.0 + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + ansi-colors: registry.npmmirror.com/ansi-colors@1.1.0 + archy: registry.npmmirror.com/archy@1.0.0 + array-sort: registry.npmmirror.com/array-sort@1.0.0 + color-support: registry.npmmirror.com/color-support@1.1.3 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + copy-props: registry.npmmirror.com/copy-props@2.0.5 + fancy-log: registry.npmmirror.com/fancy-log@1.3.3 + gulplog: registry.npmmirror.com/gulplog@1.0.0 + interpret: registry.npmmirror.com/interpret@1.4.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + liftoff: registry.npmmirror.com/liftoff@3.1.0 + matchdep: registry.npmmirror.com/matchdep@2.0.0 + mute-stdout: registry.npmmirror.com/mute-stdout@1.0.1 + pretty-hrtime: registry.npmmirror.com/pretty-hrtime@1.0.3 + replace-homedir: registry.npmmirror.com/replace-homedir@1.0.0 + semver-greatest-satisfied-range: registry.npmmirror.com/semver-greatest-satisfied-range@1.1.0 + v8flags: registry.npmmirror.com/v8flags@3.2.0 + yargs: registry.npmmirror.com/yargs@7.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/gulp-eslint-new@1.4.4: + resolution: {integrity: sha512-KyipGo8+DVFrKF+WAxGVxOL0Z47ij0wZq8PH1ZiRLpoUOukNiSiVm1TrAD78Y2vqaN7q2flYpC5dwGdQSGmjSQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-eslint-new/-/gulp-eslint-new-1.4.4.tgz} + name: gulp-eslint-new + version: 1.4.4 + engines: {node: 12 >=12.20 || 14 >=14.13 || >=16} + dependencies: + '@types/eslint': registry.npmmirror.com/@types/eslint@8.4.2 + '@types/node': registry.npmmirror.com/@types/node@17.0.35 + eslint: registry.npmmirror.com/eslint@8.16.0 + fancy-log: registry.npmmirror.com/fancy-log@2.0.0 + plugin-error: registry.npmmirror.com/plugin-error@1.0.1 + ternary-stream: registry.npmmirror.com/ternary-stream@3.0.0 + vinyl-fs: registry.npmmirror.com/vinyl-fs@3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/gulp-file@0.4.0: + resolution: {integrity: sha512-3NPCJpAPpbNoV2aml8T96OK3Aof4pm4PMOIa1jSQbMNSNUUXdZ5QjVgLXLStjv0gg9URcETc7kvYnzXdYXUWug==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-file/-/gulp-file-0.4.0.tgz} + name: gulp-file + version: 0.4.0 + dependencies: + through2: registry.npmmirror.com/through2@0.4.2 + vinyl: registry.npmmirror.com/vinyl@2.2.1 + dev: true + + registry.npmmirror.com/gulp-header@2.0.9: + resolution: {integrity: sha512-LMGiBx+qH8giwrOuuZXSGvswcIUh0OiioNkUpLhNyvaC6/Ga8X6cfAeme2L5PqsbXMhL8o8b/OmVqIQdxprhcQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-header/-/gulp-header-2.0.9.tgz} + name: gulp-header + version: 2.0.9 + dependencies: + concat-with-sourcemaps: registry.npmmirror.com/concat-with-sourcemaps@1.1.0 + lodash.template: registry.npmmirror.com/lodash.template@4.5.0 + map-stream: registry.npmmirror.com/map-stream@0.0.7 + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/gulp-prettier@4.0.0: + resolution: {integrity: sha512-REx99tBRRKJD7qLPaKpplReM9cq2vFvqhMbcUZtJEVjxGjb5Ji+gN9vi8bsM8UhnDV+l0Zrf5x6L4uZiDmvGFQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-prettier/-/gulp-prettier-4.0.0.tgz} + name: gulp-prettier + version: 4.0.0 + engines: {node: '>=12'} + dependencies: + plugin-error: registry.npmmirror.com/plugin-error@1.0.1 + prettier: registry.npmmirror.com/prettier@2.6.2 + through2: registry.npmmirror.com/through2@4.0.2 + dev: true + + registry.npmmirror.com/gulp-tap@2.0.0: + resolution: {integrity: sha512-U5/v1bTozx672QHzrvzPe6fPl2io7Wqyrx2y30AG53eMU/idH4BrY/b2yikOkdyhjDqGgPoMUMnpBg9e9LK8Nw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp-tap/-/gulp-tap-2.0.0.tgz} + name: gulp-tap + version: 2.0.0 + dependencies: + through2: registry.npmmirror.com/through2@3.0.2 + dev: true + + registry.npmmirror.com/gulp@4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulp/-/gulp-4.0.2.tgz} + name: gulp + version: 4.0.2 + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + glob-watcher: registry.npmmirror.com/glob-watcher@5.0.5 + gulp-cli: registry.npmmirror.com/gulp-cli@2.3.0 + undertaker: registry.npmmirror.com/undertaker@1.3.0 + vinyl-fs: registry.npmmirror.com/vinyl-fs@3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/gulplog@1.0.0: + resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gulplog/-/gulplog-1.0.0.tgz} + name: gulplog + version: 1.0.0 + engines: {node: '>= 0.10'} + dependencies: + glogg: registry.npmmirror.com/glogg@1.0.2 + dev: true + + registry.npmmirror.com/hang@1.0.0: + resolution: {integrity: sha512-vtBz98Bt/Tbm03cZO5Ymc7ZL8ead/jIx9T5Wg/xuz+9BXPAJNJSdGQW63LoaesogUQKTpHyal339hxTaTf/APg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hang/-/hang-1.0.0.tgz} + name: hang + version: 1.0.0 + dev: false + + registry.npmmirror.com/har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz} + name: har-schema + version: 2.0.0 + engines: {node: '>=4'} + dev: false + + registry.npmmirror.com/har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz} + name: har-validator + version: 5.1.5 + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: registry.npmmirror.com/ajv@6.12.4 + har-schema: registry.npmmirror.com/har-schema@2.0.0 + dev: false + + registry.npmmirror.com/has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz} + name: has-ansi + version: 2.0.0 + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@2.1.1 + dev: true + + registry.npmmirror.com/has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz} + name: has-bigints + version: 1.0.2 + dev: true + + registry.npmmirror.com/has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz} + name: has-flag + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz} + name: has-flag + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz} + name: has-property-descriptors + version: 1.0.0 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.1.1 + dev: true + + registry.npmmirror.com/has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz} + name: has-symbols + version: 1.0.3 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz} + name: has-tostringtag + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz} + name: has-value + version: 0.3.1 + engines: {node: '>=0.10.0'} + dependencies: + get-value: registry.npmmirror.com/get-value@2.0.6 + has-values: registry.npmmirror.com/has-values@0.1.4 + isobject: registry.npmmirror.com/isobject@2.1.0 + dev: true + + registry.npmmirror.com/has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz} + name: has-value + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + get-value: registry.npmmirror.com/get-value@2.0.6 + has-values: registry.npmmirror.com/has-values@1.0.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz} + name: has-values + version: 0.1.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz} + name: has-values + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-number: registry.npmmirror.com/is-number@3.0.0 + kind-of: registry.npmmirror.com/kind-of@4.0.0 + dev: true + + registry.npmmirror.com/has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-yarn/-/has-yarn-2.1.0.tgz} + name: has-yarn + version: 2.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has/-/has-1.0.3.tgz} + name: has + version: 1.0.3 + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.1 + + registry.npmmirror.com/hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz} + name: hash-base + version: 3.1.0 + engines: {node: '>=4'} + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz} + name: hash.js + version: 1.1.7 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + minimalistic-assert: registry.npmmirror.com/minimalistic-assert@1.0.1 + dev: true + + registry.npmmirror.com/he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} + name: he + version: 1.2.0 + hasBin: true + dev: true + + registry.npmmirror.com/hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz} + name: hmac-drbg + version: 1.0.1 + dependencies: + hash.js: registry.npmmirror.com/hash.js@1.1.7 + minimalistic-assert: registry.npmmirror.com/minimalistic-assert@1.0.1 + minimalistic-crypto-utils: registry.npmmirror.com/minimalistic-crypto-utils@1.0.1 + dev: true + + registry.npmmirror.com/homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz} + name: homedir-polyfill + version: 1.0.3 + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: registry.npmmirror.com/parse-passwd@1.0.0 + dev: true + + registry.npmmirror.com/hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz} + name: hosted-git-info + version: 2.8.9 + dev: true + + registry.npmmirror.com/htmlescape@1.1.1: + resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/htmlescape/-/htmlescape-1.1.1.tgz} + name: htmlescape + version: 1.1.1 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/http-cache-semantics@4.1.0: + resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz} + name: http-cache-semantics + version: 4.1.0 + dev: true + + registry.npmmirror.com/http-errors@1.7.2: + resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-errors/-/http-errors-1.7.2.tgz} + name: http-errors + version: 1.7.2 + engines: {node: '>= 0.6'} + dependencies: + depd: registry.npmmirror.com/depd@1.1.2 + inherits: registry.npmmirror.com/inherits@2.0.3 + setprototypeof: registry.npmmirror.com/setprototypeof@1.1.1 + statuses: registry.npmmirror.com/statuses@1.5.0 + toidentifier: registry.npmmirror.com/toidentifier@1.0.0 + dev: false + + registry.npmmirror.com/http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz} + name: http-proxy-middleware + version: 2.0.6 + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/http-proxy': registry.npmmirror.com/@types/http-proxy@1.17.14 + http-proxy: registry.npmmirror.com/http-proxy@1.18.1 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + is-plain-obj: registry.npmmirror.com/is-plain-obj@3.0.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + transitivePeerDependencies: + - debug + dev: false + + registry.npmmirror.com/http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz} + name: http-proxy + version: 1.18.1 + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: registry.npmmirror.com/eventemitter3@4.0.7 + follow-redirects: 1.15.5 + requires-port: registry.npmmirror.com/requires-port@1.0.0 + transitivePeerDependencies: + - debug + dev: false + + registry.npmmirror.com/http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz} + name: http-signature + version: 1.2.0 + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: registry.npmmirror.com/assert-plus@1.0.0 + jsprim: registry.npmmirror.com/jsprim@1.4.1 + sshpk: registry.npmmirror.com/sshpk@1.16.1 + dev: false + + registry.npmmirror.com/https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz} + name: https-browserify + version: 1.0.0 + dev: true + + registry.npmmirror.com/iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz} + name: iconv-lite + version: 0.4.24 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: false + + registry.npmmirror.com/ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz} + name: ieee754 + version: 1.2.1 + dev: true + + registry.npmmirror.com/ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz} + name: ignore-by-default + version: 1.0.1 + dev: true + + registry.npmmirror.com/ignore@5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz} + name: ignore + version: 5.2.0 + engines: {node: '>= 4'} + dev: true + + registry.npmmirror.com/import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz} + name: import-fresh + version: 3.3.0 + engines: {node: '>=6'} + dependencies: + parent-module: registry.npmmirror.com/parent-module@1.0.1 + resolve-from: registry.npmmirror.com/resolve-from@4.0.0 + dev: true + + registry.npmmirror.com/import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/import-lazy/-/import-lazy-2.1.0.tgz} + name: import-lazy + version: 2.1.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz} + name: imurmurhash + version: 0.1.4 + engines: {node: '>=0.8.19'} + dev: true + + registry.npmmirror.com/inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz} + name: inflight + version: 1.0.6 + dependencies: + once: registry.npmmirror.com/once@1.4.0 + wrappy: registry.npmmirror.com/wrappy@1.0.2 + dev: true + + registry.npmmirror.com/inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.1.tgz} + name: inherits + version: 2.0.1 + dev: true + + registry.npmmirror.com/inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz} + name: inherits + version: 2.0.3 + dev: false + + registry.npmmirror.com/inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz} + name: inherits + version: 2.0.4 + + registry.npmmirror.com/ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz} + name: ini + version: 1.3.8 + dev: true + + registry.npmmirror.com/ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz} + name: ini + version: 2.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/inline-source-map@0.6.2: + resolution: {integrity: sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inline-source-map/-/inline-source-map-0.6.2.tgz} + name: inline-source-map + version: 0.6.2 + dependencies: + source-map: registry.npmmirror.com/source-map@0.5.7 + dev: true + + registry.npmmirror.com/insert-module-globals@7.2.1: + resolution: {integrity: sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz} + name: insert-module-globals + version: 7.2.1 + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream@1.3.5 + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + combine-source-map: registry.npmmirror.com/combine-source-map@0.8.0 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + is-buffer: registry.npmmirror.com/is-buffer@1.1.6 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + process: registry.npmmirror.com/process@0.11.10 + through2: registry.npmmirror.com/through2@2.0.5 + undeclared-identifiers: registry.npmmirror.com/undeclared-identifiers@1.1.3 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/internal-slot@1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.3.tgz} + name: internal-slot + version: 1.0.3 + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.1.1 + has: registry.npmmirror.com/has@1.0.3 + side-channel: registry.npmmirror.com/side-channel@1.0.4 + dev: true + + registry.npmmirror.com/interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz} + name: interpret + version: 1.4.0 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/invert-kv/-/invert-kv-1.0.0.tgz} + name: invert-kv + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz} + name: ipaddr.js + version: 1.9.1 + engines: {node: '>= 0.10'} + dev: false + + registry.npmmirror.com/is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-absolute/-/is-absolute-1.0.0.tgz} + name: is-absolute + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-relative: registry.npmmirror.com/is-relative@1.0.0 + is-windows: registry.npmmirror.com/is-windows@1.0.2 + dev: true + + registry.npmmirror.com/is-accessor-descriptor@0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz} + name: is-accessor-descriptor + version: 0.1.6 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@3.2.2 + dev: true + + registry.npmmirror.com/is-accessor-descriptor@1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz} + name: is-accessor-descriptor + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@6.0.3 + dev: true + + registry.npmmirror.com/is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz} + name: is-arguments + version: 1.1.1 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz} + name: is-arrayish + version: 0.2.1 + dev: true + + registry.npmmirror.com/is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz} + name: is-bigint + version: 1.0.4 + dependencies: + has-bigints: registry.npmmirror.com/has-bigints@1.0.2 + dev: true + + registry.npmmirror.com/is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz} + name: is-binary-path + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: registry.npmmirror.com/binary-extensions@1.13.1 + dev: true + + registry.npmmirror.com/is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz} + name: is-binary-path + version: 2.1.0 + engines: {node: '>=8'} + dependencies: + binary-extensions: registry.npmmirror.com/binary-extensions@2.2.0 + dev: true + + registry.npmmirror.com/is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz} + name: is-boolean-object + version: 1.1.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz} + name: is-buffer + version: 1.1.6 + dev: true + + registry.npmmirror.com/is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz} + name: is-buffer + version: 2.0.5 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/is-callable@1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.4.tgz} + name: is-callable + version: 1.2.4 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-ci/-/is-ci-2.0.0.tgz} + name: is-ci + version: 2.0.0 + hasBin: true + dependencies: + ci-info: registry.npmmirror.com/ci-info@2.0.0 + dev: true + + registry.npmmirror.com/is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz} + name: is-core-module + version: 2.9.0 + dependencies: + has: registry.npmmirror.com/has@1.0.3 + dev: true + + registry.npmmirror.com/is-data-descriptor@0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz} + name: is-data-descriptor + version: 0.1.4 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@3.2.2 + dev: true + + registry.npmmirror.com/is-data-descriptor@1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz} + name: is-data-descriptor + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@6.0.3 + dev: true + + registry.npmmirror.com/is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz} + name: is-date-object + version: 1.0.5 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-descriptor@0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.6.tgz} + name: is-descriptor + version: 0.1.6 + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: registry.npmmirror.com/is-accessor-descriptor@0.1.6 + is-data-descriptor: registry.npmmirror.com/is-data-descriptor@0.1.4 + kind-of: registry.npmmirror.com/kind-of@5.1.0 + dev: true + + registry.npmmirror.com/is-descriptor@1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz} + name: is-descriptor + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: registry.npmmirror.com/is-accessor-descriptor@1.0.0 + is-data-descriptor: registry.npmmirror.com/is-data-descriptor@1.0.0 + kind-of: registry.npmmirror.com/kind-of@6.0.3 + dev: true + + registry.npmmirror.com/is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz} + name: is-extendable + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz} + name: is-extendable + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: registry.npmmirror.com/is-plain-object@2.0.4 + dev: true + + registry.npmmirror.com/is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz} + name: is-extglob + version: 2.1.1 + engines: {node: '>=0.10.0'} + + registry.npmmirror.com/is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz} + name: is-fullwidth-code-point + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: registry.npmmirror.com/number-is-nan@1.0.1 + dev: true + + registry.npmmirror.com/is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} + name: is-fullwidth-code-point + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz} + name: is-generator-function + version: 1.0.10 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz} + name: is-glob + version: 3.1.0 + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: registry.npmmirror.com/is-extglob@2.1.1 + dev: true + + registry.npmmirror.com/is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz} + name: is-glob + version: 4.0.3 + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: registry.npmmirror.com/is-extglob@2.1.1 + + registry.npmmirror.com/is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz} + name: is-installed-globally + version: 0.4.0 + engines: {node: '>=10'} + dependencies: + global-dirs: registry.npmmirror.com/global-dirs@3.0.0 + is-path-inside: registry.npmmirror.com/is-path-inside@3.0.3 + dev: true + + registry.npmmirror.com/is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz} + name: is-negated-glob + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz} + name: is-negative-zero + version: 2.0.2 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-npm/-/is-npm-5.0.0.tgz} + name: is-npm + version: 5.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz} + name: is-number-object + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz} + name: is-number + version: 3.0.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@3.2.2 + dev: true + + registry.npmmirror.com/is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-4.0.0.tgz} + name: is-number + version: 4.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz} + name: is-number + version: 7.0.0 + engines: {node: '>=0.12.0'} + + registry.npmmirror.com/is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz} + name: is-obj + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz} + name: is-path-inside + version: 3.0.3 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz} + name: is-plain-obj + version: 2.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz} + name: is-plain-obj + version: 3.0.0 + engines: {node: '>=10'} + dev: false + + registry.npmmirror.com/is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz} + name: is-plain-object + version: 2.0.4 + engines: {node: '>=0.10.0'} + dependencies: + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz} + name: is-plain-object + version: 5.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz} + name: is-regex + version: 1.1.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-relative/-/is-relative-1.0.0.tgz} + name: is-relative + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: registry.npmmirror.com/is-unc-path@1.0.0 + dev: true + + registry.npmmirror.com/is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz} + name: is-shared-array-buffer + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + dev: true + + registry.npmmirror.com/is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz} + name: is-string + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz} + name: is-symbol + version: 1.0.4 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/is-typed-array@1.1.9: + resolution: {integrity: sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.9.tgz} + name: is-typed-array + version: 1.1.9 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.2 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + for-each: registry.npmmirror.com/for-each@0.3.3 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz} + name: is-typedarray + version: 1.0.0 + + registry.npmmirror.com/is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-unc-path/-/is-unc-path-1.0.0.tgz} + name: is-unc-path + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: registry.npmmirror.com/unc-path-regex@0.1.2 + dev: true + + registry.npmmirror.com/is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} + name: is-unicode-supported + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz} + name: is-utf8 + version: 0.2.1 + dev: true + + registry.npmmirror.com/is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz} + name: is-valid-glob + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz} + name: is-weakref + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + dev: true + + registry.npmmirror.com/is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz} + name: is-windows + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz} + name: is-yarn-global + version: 0.3.0 + dev: true + + registry.npmmirror.com/isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz} + name: isarray + version: 0.0.1 + + registry.npmmirror.com/isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz} + name: isarray + version: 1.0.0 + + registry.npmmirror.com/isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz} + name: isarray + version: 2.0.5 + + registry.npmmirror.com/isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz} + name: isexe + version: 2.0.0 + dev: true + + registry.npmmirror.com/isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz} + name: isobject + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + isarray: registry.npmmirror.com/isarray@1.0.0 + dev: true + + registry.npmmirror.com/isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz} + name: isobject + version: 3.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz} + name: isstream + version: 0.1.2 + dev: false + + registry.npmmirror.com/js-base64@3.7.2: + resolution: {integrity: sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-base64/-/js-base64-3.7.2.tgz} + name: js-base64 + version: 3.7.2 + dev: false + + registry.npmmirror.com/js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz} + name: js-tokens + version: 4.0.0 + dev: true + + registry.npmmirror.com/js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz} + name: js-yaml + version: 3.14.1 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse@1.0.10 + esprima: registry.npmmirror.com/esprima@4.0.1 + dev: false + + registry.npmmirror.com/js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz} + name: js-yaml + version: 4.1.0 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse@2.0.1 + dev: true + + registry.npmmirror.com/jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz} + name: jsbn + version: 0.1.1 + dev: false + + registry.npmmirror.com/jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz} + name: jsesc + version: 0.5.0 + hasBin: true + dev: true + + registry.npmmirror.com/jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz} + name: jsesc + version: 2.5.2 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz} + name: json-buffer + version: 3.0.0 + dev: true + + registry.npmmirror.com/json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} + name: json-schema-traverse + version: 0.4.1 + + registry.npmmirror.com/json-schema@0.2.3: + resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-schema/-/json-schema-0.2.3.tgz} + name: json-schema + version: 0.2.3 + dev: false + + registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} + name: json-stable-stringify-without-jsonify + version: 1.0.1 + dev: true + + registry.npmmirror.com/json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz} + name: json-stringify-safe + version: 5.0.1 + dev: false + + registry.npmmirror.com/json5@2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz} + name: json5 + version: 2.2.1 + engines: {node: '>=6'} + hasBin: true + dev: true + + registry.npmmirror.com/jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz} + name: jsonparse + version: 1.3.1 + engines: {'0': node >= 0.2.0} + dev: true + + registry.npmmirror.com/jsprim@1.4.1: + resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsprim/-/jsprim-1.4.1.tgz} + name: jsprim + version: 1.4.1 + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: registry.npmmirror.com/assert-plus@1.0.0 + extsprintf: registry.npmmirror.com/extsprintf@1.3.0 + json-schema: registry.npmmirror.com/json-schema@0.2.3 + verror: registry.npmmirror.com/verror@1.10.0 + dev: false + + registry.npmmirror.com/just-debounce@1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/just-debounce/-/just-debounce-1.1.0.tgz} + name: just-debounce + version: 1.1.0 + dev: true + + registry.npmmirror.com/keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/keyv/-/keyv-3.1.0.tgz} + name: keyv + version: 3.1.0 + dependencies: + json-buffer: registry.npmmirror.com/json-buffer@3.0.0 + dev: true + + registry.npmmirror.com/kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz} + name: kind-of + version: 3.2.2 + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: registry.npmmirror.com/is-buffer@1.1.6 + dev: true + + registry.npmmirror.com/kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz} + name: kind-of + version: 4.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: registry.npmmirror.com/is-buffer@1.1.6 + dev: true + + registry.npmmirror.com/kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz} + name: kind-of + version: 5.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz} + name: kind-of + version: 6.0.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/labeled-stream-splicer@2.0.2: + resolution: {integrity: sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz} + name: labeled-stream-splicer + version: 2.0.2 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + stream-splicer: registry.npmmirror.com/stream-splicer@2.0.1 + dev: true + + registry.npmmirror.com/last-run@1.1.1: + resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/last-run/-/last-run-1.1.1.tgz} + name: last-run + version: 1.1.1 + engines: {node: '>= 0.10'} + dependencies: + default-resolution: registry.npmmirror.com/default-resolution@2.0.0 + es6-weak-map: registry.npmmirror.com/es6-weak-map@2.0.3 + dev: true + + registry.npmmirror.com/latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/latest-version/-/latest-version-5.1.0.tgz} + name: latest-version + version: 5.1.0 + engines: {node: '>=8'} + dependencies: + package-json: registry.npmmirror.com/package-json@6.5.0 + dev: true + + registry.npmmirror.com/lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz} + name: lazystream + version: 1.0.1 + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lcid/-/lcid-1.0.0.tgz} + name: lcid + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: registry.npmmirror.com/invert-kv@1.0.0 + dev: true + + registry.npmmirror.com/lead@1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lead/-/lead-1.0.0.tgz} + name: lead + version: 1.0.0 + engines: {node: '>= 0.10'} + dependencies: + flush-write-stream: registry.npmmirror.com/flush-write-stream@1.1.1 + dev: true + + registry.npmmirror.com/levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz} + name: levn + version: 0.3.0 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.1.2 + type-check: registry.npmmirror.com/type-check@0.3.2 + dev: true + + registry.npmmirror.com/levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz} + name: levn + version: 0.4.1 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 + dev: true + + registry.npmmirror.com/liftoff@3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/liftoff/-/liftoff-3.1.0.tgz} + name: liftoff + version: 3.1.0 + engines: {node: '>= 0.8'} + dependencies: + extend: registry.npmmirror.com/extend@3.0.2 + findup-sync: registry.npmmirror.com/findup-sync@3.0.0 + fined: registry.npmmirror.com/fined@1.2.0 + flagged-respawn: registry.npmmirror.com/flagged-respawn@1.0.1 + is-plain-object: registry.npmmirror.com/is-plain-object@2.0.4 + object.map: registry.npmmirror.com/object.map@1.0.1 + rechoir: registry.npmmirror.com/rechoir@0.6.2 + resolve: registry.npmmirror.com/resolve@1.22.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz} + name: load-json-file + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + parse-json: registry.npmmirror.com/parse-json@2.2.0 + pify: registry.npmmirror.com/pify@2.3.0 + pinkie-promise: registry.npmmirror.com/pinkie-promise@2.0.1 + strip-bom: registry.npmmirror.com/strip-bom@2.0.0 + dev: true + + registry.npmmirror.com/loads@0.0.4: + resolution: {integrity: sha512-XjPzzYIHkuMNqYyvh6AECQAHi682nyKO9TMdMYnaz7QbPDI/KIeSIjRhAlXIbRMPYAgtLUYgPlD3mtKZ4Q8SYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loads/-/loads-0.0.4.tgz} + name: loads + version: 0.0.4 + dependencies: + failure: registry.npmmirror.com/failure@1.1.1 + one-time: registry.npmmirror.com/one-time@0.0.4 + xhr-response: registry.npmmirror.com/xhr-response@1.0.1 + xhr-status: registry.npmmirror.com/xhr-status@1.0.1 + dev: false + + registry.npmmirror.com/locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz} + name: locate-path + version: 3.0.0 + engines: {node: '>=6'} + dependencies: + p-locate: registry.npmmirror.com/p-locate@3.0.0 + path-exists: registry.npmmirror.com/path-exists@3.0.0 + dev: true + + registry.npmmirror.com/locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz} + name: locate-path + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + p-locate: registry.npmmirror.com/p-locate@5.0.0 + dev: true + + registry.npmmirror.com/lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz} + name: lodash._reinterpolate + version: 3.0.0 + dev: true + + registry.npmmirror.com/lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz} + name: lodash.debounce + version: 4.0.8 + dev: true + + registry.npmmirror.com/lodash.memoize@3.0.4: + resolution: {integrity: sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz} + name: lodash.memoize + version: 3.0.4 + dev: true + + registry.npmmirror.com/lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz} + name: lodash.merge + version: 4.6.2 + dev: true + + registry.npmmirror.com/lodash.template@4.5.0: + resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.template/-/lodash.template-4.5.0.tgz} + name: lodash.template + version: 4.5.0 + dependencies: + lodash._reinterpolate: registry.npmmirror.com/lodash._reinterpolate@3.0.0 + lodash.templatesettings: registry.npmmirror.com/lodash.templatesettings@4.2.0 + dev: true + + registry.npmmirror.com/lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz} + name: lodash.templatesettings + version: 4.2.0 + dependencies: + lodash._reinterpolate: registry.npmmirror.com/lodash._reinterpolate@3.0.0 + dev: true + + registry.npmmirror.com/lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz} + name: lodash + version: 4.17.21 + dev: false + + registry.npmmirror.com/log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz} + name: log-symbols + version: 4.1.0 + engines: {node: '>=10'} + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 + dev: true + + registry.npmmirror.com/loupe@2.3.4: + resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.4.tgz} + name: loupe + version: 2.3.4 + dependencies: + get-func-name: registry.npmmirror.com/get-func-name@2.0.0 + dev: true + + registry.npmmirror.com/lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz} + name: lowercase-keys + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz} + name: lowercase-keys + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} + name: lru-cache + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + yallist: registry.npmmirror.com/yallist@4.0.0 + + registry.npmmirror.com/magic-string@0.23.2: + resolution: {integrity: sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/magic-string/-/magic-string-0.23.2.tgz} + name: magic-string + version: 0.23.2 + dependencies: + sourcemap-codec: registry.npmmirror.com/sourcemap-codec@1.4.8 + dev: true + + registry.npmmirror.com/make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz} + name: make-dir + version: 2.1.0 + engines: {node: '>=6'} + dependencies: + pify: registry.npmmirror.com/pify@4.0.1 + semver: registry.npmmirror.com/semver@5.7.1 + dev: true + + registry.npmmirror.com/make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz} + name: make-dir + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + semver: registry.npmmirror.com/semver@6.3.0 + dev: true + + registry.npmmirror.com/make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-iterator/-/make-iterator-1.0.1.tgz} + name: make-iterator + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@6.0.3 + dev: true + + registry.npmmirror.com/map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz} + name: map-cache + version: 0.2.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/map-stream@0.0.7: + resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-stream/-/map-stream-0.0.7.tgz} + name: map-stream + version: 0.0.7 + dev: true + + registry.npmmirror.com/map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz} + name: map-visit + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + object-visit: registry.npmmirror.com/object-visit@1.0.1 + dev: true + + registry.npmmirror.com/matchdep@2.0.0: + resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/matchdep/-/matchdep-2.0.0.tgz} + name: matchdep + version: 2.0.0 + engines: {node: '>= 0.10.0'} + dependencies: + findup-sync: registry.npmmirror.com/findup-sync@2.0.0 + micromatch: registry.npmmirror.com/micromatch@3.1.10 + resolve: registry.npmmirror.com/resolve@1.22.0 + stack-trace: registry.npmmirror.com/stack-trace@0.0.10 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz} + name: md5.js + version: 1.3.5 + dependencies: + hash-base: registry.npmmirror.com/hash-base@3.1.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz} + name: media-typer + version: 0.3.0 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz} + name: merge-descriptors + version: 1.0.1 + dev: false + + registry.npmmirror.com/merge-source-map@1.0.4: + resolution: {integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.0.4.tgz} + name: merge-source-map + version: 1.0.4 + dependencies: + source-map: registry.npmmirror.com/source-map@0.5.7 + dev: true + + registry.npmmirror.com/merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz} + name: merge-stream + version: 2.0.0 + dev: true + + registry.npmmirror.com/methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz} + name: methods + version: 1.1.2 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz} + name: micromatch + version: 3.1.10 + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: registry.npmmirror.com/arr-diff@4.0.0 + array-unique: registry.npmmirror.com/array-unique@0.3.2 + braces: registry.npmmirror.com/braces@2.3.2 + define-property: registry.npmmirror.com/define-property@2.0.2 + extend-shallow: registry.npmmirror.com/extend-shallow@3.0.2 + extglob: registry.npmmirror.com/extglob@2.0.4 + fragment-cache: registry.npmmirror.com/fragment-cache@0.2.1 + kind-of: registry.npmmirror.com/kind-of@6.0.3 + nanomatch: registry.npmmirror.com/nanomatch@1.2.13 + object.pick: registry.npmmirror.com/object.pick@1.3.0 + regex-not: registry.npmmirror.com/regex-not@1.0.2 + snapdragon: registry.npmmirror.com/snapdragon@0.8.2 + to-regex: registry.npmmirror.com/to-regex@3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz} + name: micromatch + version: 4.0.5 + engines: {node: '>=8.6'} + dependencies: + braces: registry.npmmirror.com/braces@3.0.2 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: false + + registry.npmmirror.com/miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz} + name: miller-rabin + version: 4.0.1 + hasBin: true + dependencies: + bn.js: registry.npmmirror.com/bn.js@4.12.0 + brorand: registry.npmmirror.com/brorand@1.1.0 + dev: true + + registry.npmmirror.com/mime-db@1.44.0: + resolution: {integrity: sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.44.0.tgz} + name: mime-db + version: 1.44.0 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/mime-types@2.1.27: + resolution: {integrity: sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.27.tgz} + name: mime-types + version: 2.1.27 + engines: {node: '>= 0.6'} + dependencies: + mime-db: registry.npmmirror.com/mime-db@1.44.0 + dev: false + + registry.npmmirror.com/mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz} + name: mime + version: 1.6.0 + engines: {node: '>=4'} + hasBin: true + dev: false + + registry.npmmirror.com/mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz} + name: mimic-response + version: 1.0.1 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/minify-stream@2.1.0: + resolution: {integrity: sha512-P5xE4EQRkn7Td54VGcgfDMFx1jmKPPIXCdcMfrbXS6cNHK4dO1LXwtYFb48hHrSmZfT+jlGImvHgSZEkbpNtCw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minify-stream/-/minify-stream-2.1.0.tgz} + name: minify-stream + version: 2.1.0 + engines: {node: '>= 6'} + dependencies: + concat-stream: registry.npmmirror.com/concat-stream@2.0.0 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + duplexify: registry.npmmirror.com/duplexify@4.1.2 + from2-string: registry.npmmirror.com/from2-string@1.1.0 + terser: registry.npmmirror.com/terser@4.8.0 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz} + name: minimalistic-assert + version: 1.0.1 + dev: true + + registry.npmmirror.com/minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz} + name: minimalistic-crypto-utils + version: 1.0.1 + dev: true + + registry.npmmirror.com/minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz} + name: minimatch + version: 3.1.2 + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 + dev: true + + registry.npmmirror.com/minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz} + name: minimatch + version: 5.0.1 + engines: {node: '>=10'} + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimist@0.0.8: + resolution: {integrity: sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimist/-/minimist-0.0.8.tgz} + name: minimist + version: 0.0.8 + dev: false + + registry.npmmirror.com/minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz} + name: minimist + version: 1.2.6 + dev: true + + registry.npmmirror.com/mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz} + name: mixin-deep + version: 1.3.2 + engines: {node: '>=0.10.0'} + dependencies: + for-in: registry.npmmirror.com/for-in@1.0.2 + is-extendable: registry.npmmirror.com/is-extendable@1.0.1 + dev: true + + registry.npmmirror.com/mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz} + name: mkdirp-classic + version: 0.5.3 + dev: true + + registry.npmmirror.com/mocha@10.0.0: + resolution: {integrity: sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mocha/-/mocha-10.0.0.tgz} + name: mocha + version: 10.0.0 + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + '@ungap/promise-all-settled': registry.npmmirror.com/@ungap/promise-all-settled@1.1.2 + ansi-colors: registry.npmmirror.com/ansi-colors@4.1.1 + browser-stdout: registry.npmmirror.com/browser-stdout@1.3.1 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + diff: registry.npmmirror.com/diff@5.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob: registry.npmmirror.com/glob@7.2.0 + he: registry.npmmirror.com/he@1.2.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + minimatch: registry.npmmirror.com/minimatch@5.0.1 + ms: registry.npmmirror.com/ms@2.1.3 + nanoid: registry.npmmirror.com/nanoid@3.3.3 + serialize-javascript: registry.npmmirror.com/serialize-javascript@6.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + workerpool: registry.npmmirror.com/workerpool@6.2.1 + yargs: registry.npmmirror.com/yargs@16.2.0 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + yargs-unparser: registry.npmmirror.com/yargs-unparser@2.0.0 + dev: true + + registry.npmmirror.com/module-deps@6.2.3: + resolution: {integrity: sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/module-deps/-/module-deps-6.2.3.tgz} + name: module-deps + version: 6.2.3 + engines: {node: '>= 0.8.0'} + hasBin: true + dependencies: + JSONStream: registry.npmmirror.com/JSONStream@1.3.5 + browser-resolve: registry.npmmirror.com/browser-resolve@2.0.0 + cached-path-relative: registry.npmmirror.com/cached-path-relative@1.1.0 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + defined: registry.npmmirror.com/defined@1.0.0 + detective: registry.npmmirror.com/detective@5.2.0 + duplexer2: registry.npmmirror.com/duplexer2@0.1.4 + inherits: registry.npmmirror.com/inherits@2.0.4 + parents: registry.npmmirror.com/parents@1.0.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + resolve: registry.npmmirror.com/resolve@1.22.0 + stream-combiner2: registry.npmmirror.com/stream-combiner2@1.1.1 + subarg: registry.npmmirror.com/subarg@1.0.0 + through2: registry.npmmirror.com/through2@2.0.5 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz} + name: ms + version: 2.0.0 + + registry.npmmirror.com/ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.1.tgz} + name: ms + version: 2.1.1 + dev: false + + registry.npmmirror.com/ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz} + name: ms + version: 2.1.2 + dev: true + + registry.npmmirror.com/ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz} + name: ms + version: 2.1.3 + dev: true + + registry.npmmirror.com/multi-stage-sourcemap@0.2.1: + resolution: {integrity: sha512-umaOM+8BZByZIB/ciD3dQLzTv50rEkkGJV78ta/tIVc/J/rfGZY5y1R+fBD3oTaolx41mK8rRcyGtYbDXlzx8Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz} + name: multi-stage-sourcemap + version: 0.2.1 + dependencies: + source-map: registry.npmmirror.com/source-map@0.1.43 + dev: true + + registry.npmmirror.com/multisplice@1.0.0: + resolution: {integrity: sha512-KU5tVjIdTGsMb92JlWwEZCGrvtI1ku9G9GuNbWdQT/Ici1ztFXX0L8lWpbbC3pISVMfBNL56wdqplHvva2XSlA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/multisplice/-/multisplice-1.0.0.tgz} + name: multisplice + version: 1.0.0 + dev: true + + registry.npmmirror.com/mute-stdout@1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mute-stdout/-/mute-stdout-1.0.1.tgz} + name: mute-stdout + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/mutexify@1.4.0: + resolution: {integrity: sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mutexify/-/mutexify-1.4.0.tgz} + name: mutexify + version: 1.4.0 + dependencies: + queue-tick: registry.npmmirror.com/queue-tick@1.0.0 + dev: true + + registry.npmmirror.com/nanobench@2.1.1: + resolution: {integrity: sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanobench/-/nanobench-2.1.1.tgz} + name: nanobench + version: 2.1.1 + hasBin: true + dependencies: + browser-process-hrtime: registry.npmmirror.com/browser-process-hrtime@0.1.3 + chalk: registry.npmmirror.com/chalk@1.1.3 + mutexify: registry.npmmirror.com/mutexify@1.4.0 + pretty-hrtime: registry.npmmirror.com/pretty-hrtime@1.0.3 + dev: true + + registry.npmmirror.com/nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz} + name: nanoid + version: 3.3.3 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + registry.npmmirror.com/nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz} + name: nanomatch + version: 1.2.13 + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: registry.npmmirror.com/arr-diff@4.0.0 + array-unique: registry.npmmirror.com/array-unique@0.3.2 + define-property: registry.npmmirror.com/define-property@2.0.2 + extend-shallow: registry.npmmirror.com/extend-shallow@3.0.2 + fragment-cache: registry.npmmirror.com/fragment-cache@0.2.1 + is-windows: registry.npmmirror.com/is-windows@1.0.2 + kind-of: registry.npmmirror.com/kind-of@6.0.3 + object.pick: registry.npmmirror.com/object.pick@1.3.0 + regex-not: registry.npmmirror.com/regex-not@1.0.2 + snapdragon: registry.npmmirror.com/snapdragon@0.8.2 + to-regex: registry.npmmirror.com/to-regex@3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz} + name: natural-compare + version: 1.4.0 + dev: true + + registry.npmmirror.com/negotiator@0.6.2: + resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/negotiator/-/negotiator-0.6.2.tgz} + name: negotiator + version: 0.6.2 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz} + name: next-tick + version: 1.1.0 + dev: true + + registry.npmmirror.com/node-environment-flags@1.0.6: + resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz} + name: node-environment-flags + version: 1.0.6 + dependencies: + object.getownpropertydescriptors: registry.npmmirror.com/object.getownpropertydescriptors@2.1.4 + semver: registry.npmmirror.com/semver@5.7.1 + dev: true + + registry.npmmirror.com/node-http-xhr@1.3.4: + resolution: {integrity: sha512-0bA08/2RKWxw6pMkOVd3KP+0F5+ifQLMMTDxrCgxlgkoU1N8DhCbCSAYEqpgaVYM2smvbVVewiXjW+8AyoLfxQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-http-xhr/-/node-http-xhr-1.3.4.tgz} + name: node-http-xhr + version: 1.3.4 + dev: false + + registry.npmmirror.com/node-releases@2.0.4: + resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.4.tgz} + name: node-releases + version: 2.0.4 + dev: true + + registry.npmmirror.com/nodemon@2.0.16: + resolution: {integrity: sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nodemon/-/nodemon-2.0.16.tgz} + name: nodemon + version: 2.0.16 + engines: {node: '>=8.10.0'} + hasBin: true + requiresBuild: true + dependencies: + chokidar: registry.npmmirror.com/chokidar@3.5.3 + debug: registry.npmmirror.com/debug@3.2.7(supports-color@5.5.0) + ignore-by-default: registry.npmmirror.com/ignore-by-default@1.0.1 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + pstree.remy: registry.npmmirror.com/pstree.remy@1.1.8 + semver: registry.npmmirror.com/semver@5.7.1 + supports-color: registry.npmmirror.com/supports-color@5.5.0 + touch: registry.npmmirror.com/touch@3.1.0 + undefsafe: registry.npmmirror.com/undefsafe@2.0.5 + update-notifier: registry.npmmirror.com/update-notifier@5.1.0 + dev: true + + registry.npmmirror.com/nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nopt/-/nopt-1.0.10.tgz} + name: nopt + version: 1.0.10 + hasBin: true + dependencies: + abbrev: registry.npmmirror.com/abbrev@1.1.1 + dev: true + + registry.npmmirror.com/normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz} + name: normalize-package-data + version: 2.5.0 + dependencies: + hosted-git-info: registry.npmmirror.com/hosted-git-info@2.8.9 + resolve: registry.npmmirror.com/resolve@1.22.0 + semver: registry.npmmirror.com/semver@5.7.1 + validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license@3.0.4 + dev: true + + registry.npmmirror.com/normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz} + name: normalize-path + version: 2.1.1 + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: registry.npmmirror.com/remove-trailing-separator@1.1.0 + dev: true + + registry.npmmirror.com/normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz} + name: normalize-path + version: 3.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-4.5.1.tgz} + name: normalize-url + version: 4.5.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/now-and-later@2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/now-and-later/-/now-and-later-2.0.1.tgz} + name: now-and-later + version: 2.0.1 + engines: {node: '>= 0.10'} + dependencies: + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz} + name: number-is-nan + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.4.tgz} + name: nunjucks + version: 3.2.4 + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + a-sync-waterfall: registry.npmmirror.com/a-sync-waterfall@1.0.1 + asap: registry.npmmirror.com/asap@2.0.6 + commander: registry.npmmirror.com/commander@5.1.0 + dev: false + + registry.npmmirror.com/oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz} + name: oauth-sign + version: 0.9.0 + dev: false + + registry.npmmirror.com/object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz} + name: object-assign + version: 4.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz} + name: object-copy + version: 0.1.0 + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: registry.npmmirror.com/copy-descriptor@0.1.1 + define-property: registry.npmmirror.com/define-property@0.2.5 + kind-of: registry.npmmirror.com/kind-of@3.2.2 + dev: true + + registry.npmmirror.com/object-inspect@0.4.0: + resolution: {integrity: sha512-8WvkvUZiKAjjsy/63rJjA7jw9uyF0CLVLjBKEfnPHE3Jxvs1LgwqL2OmJN+LliIX1vrzKW+AAu02Cc+xv27ncQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-0.4.0.tgz} + name: object-inspect + version: 0.4.0 + dev: false + + registry.npmmirror.com/object-inspect@1.12.1: + resolution: {integrity: sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.1.tgz} + name: object-inspect + version: 1.12.1 + dev: true + + registry.npmmirror.com/object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz} + name: object-is + version: 1.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + dev: true + + registry.npmmirror.com/object-keys@0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-0.4.0.tgz} + name: object-keys + version: 0.4.0 + + registry.npmmirror.com/object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz} + name: object-keys + version: 1.1.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz} + name: object-visit + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/object.assign@4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz} + name: object.assign + version: 4.1.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + dev: true + + registry.npmmirror.com/object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.defaults/-/object.defaults-1.1.0.tgz} + name: object.defaults + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + array-each: registry.npmmirror.com/array-each@1.0.1 + array-slice: registry.npmmirror.com/array-slice@1.1.0 + for-own: registry.npmmirror.com/for-own@1.0.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/object.getownpropertydescriptors@2.1.4: + resolution: {integrity: sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz} + name: object.getownpropertydescriptors + version: 2.1.4 + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: registry.npmmirror.com/array.prototype.reduce@1.0.4 + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + dev: true + + registry.npmmirror.com/object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.map/-/object.map-1.0.1.tgz} + name: object.map + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + for-own: registry.npmmirror.com/for-own@1.0.0 + make-iterator: registry.npmmirror.com/make-iterator@1.0.1 + dev: true + + registry.npmmirror.com/object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz} + name: object.pick + version: 1.3.0 + engines: {node: '>=0.10.0'} + dependencies: + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/object.reduce@1.0.1: + resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object.reduce/-/object.reduce-1.0.1.tgz} + name: object.reduce + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + for-own: registry.npmmirror.com/for-own@1.0.0 + make-iterator: registry.npmmirror.com/make-iterator@1.0.1 + dev: true + + registry.npmmirror.com/on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz} + name: on-finished + version: 2.3.0 + engines: {node: '>= 0.8'} + dependencies: + ee-first: registry.npmmirror.com/ee-first@1.1.1 + dev: false + + registry.npmmirror.com/once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz} + name: once + version: 1.4.0 + dependencies: + wrappy: registry.npmmirror.com/wrappy@1.0.2 + dev: true + + registry.npmmirror.com/one-time@0.0.4: + resolution: {integrity: sha512-qAMrwuk2xLEutlASoiPiAMW3EN3K96Ka/ilSXYr6qR1zSVXw2j7+yDSqGTC4T9apfLYxM3tLLjKvgPdAUK7kYQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/one-time/-/one-time-0.0.4.tgz} + name: one-time + version: 0.0.4 + dev: false + + registry.npmmirror.com/optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz} + name: optionator + version: 0.8.3 + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: registry.npmmirror.com/deep-is@0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 + levn: registry.npmmirror.com/levn@0.3.0 + prelude-ls: registry.npmmirror.com/prelude-ls@1.1.2 + type-check: registry.npmmirror.com/type-check@0.3.2 + word-wrap: registry.npmmirror.com/word-wrap@1.2.3 + dev: true + + registry.npmmirror.com/optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz} + name: optionator + version: 0.9.1 + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: registry.npmmirror.com/deep-is@0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 + levn: registry.npmmirror.com/levn@0.4.1 + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 + word-wrap: registry.npmmirror.com/word-wrap@1.2.3 + dev: true + + registry.npmmirror.com/ordered-read-streams@1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz} + name: ordered-read-streams + version: 1.0.1 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz} + name: os-browserify + version: 0.3.0 + dev: true + + registry.npmmirror.com/os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/os-locale/-/os-locale-1.4.0.tgz} + name: os-locale + version: 1.4.0 + engines: {node: '>=0.10.0'} + dependencies: + lcid: registry.npmmirror.com/lcid@1.0.0 + dev: true + + registry.npmmirror.com/p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-1.1.0.tgz} + name: p-cancelable + version: 1.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz} + name: p-limit + version: 2.3.0 + engines: {node: '>=6'} + dependencies: + p-try: registry.npmmirror.com/p-try@2.2.0 + dev: true + + registry.npmmirror.com/p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz} + name: p-limit + version: 3.1.0 + engines: {node: '>=10'} + dependencies: + yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 + dev: true + + registry.npmmirror.com/p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz} + name: p-locate + version: 3.0.0 + engines: {node: '>=6'} + dependencies: + p-limit: registry.npmmirror.com/p-limit@2.3.0 + dev: true + + registry.npmmirror.com/p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz} + name: p-locate + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + p-limit: registry.npmmirror.com/p-limit@3.1.0 + dev: true + + registry.npmmirror.com/p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz} + name: p-try + version: 2.2.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/package-json/-/package-json-6.5.0.tgz} + name: package-json + version: 6.5.0 + engines: {node: '>=8'} + dependencies: + got: registry.npmmirror.com/got@9.6.0 + registry-auth-token: registry.npmmirror.com/registry-auth-token@4.2.1 + registry-url: registry.npmmirror.com/registry-url@5.1.0 + semver: registry.npmmirror.com/semver@6.3.0 + dev: true + + registry.npmmirror.com/pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz} + name: pako + version: 1.0.11 + dev: true + + registry.npmmirror.com/pako@2.0.4: + resolution: {integrity: sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz} + name: pako + version: 2.0.4 + dev: false + + registry.npmmirror.com/parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz} + name: parent-module + version: 1.0.1 + engines: {node: '>=6'} + dependencies: + callsites: registry.npmmirror.com/callsites@3.1.0 + dev: true + + registry.npmmirror.com/parents@1.0.1: + resolution: {integrity: sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parents/-/parents-1.0.1.tgz} + name: parents + version: 1.0.1 + dependencies: + path-platform: registry.npmmirror.com/path-platform@0.11.15 + dev: true + + registry.npmmirror.com/parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.6.tgz} + name: parse-asn1 + version: 5.1.6 + dependencies: + asn1.js: registry.npmmirror.com/asn1.js@5.4.1 + browserify-aes: registry.npmmirror.com/browserify-aes@1.2.0 + evp_bytestokey: registry.npmmirror.com/evp_bytestokey@1.0.3 + pbkdf2: registry.npmmirror.com/pbkdf2@3.1.2 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-filepath/-/parse-filepath-1.0.2.tgz} + name: parse-filepath + version: 1.0.2 + engines: {node: '>=0.8'} + dependencies: + is-absolute: registry.npmmirror.com/is-absolute@1.0.0 + map-cache: registry.npmmirror.com/map-cache@0.2.2 + path-root: registry.npmmirror.com/path-root@0.1.1 + dev: true + + registry.npmmirror.com/parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz} + name: parse-json + version: 2.2.0 + engines: {node: '>=0.10.0'} + dependencies: + error-ex: registry.npmmirror.com/error-ex@1.3.2 + dev: true + + registry.npmmirror.com/parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz} + name: parse-node-version + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz} + name: parse-passwd + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz} + name: parseurl + version: 1.3.3 + engines: {node: '>= 0.8'} + dev: false + + registry.npmmirror.com/pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz} + name: pascalcase + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz} + name: path-browserify + version: 1.0.1 + dev: true + + registry.npmmirror.com/path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz} + name: path-dirname + version: 1.0.2 + dev: true + + registry.npmmirror.com/path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz} + name: path-exists + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: registry.npmmirror.com/pinkie-promise@2.0.1 + dev: true + + registry.npmmirror.com/path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz} + name: path-exists + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz} + name: path-exists + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz} + name: path-is-absolute + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz} + name: path-key + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz} + name: path-parse + version: 1.0.7 + dev: true + + registry.npmmirror.com/path-platform@0.11.15: + resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-platform/-/path-platform-0.11.15.tgz} + name: path-platform + version: 0.11.15 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-root-regex/-/path-root-regex-0.1.2.tgz} + name: path-root-regex + version: 0.1.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-root/-/path-root-0.1.1.tgz} + name: path-root + version: 0.1.1 + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: registry.npmmirror.com/path-root-regex@0.1.2 + dev: true + + registry.npmmirror.com/path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz} + name: path-to-regexp + version: 0.1.7 + dev: false + + registry.npmmirror.com/path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz} + name: path-type + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + pify: registry.npmmirror.com/pify@2.3.0 + pinkie-promise: registry.npmmirror.com/pinkie-promise@2.0.1 + dev: true + + registry.npmmirror.com/pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz} + name: pathval + version: 1.1.1 + dev: true + + registry.npmmirror.com/pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz} + name: pbkdf2 + version: 3.1.2 + engines: {node: '>=0.12'} + dependencies: + create-hash: registry.npmmirror.com/create-hash@1.2.0 + create-hmac: registry.npmmirror.com/create-hmac@1.1.7 + ripemd160: registry.npmmirror.com/ripemd160@2.0.2 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + sha.js: registry.npmmirror.com/sha.js@2.4.11 + dev: true + + registry.npmmirror.com/peggy@2.0.1: + resolution: {integrity: sha512-mBqfmdUAOVn7RILpXTbcRBhLfTR4Go0SresSnivGDdRylBOyVFJncFiVyCNNpPWq8HmgeRleXHs/Go4o8kQVXA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/peggy/-/peggy-2.0.1.tgz} + name: peggy + version: 2.0.1 + engines: {node: '>=10'} + hasBin: true + dependencies: + commander: registry.npmmirror.com/commander@9.3.0 + source-map-generator: registry.npmmirror.com/source-map-generator@0.8.0 + dev: true + + registry.npmmirror.com/performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz} + name: performance-now + version: 2.1.0 + dev: false + + registry.npmmirror.com/picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} + name: picocolors + version: 1.0.0 + dev: true + + registry.npmmirror.com/picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz} + name: picomatch + version: 2.3.1 + engines: {node: '>=8.6'} + + registry.npmmirror.com/pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz} + name: pify + version: 2.3.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz} + name: pify + version: 4.0.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz} + name: pinkie-promise + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + pinkie: registry.npmmirror.com/pinkie@2.0.4 + dev: true + + registry.npmmirror.com/pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz} + name: pinkie + version: 2.0.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz} + name: pirates + version: 4.0.5 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz} + name: pkg-dir + version: 3.0.0 + engines: {node: '>=6'} + dependencies: + find-up: registry.npmmirror.com/find-up@3.0.0 + dev: true + + registry.npmmirror.com/plugin-error@1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/plugin-error/-/plugin-error-1.0.1.tgz} + name: plugin-error + version: 1.0.1 + engines: {node: '>= 0.10'} + dependencies: + ansi-colors: registry.npmmirror.com/ansi-colors@1.1.0 + arr-diff: registry.npmmirror.com/arr-diff@4.0.0 + arr-union: registry.npmmirror.com/arr-union@3.1.0 + extend-shallow: registry.npmmirror.com/extend-shallow@3.0.2 + dev: true + + registry.npmmirror.com/posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz} + name: posix-character-classes + version: 0.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz} + name: prelude-ls + version: 1.1.2 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz} + name: prelude-ls + version: 1.2.1 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz} + name: prepend-http + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/prettier-plugin-sort-imports@1.6.1: + resolution: {integrity: sha512-qqknrB5ozMilKig/xWrs9K2zivZMHU6pjU3H4Up34VpFD1MsPm0m0WfduaRDbaCNHkKx+rLRfR/AyTr0tPY0Iw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-1.6.1.tgz} + name: prettier-plugin-sort-imports + version: 1.6.1 + dependencies: + prettier: registry.npmmirror.com/prettier@2.6.2 + typescript: registry.npmmirror.com/typescript@4.6.4 + dev: true + + registry.npmmirror.com/prettier@2.6.2: + resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prettier/-/prettier-2.6.2.tgz} + name: prettier + version: 2.6.2 + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + registry.npmmirror.com/pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz} + name: pretty-hrtime + version: 1.0.3 + engines: {node: '>= 0.8'} + dev: true + + registry.npmmirror.com/process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz} + name: process-nextick-args + version: 2.0.1 + + registry.npmmirror.com/process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/process/-/process-0.11.10.tgz} + name: process + version: 0.11.10 + engines: {node: '>= 0.6.0'} + dev: true + + registry.npmmirror.com/proxy-addr@2.0.6: + resolution: {integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.6.tgz} + name: proxy-addr + version: 2.0.6 + engines: {node: '>= 0.10'} + dependencies: + forwarded: registry.npmmirror.com/forwarded@0.1.2 + ipaddr.js: registry.npmmirror.com/ipaddr.js@1.9.1 + dev: false + + registry.npmmirror.com/psl@1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz} + name: psl + version: 1.8.0 + dev: false + + registry.npmmirror.com/pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz} + name: pstree.remy + version: 1.1.8 + dev: true + + registry.npmmirror.com/public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz} + name: public-encrypt + version: 4.0.3 + dependencies: + bn.js: registry.npmmirror.com/bn.js@4.12.0 + browserify-rsa: registry.npmmirror.com/browserify-rsa@4.1.0 + create-hash: registry.npmmirror.com/create-hash@1.2.0 + parse-asn1: registry.npmmirror.com/parse-asn1@5.1.6 + randombytes: registry.npmmirror.com/randombytes@2.1.0 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz} + name: pump + version: 2.0.1 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz} + name: pump + version: 3.0.0 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz} + name: pumpify + version: 1.5.1 + dependencies: + duplexify: registry.npmmirror.com/duplexify@3.7.1 + inherits: registry.npmmirror.com/inherits@2.0.4 + pump: registry.npmmirror.com/pump@2.0.1 + dev: true + + registry.npmmirror.com/punycode@1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/punycode/-/punycode-1.3.2.tgz} + name: punycode + version: 1.3.2 + dev: true + + registry.npmmirror.com/punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz} + name: punycode + version: 1.4.1 + dev: true + + registry.npmmirror.com/punycode@2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz} + name: punycode + version: 2.1.1 + engines: {node: '>=6'} + + registry.npmmirror.com/pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pupa/-/pupa-2.1.1.tgz} + name: pupa + version: 2.1.1 + engines: {node: '>=8'} + dependencies: + escape-goat: registry.npmmirror.com/escape-goat@2.1.1 + dev: true + + registry.npmmirror.com/qs@6.5.2: + resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qs/-/qs-6.5.2.tgz} + name: qs + version: 6.5.2 + engines: {node: '>=0.6'} + dev: false + + registry.npmmirror.com/qs@6.7.0: + resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qs/-/qs-6.7.0.tgz} + name: qs + version: 6.7.0 + engines: {node: '>=0.6'} + dev: false + + registry.npmmirror.com/querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz} + name: querystring-es3 + version: 0.2.1 + engines: {node: '>=0.4.x'} + dev: true + + registry.npmmirror.com/querystring@0.2.0: + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/querystring/-/querystring-0.2.0.tgz} + name: querystring + version: 0.2.0 + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + registry.npmmirror.com/queue-tick@1.0.0: + resolution: {integrity: sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.0.tgz} + name: queue-tick + version: 1.0.0 + dev: true + + registry.npmmirror.com/quote-stream@0.0.0: + resolution: {integrity: sha512-m4VtvjAMx00wgAS6eOy50ZDat1EBQeFKBIrtF/oxUt0MenEI33y7runJcRiOihc+JBBIt2aFFJhILIh4e9shJA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/quote-stream/-/quote-stream-0.0.0.tgz} + name: quote-stream + version: 0.0.0 + dependencies: + minimist: registry.npmmirror.com/minimist@0.0.8 + through2: registry.npmmirror.com/through2@0.4.2 + dev: false + + registry.npmmirror.com/randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz} + name: randombytes + version: 2.1.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz} + name: randomfill + version: 1.0.4 + dependencies: + randombytes: registry.npmmirror.com/randombytes@2.1.0 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz} + name: range-parser + version: 1.2.1 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/raw-body@2.4.0: + resolution: {integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/raw-body/-/raw-body-2.4.0.tgz} + name: raw-body + version: 2.4.0 + engines: {node: '>= 0.8'} + dependencies: + bytes: registry.npmmirror.com/bytes@3.1.0 + http-errors: registry.npmmirror.com/http-errors@1.7.2 + iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 + unpipe: registry.npmmirror.com/unpipe@1.0.0 + dev: false + + registry.npmmirror.com/rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz} + name: rc + version: 1.2.8 + hasBin: true + dependencies: + deep-extend: registry.npmmirror.com/deep-extend@0.6.0 + ini: registry.npmmirror.com/ini@1.3.8 + minimist: registry.npmmirror.com/minimist@1.2.6 + strip-json-comments: registry.npmmirror.com/strip-json-comments@2.0.1 + dev: true + + registry.npmmirror.com/read-only-stream@2.0.0: + resolution: {integrity: sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-only-stream/-/read-only-stream-2.0.0.tgz} + name: read-only-stream + version: 2.0.0 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz} + name: read-pkg-up + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + find-up: registry.npmmirror.com/find-up@1.1.2 + read-pkg: registry.npmmirror.com/read-pkg@1.1.0 + dev: true + + registry.npmmirror.com/read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz} + name: read-pkg + version: 1.1.0 + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: registry.npmmirror.com/load-json-file@1.1.0 + normalize-package-data: registry.npmmirror.com/normalize-package-data@2.5.0 + path-type: registry.npmmirror.com/path-type@1.1.0 + dev: true + + registry.npmmirror.com/readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz} + name: readable-stream + version: 1.0.34 + dependencies: + core-util-is: registry.npmmirror.com/core-util-is@1.0.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + isarray: registry.npmmirror.com/isarray@0.0.1 + string_decoder: registry.npmmirror.com/string_decoder@0.10.31 + + registry.npmmirror.com/readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-1.1.14.tgz} + name: readable-stream + version: 1.1.14 + dependencies: + core-util-is: registry.npmmirror.com/core-util-is@1.0.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + isarray: registry.npmmirror.com/isarray@0.0.1 + string_decoder: registry.npmmirror.com/string_decoder@0.10.31 + dev: false + + registry.npmmirror.com/readable-stream@2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz} + name: readable-stream + version: 2.3.7 + dependencies: + core-util-is: registry.npmmirror.com/core-util-is@1.0.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + isarray: registry.npmmirror.com/isarray@1.0.0 + process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + string_decoder: registry.npmmirror.com/string_decoder@1.1.1 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 + + registry.npmmirror.com/readable-stream@3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz} + name: readable-stream + version: 3.6.0 + engines: {node: '>= 6'} + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + string_decoder: registry.npmmirror.com/string_decoder@1.3.0 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 + dev: true + + registry.npmmirror.com/readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz} + name: readdirp + version: 2.2.1 + engines: {node: '>=0.10'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + micromatch: registry.npmmirror.com/micromatch@3.1.10 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz} + name: readdirp + version: 3.6.0 + engines: {node: '>=8.10.0'} + dependencies: + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz} + name: rechoir + version: 0.6.2 + engines: {node: '>= 0.10'} + dependencies: + resolve: registry.npmmirror.com/resolve@1.22.0 + dev: true + + registry.npmmirror.com/regenerate-unicode-properties@10.0.1: + resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz} + name: regenerate-unicode-properties + version: 10.0.1 + engines: {node: '>=4'} + dependencies: + regenerate: registry.npmmirror.com/regenerate@1.4.2 + dev: true + + registry.npmmirror.com/regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz} + name: regenerate + version: 1.4.2 + dev: true + + registry.npmmirror.com/regenerator-runtime@0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz} + name: regenerator-runtime + version: 0.13.9 + dev: true + + registry.npmmirror.com/regenerator-transform@0.15.0: + resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz} + name: regenerator-transform + version: 0.15.0 + dependencies: + '@babel/runtime': registry.npmmirror.com/@babel/runtime@7.18.0 + dev: true + + registry.npmmirror.com/regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz} + name: regex-not + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow@3.0.2 + safe-regex: registry.npmmirror.com/safe-regex@1.1.0 + dev: true + + registry.npmmirror.com/regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz} + name: regexp.prototype.flags + version: 1.4.3 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 + dev: true + + registry.npmmirror.com/regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz} + name: regexpp + version: 3.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/regexpu-core@5.0.1: + resolution: {integrity: sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.0.1.tgz} + name: regexpu-core + version: 5.0.1 + engines: {node: '>=4'} + dependencies: + regenerate: registry.npmmirror.com/regenerate@1.4.2 + regenerate-unicode-properties: registry.npmmirror.com/regenerate-unicode-properties@10.0.1 + regjsgen: registry.npmmirror.com/regjsgen@0.6.0 + regjsparser: registry.npmmirror.com/regjsparser@0.8.4 + unicode-match-property-ecmascript: registry.npmmirror.com/unicode-match-property-ecmascript@2.0.0 + unicode-match-property-value-ecmascript: registry.npmmirror.com/unicode-match-property-value-ecmascript@2.0.0 + dev: true + + registry.npmmirror.com/registry-auth-token@4.2.1: + resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz} + name: registry-auth-token + version: 4.2.1 + engines: {node: '>=6.0.0'} + dependencies: + rc: registry.npmmirror.com/rc@1.2.8 + dev: true + + registry.npmmirror.com/registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/registry-url/-/registry-url-5.1.0.tgz} + name: registry-url + version: 5.1.0 + engines: {node: '>=8'} + dependencies: + rc: registry.npmmirror.com/rc@1.2.8 + dev: true + + registry.npmmirror.com/regjsgen@0.6.0: + resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regjsgen/-/regjsgen-0.6.0.tgz} + name: regjsgen + version: 0.6.0 + dev: true + + registry.npmmirror.com/regjsparser@0.8.4: + resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regjsparser/-/regjsparser-0.8.4.tgz} + name: regjsparser + version: 0.8.4 + hasBin: true + dependencies: + jsesc: registry.npmmirror.com/jsesc@0.5.0 + dev: true + + registry.npmmirror.com/remove-bom-buffer@3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz} + name: remove-bom-buffer + version: 3.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: registry.npmmirror.com/is-buffer@1.1.6 + is-utf8: registry.npmmirror.com/is-utf8@0.2.1 + dev: true + + registry.npmmirror.com/remove-bom-stream@1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz} + name: remove-bom-stream + version: 1.2.0 + engines: {node: '>= 0.10'} + dependencies: + remove-bom-buffer: registry.npmmirror.com/remove-bom-buffer@3.0.0 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz} + name: remove-trailing-separator + version: 1.1.0 + dev: true + + registry.npmmirror.com/repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz} + name: repeat-element + version: 1.1.4 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz} + name: repeat-string + version: 1.6.1 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/replace-ext/-/replace-ext-1.0.1.tgz} + name: replace-ext + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/replace-homedir@1.0.0: + resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/replace-homedir/-/replace-homedir-1.0.0.tgz} + name: replace-homedir + version: 1.0.0 + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: registry.npmmirror.com/homedir-polyfill@1.0.3 + is-absolute: registry.npmmirror.com/is-absolute@1.0.0 + remove-trailing-separator: registry.npmmirror.com/remove-trailing-separator@1.1.0 + dev: true + + registry.npmmirror.com/request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/request/-/request-2.88.2.tgz} + name: request + version: 2.88.2 + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: registry.npmmirror.com/aws-sign2@0.7.0 + aws4: registry.npmmirror.com/aws4@1.10.1 + caseless: registry.npmmirror.com/caseless@0.12.0 + combined-stream: registry.npmmirror.com/combined-stream@1.0.8 + extend: registry.npmmirror.com/extend@3.0.2 + forever-agent: registry.npmmirror.com/forever-agent@0.6.1 + form-data: registry.npmmirror.com/form-data@2.3.3 + har-validator: registry.npmmirror.com/har-validator@5.1.5 + http-signature: registry.npmmirror.com/http-signature@1.2.0 + is-typedarray: registry.npmmirror.com/is-typedarray@1.0.0 + isstream: registry.npmmirror.com/isstream@0.1.2 + json-stringify-safe: registry.npmmirror.com/json-stringify-safe@5.0.1 + mime-types: registry.npmmirror.com/mime-types@2.1.27 + oauth-sign: registry.npmmirror.com/oauth-sign@0.9.0 + performance-now: registry.npmmirror.com/performance-now@2.1.0 + qs: registry.npmmirror.com/qs@6.5.2 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + tough-cookie: registry.npmmirror.com/tough-cookie@2.5.0 + tunnel-agent: registry.npmmirror.com/tunnel-agent@0.6.0 + uuid: registry.npmmirror.com/uuid@3.4.0 + dev: false + + registry.npmmirror.com/requests@0.3.0: + resolution: {integrity: sha512-1B6nkiHjC1O1cSgFhEwkc+xd8vuj04h7xSmCg5yI8nmhCIKbPkX47od8erQ2pokBt5qxUO7dwP4jplXD6k6ISA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/requests/-/requests-0.3.0.tgz} + name: requests + version: 0.3.0 + dependencies: + axo: registry.npmmirror.com/axo@0.0.2 + eventemitter3: registry.npmmirror.com/eventemitter3@4.0.7 + extendible: registry.npmmirror.com/extendible@0.1.1 + hang: registry.npmmirror.com/hang@1.0.0 + loads: registry.npmmirror.com/loads@0.0.4 + node-http-xhr: registry.npmmirror.com/node-http-xhr@1.3.4 + xhr-send: registry.npmmirror.com/xhr-send@1.0.0 + dev: false + + registry.npmmirror.com/require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz} + name: require-directory + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-main-filename/-/require-main-filename-1.0.1.tgz} + name: require-main-filename + version: 1.0.1 + dev: true + + registry.npmmirror.com/requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz} + name: requires-port + version: 1.0.0 + dev: false + + registry.npmmirror.com/resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-dir/-/resolve-dir-1.0.1.tgz} + name: resolve-dir + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: registry.npmmirror.com/expand-tilde@2.0.2 + global-modules: registry.npmmirror.com/global-modules@1.0.0 + dev: true + + registry.npmmirror.com/resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz} + name: resolve-from + version: 4.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/resolve-options@1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-options/-/resolve-options-1.1.0.tgz} + name: resolve-options + version: 1.1.0 + engines: {node: '>= 0.10'} + dependencies: + value-or-function: registry.npmmirror.com/value-or-function@3.0.0 + dev: true + + registry.npmmirror.com/resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz} + name: resolve-url + version: 0.2.1 + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + registry.npmmirror.com/resolve@1.22.0: + resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz} + name: resolve + version: 1.22.0 + hasBin: true + dependencies: + is-core-module: registry.npmmirror.com/is-core-module@2.9.0 + path-parse: registry.npmmirror.com/path-parse@1.0.7 + supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 + dev: true + + registry.npmmirror.com/responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz} + name: responselike + version: 1.0.2 + dependencies: + lowercase-keys: registry.npmmirror.com/lowercase-keys@1.0.1 + dev: true + + registry.npmmirror.com/ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz} + name: ret + version: 0.1.15 + engines: {node: '>=0.12'} + dev: true + + registry.npmmirror.com/rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz} + name: rimraf + version: 3.0.2 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob@7.2.3 + dev: true + + registry.npmmirror.com/ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz} + name: ripemd160 + version: 2.0.2 + dependencies: + hash-base: registry.npmmirror.com/hash-base@3.1.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + dev: true + + registry.npmmirror.com/safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz} + name: safe-buffer + version: 5.1.2 + + registry.npmmirror.com/safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz} + name: safe-buffer + version: 5.2.1 + + registry.npmmirror.com/safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz} + name: safe-regex + version: 1.1.0 + dependencies: + ret: registry.npmmirror.com/ret@0.1.15 + dev: true + + registry.npmmirror.com/safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz} + name: safer-buffer + version: 2.1.2 + + registry.npmmirror.com/scope-analyzer@2.1.2: + resolution: {integrity: sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz} + name: scope-analyzer + version: 2.1.2 + dependencies: + array-from: registry.npmmirror.com/array-from@2.1.1 + dash-ast: registry.npmmirror.com/dash-ast@2.0.1 + es6-map: registry.npmmirror.com/es6-map@0.1.5 + es6-set: registry.npmmirror.com/es6-set@0.1.5 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.3 + estree-is-function: registry.npmmirror.com/estree-is-function@1.0.0 + get-assigned-identifiers: registry.npmmirror.com/get-assigned-identifiers@1.2.0 + dev: true + + registry.npmmirror.com/semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver-diff/-/semver-diff-3.1.1.tgz} + name: semver-diff + version: 3.1.1 + engines: {node: '>=8'} + dependencies: + semver: registry.npmmirror.com/semver@6.3.0 + dev: true + + registry.npmmirror.com/semver-greatest-satisfied-range@1.1.0: + resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz} + name: semver-greatest-satisfied-range + version: 1.1.0 + engines: {node: '>= 0.10'} + dependencies: + sver-compat: registry.npmmirror.com/sver-compat@1.5.0 + dev: true + + registry.npmmirror.com/semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz} + name: semver + version: 5.7.1 + hasBin: true + dev: true + + registry.npmmirror.com/semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz} + name: semver + version: 6.3.0 + hasBin: true + dev: true + + registry.npmmirror.com/semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz} + name: semver + version: 7.0.0 + hasBin: true + dev: true + + registry.npmmirror.com/semver@7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz} + name: semver + version: 7.3.7 + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@6.0.0 + + registry.npmmirror.com/send@0.17.1: + resolution: {integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/send/-/send-0.17.1.tgz} + name: send + version: 0.17.1 + engines: {node: '>= 0.8.0'} + dependencies: + debug: registry.npmmirror.com/debug@2.6.9 + depd: registry.npmmirror.com/depd@1.1.2 + destroy: registry.npmmirror.com/destroy@1.0.4 + encodeurl: registry.npmmirror.com/encodeurl@1.0.2 + escape-html: registry.npmmirror.com/escape-html@1.0.3 + etag: registry.npmmirror.com/etag@1.8.1 + fresh: registry.npmmirror.com/fresh@0.5.2 + http-errors: registry.npmmirror.com/http-errors@1.7.2 + mime: registry.npmmirror.com/mime@1.6.0 + ms: registry.npmmirror.com/ms@2.1.1 + on-finished: registry.npmmirror.com/on-finished@2.3.0 + range-parser: registry.npmmirror.com/range-parser@1.2.1 + statuses: registry.npmmirror.com/statuses@1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + registry.npmmirror.com/serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz} + name: serialize-javascript + version: 6.0.0 + dependencies: + randombytes: registry.npmmirror.com/randombytes@2.1.0 + dev: true + + registry.npmmirror.com/serve-static@1.14.1: + resolution: {integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/serve-static/-/serve-static-1.14.1.tgz} + name: serve-static + version: 1.14.1 + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: registry.npmmirror.com/encodeurl@1.0.2 + escape-html: registry.npmmirror.com/escape-html@1.0.3 + parseurl: registry.npmmirror.com/parseurl@1.3.3 + send: registry.npmmirror.com/send@0.17.1 + transitivePeerDependencies: + - supports-color + dev: false + + registry.npmmirror.com/set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz} + name: set-blocking + version: 2.0.0 + dev: true + + registry.npmmirror.com/set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz} + name: set-value + version: 2.0.1 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow@2.0.1 + is-extendable: registry.npmmirror.com/is-extendable@0.1.1 + is-plain-object: registry.npmmirror.com/is-plain-object@2.0.4 + split-string: registry.npmmirror.com/split-string@3.1.0 + dev: true + + registry.npmmirror.com/setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.1.tgz} + name: setprototypeof + version: 1.1.1 + dev: false + + registry.npmmirror.com/sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz} + name: sha.js + version: 2.4.11 + hasBin: true + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz} + name: shallow-clone + version: 3.0.1 + engines: {node: '>=8'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@6.0.3 + dev: true + + registry.npmmirror.com/shallow-copy@0.0.1: + resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shallow-copy/-/shallow-copy-0.0.1.tgz} + name: shallow-copy + version: 0.0.1 + dev: false + + registry.npmmirror.com/shasum-object@1.0.0: + resolution: {integrity: sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shasum-object/-/shasum-object-1.0.0.tgz} + name: shasum-object + version: 1.0.0 + dependencies: + fast-safe-stringify: registry.npmmirror.com/fast-safe-stringify@2.1.1 + dev: true + + registry.npmmirror.com/shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz} + name: shebang-command + version: 2.0.0 + engines: {node: '>=8'} + dependencies: + shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 + dev: true + + registry.npmmirror.com/shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz} + name: shebang-regex + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/shell-quote@1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.3.tgz} + name: shell-quote + version: 1.7.3 + dev: true + + registry.npmmirror.com/side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz} + name: side-channel + version: 1.0.4 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.1.1 + object-inspect: registry.npmmirror.com/object-inspect@1.12.1 + dev: true + + registry.npmmirror.com/signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz} + name: signal-exit + version: 3.0.7 + dev: true + + registry.npmmirror.com/simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz} + name: simple-concat + version: 1.0.1 + dev: true + + registry.npmmirror.com/slash@1.0.0: + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slash/-/slash-1.0.0.tgz} + name: slash + version: 1.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz} + name: snapdragon-node + version: 2.1.1 + engines: {node: '>=0.10.0'} + dependencies: + define-property: registry.npmmirror.com/define-property@1.0.0 + isobject: registry.npmmirror.com/isobject@3.0.1 + snapdragon-util: registry.npmmirror.com/snapdragon-util@3.0.1 + dev: true + + registry.npmmirror.com/snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz} + name: snapdragon-util + version: 3.0.1 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@3.2.2 + dev: true + + registry.npmmirror.com/snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz} + name: snapdragon + version: 0.8.2 + engines: {node: '>=0.10.0'} + dependencies: + base: registry.npmmirror.com/base@0.11.2 + debug: registry.npmmirror.com/debug@2.6.9 + define-property: registry.npmmirror.com/define-property@0.2.5 + extend-shallow: registry.npmmirror.com/extend-shallow@2.0.1 + map-cache: registry.npmmirror.com/map-cache@0.2.2 + source-map: 0.5.7 + source-map-resolve: registry.npmmirror.com/source-map-resolve@0.5.3 + use: registry.npmmirror.com/use@3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/source-map-generator@0.8.0: + resolution: {integrity: sha512-psgxdGMwl5MZM9S3FWee4EgsEaIjahYV5AzGnwUvPhWeITz/j6rKpysQHlQ4USdxvINlb8lKfWGIXwfkrgtqkA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-generator/-/source-map-generator-0.8.0.tgz} + name: source-map-generator + version: 0.8.0 + engines: {node: '>= 10'} + dev: true + + registry.npmmirror.com/source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz} + name: source-map-resolve + version: 0.5.3 + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: registry.npmmirror.com/atob@2.1.2 + decode-uri-component: registry.npmmirror.com/decode-uri-component@0.2.0 + resolve-url: registry.npmmirror.com/resolve-url@0.2.1 + source-map-url: registry.npmmirror.com/source-map-url@0.4.1 + urix: registry.npmmirror.com/urix@0.1.0 + dev: true + + registry.npmmirror.com/source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz} + name: source-map-support + version: 0.5.21 + dependencies: + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + source-map: registry.npmmirror.com/source-map@0.6.1 + dev: true + + registry.npmmirror.com/source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz} + name: source-map-url + version: 0.4.1 + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + registry.npmmirror.com/source-map@0.1.43: + resolution: {integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz} + name: source-map + version: 0.1.43 + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + amdefine: registry.npmmirror.com/amdefine@1.0.1 + dev: true + + registry.npmmirror.com/source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz} + name: source-map + version: 0.5.7 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz} + name: sourcemap-codec + version: 1.4.8 + dev: true + + registry.npmmirror.com/sparkles@1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sparkles/-/sparkles-1.0.1.tgz} + name: sparkles + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/spdx-correct@3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz} + name: spdx-correct + version: 3.1.1 + dependencies: + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.11 + dev: true + + registry.npmmirror.com/spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz} + name: spdx-exceptions + version: 2.3.0 + dev: true + + registry.npmmirror.com/spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz} + name: spdx-expression-parse + version: 3.0.1 + dependencies: + spdx-exceptions: registry.npmmirror.com/spdx-exceptions@2.3.0 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.11 + dev: true + + registry.npmmirror.com/spdx-license-ids@3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz} + name: spdx-license-ids + version: 3.0.11 + dev: true + + registry.npmmirror.com/split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz} + name: split-string + version: 3.1.0 + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: registry.npmmirror.com/extend-shallow@3.0.2 + dev: true + + registry.npmmirror.com/sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz} + name: sprintf-js + version: 1.0.3 + dev: false + + registry.npmmirror.com/sshpk@1.16.1: + resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sshpk/-/sshpk-1.16.1.tgz} + name: sshpk + version: 1.16.1 + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: registry.npmmirror.com/asn1@0.2.4 + assert-plus: registry.npmmirror.com/assert-plus@1.0.0 + bcrypt-pbkdf: registry.npmmirror.com/bcrypt-pbkdf@1.0.2 + dashdash: registry.npmmirror.com/dashdash@1.14.1 + ecc-jsbn: registry.npmmirror.com/ecc-jsbn@0.1.2 + getpass: registry.npmmirror.com/getpass@0.1.7 + jsbn: registry.npmmirror.com/jsbn@0.1.1 + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + tweetnacl: registry.npmmirror.com/tweetnacl@0.14.5 + dev: false + + registry.npmmirror.com/stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz} + name: stack-trace + version: 0.0.10 + dev: true + + registry.npmmirror.com/static-eval@0.2.4: + resolution: {integrity: sha512-6dWWPfa/0+1zULdQi7ssT5EQZHsGK8LygBzhE/HdafNCo4e/Ibt7vLPfxBw9VcdVV+t0ARtN4ZAJKtApVc0A5Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/static-eval/-/static-eval-0.2.4.tgz} + name: static-eval + version: 0.2.4 + dependencies: + escodegen: registry.npmmirror.com/escodegen@0.0.28 + dev: false + + registry.npmmirror.com/static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz} + name: static-extend + version: 0.1.2 + engines: {node: '>=0.10.0'} + dependencies: + define-property: registry.npmmirror.com/define-property@0.2.5 + object-copy: registry.npmmirror.com/object-copy@0.1.0 + dev: true + + registry.npmmirror.com/static-js-yaml@1.0.0: + resolution: {integrity: sha512-SHd8UBXpEUeFEhexli7Nn1+fysyhU3LiQFKcwnqM3l5wzvJU6QoXg4cMtjjZjfc4ngRj934188v7FHgDyZ6U9A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/static-js-yaml/-/static-js-yaml-1.0.0.tgz} + name: static-js-yaml + version: 1.0.0 + dependencies: + js-yaml: registry.npmmirror.com/js-yaml@3.14.1 + static-module: registry.npmmirror.com/static-module@1.5.0 + through2: registry.npmmirror.com/through2@0.6.5 + dev: false + + registry.npmmirror.com/static-module@1.5.0: + resolution: {integrity: sha512-XTj7pQOHT33l77lK/Pu8UXqzI44C6LYAqwAc9hLTTESHRqJAFudBpReuopFPpoRr5CtOoSmGfFQC6FPlbDnyCw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/static-module/-/static-module-1.5.0.tgz} + name: static-module + version: 1.5.0 + dependencies: + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + duplexer2: registry.npmmirror.com/duplexer2@0.0.2 + escodegen: registry.npmmirror.com/escodegen@1.3.3 + falafel: registry.npmmirror.com/falafel@2.2.5 + has: registry.npmmirror.com/has@1.0.3 + object-inspect: registry.npmmirror.com/object-inspect@0.4.0 + quote-stream: registry.npmmirror.com/quote-stream@0.0.0 + readable-stream: registry.npmmirror.com/readable-stream@1.0.34 + shallow-copy: registry.npmmirror.com/shallow-copy@0.0.1 + static-eval: registry.npmmirror.com/static-eval@0.2.4 + through2: registry.npmmirror.com/through2@0.4.2 + dev: false + + registry.npmmirror.com/statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz} + name: statuses + version: 1.5.0 + engines: {node: '>= 0.6'} + dev: false + + registry.npmmirror.com/stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-browserify/-/stream-browserify-3.0.0.tgz} + name: stream-browserify + version: 3.0.0 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + dev: true + + registry.npmmirror.com/stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz} + name: stream-combiner2 + version: 1.1.1 + dependencies: + duplexer2: registry.npmmirror.com/duplexer2@0.1.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/stream-combiner@0.2.2: + resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-combiner/-/stream-combiner-0.2.2.tgz} + name: stream-combiner + version: 0.2.2 + dependencies: + duplexer: registry.npmmirror.com/duplexer@0.1.2 + through: registry.npmmirror.com/through@2.3.8 + dev: true + + registry.npmmirror.com/stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz} + name: stream-exhaust + version: 1.0.2 + dev: true + + registry.npmmirror.com/stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-http/-/stream-http-3.2.0.tgz} + name: stream-http + version: 3.2.0 + dependencies: + builtin-status-codes: registry.npmmirror.com/builtin-status-codes@3.0.0 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.1.tgz} + name: stream-shift + version: 1.0.1 + dev: true + + registry.npmmirror.com/stream-splicer@2.0.1: + resolution: {integrity: sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stream-splicer/-/stream-splicer-2.0.1.tgz} + name: stream-splicer + version: 2.0.1 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + dev: true + + registry.npmmirror.com/string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz} + name: string-width + version: 1.0.2 + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: registry.npmmirror.com/code-point-at@1.1.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@1.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@3.0.1 + dev: true + + registry.npmmirror.com/string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz} + name: string-width + version: 4.2.3 + engines: {node: '>=8'} + dependencies: + emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/string.prototype.trimend@1.0.5: + resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz} + name: string.prototype.trimend + version: 1.0.5 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + dev: true + + registry.npmmirror.com/string.prototype.trimstart@1.0.5: + resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz} + name: string.prototype.trimstart + version: 1.0.5 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + define-properties: registry.npmmirror.com/define-properties@1.1.4 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + dev: true + + registry.npmmirror.com/string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz} + name: string_decoder + version: 0.10.31 + + registry.npmmirror.com/string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz} + name: string_decoder + version: 1.1.1 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + + registry.npmmirror.com/string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz} + name: string_decoder + version: 1.3.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz} + name: strip-ansi + version: 3.0.1 + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@2.1.1 + dev: true + + registry.npmmirror.com/strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz} + name: strip-ansi + version: 6.0.1 + engines: {node: '>=8'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 + dev: true + + registry.npmmirror.com/strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz} + name: strip-bom + version: 2.0.0 + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: registry.npmmirror.com/is-utf8@0.2.1 + dev: true + + registry.npmmirror.com/strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz} + name: strip-json-comments + version: 2.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz} + name: strip-json-comments + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/subarg@1.0.0: + resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/subarg/-/subarg-1.0.0.tgz} + name: subarg + version: 1.0.0 + dependencies: + minimist: registry.npmmirror.com/minimist@1.2.6 + dev: true + + registry.npmmirror.com/supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz} + name: supports-color + version: 2.0.0 + engines: {node: '>=0.8.0'} + dev: true + + registry.npmmirror.com/supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz} + name: supports-color + version: 5.5.0 + engines: {node: '>=4'} + dependencies: + has-flag: registry.npmmirror.com/has-flag@3.0.0 + dev: true + + registry.npmmirror.com/supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz} + name: supports-color + version: 7.2.0 + engines: {node: '>=8'} + dependencies: + has-flag: registry.npmmirror.com/has-flag@4.0.0 + dev: true + + registry.npmmirror.com/supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz} + name: supports-color + version: 8.1.1 + engines: {node: '>=10'} + dependencies: + has-flag: registry.npmmirror.com/has-flag@4.0.0 + dev: true + + registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} + name: supports-preserve-symlinks-flag + version: 1.0.0 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/sver-compat@1.5.0: + resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sver-compat/-/sver-compat-1.5.0.tgz} + name: sver-compat + version: 1.5.0 + dependencies: + es6-iterator: registry.npmmirror.com/es6-iterator@2.0.3 + es6-symbol: registry.npmmirror.com/es6-symbol@3.1.3 + dev: true + + registry.npmmirror.com/syntax-error@1.4.0: + resolution: {integrity: sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/syntax-error/-/syntax-error-1.4.0.tgz} + name: syntax-error + version: 1.4.0 + dependencies: + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + dev: true + + registry.npmmirror.com/ternary-stream@3.0.0: + resolution: {integrity: sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ternary-stream/-/ternary-stream-3.0.0.tgz} + name: ternary-stream + version: 3.0.0 + dependencies: + duplexify: registry.npmmirror.com/duplexify@4.1.2 + fork-stream: registry.npmmirror.com/fork-stream@0.0.4 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + through2: registry.npmmirror.com/through2@3.0.2 + dev: true + + registry.npmmirror.com/terser@3.17.0: + resolution: {integrity: sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/terser/-/terser-3.17.0.tgz} + name: terser + version: 3.17.0 + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + acorn: registry.npmmirror.com/acorn@8.7.1 + commander: registry.npmmirror.com/commander@2.20.3 + source-map: registry.npmmirror.com/source-map@0.6.1 + source-map-support: registry.npmmirror.com/source-map-support@0.5.21 + dev: true + + registry.npmmirror.com/terser@4.8.0: + resolution: {integrity: sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/terser/-/terser-4.8.0.tgz} + name: terser + version: 4.8.0 + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + acorn: registry.npmmirror.com/acorn@8.7.1 + commander: registry.npmmirror.com/commander@2.20.3 + source-map: registry.npmmirror.com/source-map@0.6.1 + source-map-support: registry.npmmirror.com/source-map-support@0.5.21 + dev: true + + registry.npmmirror.com/text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz} + name: text-table + version: 0.2.0 + dev: true + + registry.npmmirror.com/through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz} + name: through2-filter + version: 3.0.0 + dependencies: + through2: registry.npmmirror.com/through2@2.0.5 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/through2@0.4.2: + resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-0.4.2.tgz} + name: through2 + version: 0.4.2 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@1.0.34 + xtend: registry.npmmirror.com/xtend@2.1.2 + + registry.npmmirror.com/through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-0.6.5.tgz} + name: through2 + version: 0.6.5 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@1.0.34 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: false + + registry.npmmirror.com/through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz} + name: through2 + version: 2.0.5 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-3.0.2.tgz} + name: through2 + version: 3.0.2 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + dev: true + + registry.npmmirror.com/through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz} + name: through2 + version: 4.0.2 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@3.6.0 + dev: true + + registry.npmmirror.com/through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz} + name: through + version: 2.3.8 + dev: true + + registry.npmmirror.com/time-stamp@1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/time-stamp/-/time-stamp-1.1.0.tgz} + name: time-stamp + version: 1.1.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/timers-browserify@1.4.2: + resolution: {integrity: sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/timers-browserify/-/timers-browserify-1.4.2.tgz} + name: timers-browserify + version: 1.4.2 + engines: {node: '>=0.6.0'} + dependencies: + process: registry.npmmirror.com/process@0.11.10 + dev: true + + registry.npmmirror.com/tinyify@3.0.0: + resolution: {integrity: sha512-RtjVjC1xwwxt8AMVfxEmo+FzRJB6p5sAOtFaJj8vMrkWShtArsM4dLVRWhx2Vc07Me3NWgmP7pi9UPm/a2XNNA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tinyify/-/tinyify-3.0.0.tgz} + name: tinyify + version: 3.0.0 + dependencies: + '@goto-bus-stop/envify': registry.npmmirror.com/@goto-bus-stop/envify@5.0.0 + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + browser-pack-flat: registry.npmmirror.com/browser-pack-flat@3.4.2 + bundle-collapser: registry.npmmirror.com/bundle-collapser@1.4.0 + common-shakeify: registry.npmmirror.com/common-shakeify@0.6.2 + dash-ast: registry.npmmirror.com/dash-ast@1.0.0 + minify-stream: registry.npmmirror.com/minify-stream@2.1.0 + multisplice: registry.npmmirror.com/multisplice@1.0.0 + through2: registry.npmmirror.com/through2@3.0.2 + uglifyify: registry.npmmirror.com/uglifyify@5.0.2 + unassertify: registry.npmmirror.com/unassertify@2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/to-absolute-glob@2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz} + name: to-absolute-glob + version: 2.0.2 + engines: {node: '>=0.10.0'} + dependencies: + is-absolute: registry.npmmirror.com/is-absolute@1.0.0 + is-negated-glob: registry.npmmirror.com/is-negated-glob@1.0.0 + dev: true + + registry.npmmirror.com/to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz} + name: to-fast-properties + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz} + name: to-object-path + version: 0.3.0 + engines: {node: '>=0.10.0'} + dependencies: + kind-of: registry.npmmirror.com/kind-of@3.2.2 + dev: true + + registry.npmmirror.com/to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz} + name: to-readable-stream + version: 1.0.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz} + name: to-regex-range + version: 2.1.1 + engines: {node: '>=0.10.0'} + dependencies: + is-number: registry.npmmirror.com/is-number@3.0.0 + repeat-string: registry.npmmirror.com/repeat-string@1.6.1 + dev: true + + registry.npmmirror.com/to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz} + name: to-regex-range + version: 5.0.1 + engines: {node: '>=8.0'} + dependencies: + is-number: registry.npmmirror.com/is-number@7.0.0 + + registry.npmmirror.com/to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz} + name: to-regex + version: 3.0.2 + engines: {node: '>=0.10.0'} + dependencies: + define-property: registry.npmmirror.com/define-property@2.0.2 + extend-shallow: registry.npmmirror.com/extend-shallow@3.0.2 + regex-not: registry.npmmirror.com/regex-not@1.0.2 + safe-regex: registry.npmmirror.com/safe-regex@1.1.0 + dev: true + + registry.npmmirror.com/to-through@2.0.0: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-through/-/to-through-2.0.0.tgz} + name: to-through + version: 2.0.0 + engines: {node: '>= 0.10'} + dependencies: + through2: registry.npmmirror.com/through2@2.0.5 + dev: true + + registry.npmmirror.com/toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.0.tgz} + name: toidentifier + version: 1.0.0 + engines: {node: '>=0.6'} + dev: false + + registry.npmmirror.com/touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/touch/-/touch-3.1.0.tgz} + name: touch + version: 3.1.0 + hasBin: true + dependencies: + nopt: registry.npmmirror.com/nopt@1.0.10 + dev: true + + registry.npmmirror.com/tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz} + name: tough-cookie + version: 2.5.0 + engines: {node: '>=0.8'} + dependencies: + psl: registry.npmmirror.com/psl@1.8.0 + punycode: registry.npmmirror.com/punycode@2.1.1 + dev: false + + registry.npmmirror.com/transform-ast@2.4.4: + resolution: {integrity: sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/transform-ast/-/transform-ast-2.4.4.tgz} + name: transform-ast + version: 2.4.4 + dependencies: + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + dash-ast: registry.npmmirror.com/dash-ast@1.0.0 + is-buffer: registry.npmmirror.com/is-buffer@2.0.5 + magic-string: registry.npmmirror.com/magic-string@0.23.2 + merge-source-map: registry.npmmirror.com/merge-source-map@1.0.4 + nanobench: registry.npmmirror.com/nanobench@2.1.1 + dev: true + + registry.npmmirror.com/tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.1.tgz} + name: tty-browserify + version: 0.0.1 + dev: true + + registry.npmmirror.com/tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz} + name: tunnel-agent + version: 0.6.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: false + + registry.npmmirror.com/tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz} + name: tweetnacl + version: 0.14.5 + dev: false + + registry.npmmirror.com/type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz} + name: type-check + version: 0.3.2 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.1.2 + dev: true + + registry.npmmirror.com/type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz} + name: type-check + version: 0.4.0 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + dev: true + + registry.npmmirror.com/type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz} + name: type-detect + version: 4.0.8 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz} + name: type-fest + version: 0.20.2 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz} + name: type-is + version: 1.6.18 + engines: {node: '>= 0.6'} + dependencies: + media-typer: registry.npmmirror.com/media-typer@0.3.0 + mime-types: registry.npmmirror.com/mime-types@2.1.27 + dev: false + + registry.npmmirror.com/type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type/-/type-1.2.0.tgz} + name: type + version: 1.2.0 + dev: true + + registry.npmmirror.com/type@2.6.0: + resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type/-/type-2.6.0.tgz} + name: type + version: 2.6.0 + dev: true + + registry.npmmirror.com/typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz} + name: typedarray-to-buffer + version: 3.1.5 + dependencies: + is-typedarray: registry.npmmirror.com/is-typedarray@1.0.0 + dev: true + + registry.npmmirror.com/typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz} + name: typedarray + version: 0.0.6 + + registry.npmmirror.com/typescript@4.6.4: + resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typescript/-/typescript-4.6.4.tgz} + name: typescript + version: 4.6.4 + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + registry.npmmirror.com/uglifyify@5.0.2: + resolution: {integrity: sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uglifyify/-/uglifyify-5.0.2.tgz} + name: uglifyify + version: 5.0.2 + dependencies: + convert-source-map: registry.npmmirror.com/convert-source-map@1.1.3 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + terser: registry.npmmirror.com/terser@3.17.0 + through: registry.npmmirror.com/through@2.3.8 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/umd@3.0.3: + resolution: {integrity: sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/umd/-/umd-3.0.3.tgz} + name: umd + version: 3.0.3 + hasBin: true + dev: true + + registry.npmmirror.com/unassert@1.6.0: + resolution: {integrity: sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unassert/-/unassert-1.6.0.tgz} + name: unassert + version: 1.6.0 + dependencies: + acorn: registry.npmmirror.com/acorn@7.4.1 + call-matcher: registry.npmmirror.com/call-matcher@2.0.0 + deep-equal: registry.npmmirror.com/deep-equal@1.1.1 + espurify: registry.npmmirror.com/espurify@2.1.1 + estraverse: registry.npmmirror.com/estraverse@4.3.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + object-assign: registry.npmmirror.com/object-assign@4.1.1 + dev: true + + registry.npmmirror.com/unassertify@2.1.1: + resolution: {integrity: sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unassertify/-/unassertify-2.1.1.tgz} + name: unassertify + version: 2.1.1 + dependencies: + acorn: registry.npmmirror.com/acorn@5.7.4 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + escodegen: registry.npmmirror.com/escodegen@1.14.3 + multi-stage-sourcemap: registry.npmmirror.com/multi-stage-sourcemap@0.2.1 + through: registry.npmmirror.com/through@2.3.8 + unassert: registry.npmmirror.com/unassert@1.6.0 + dev: true + + registry.npmmirror.com/unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz} + name: unbox-primitive + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.2 + has-bigints: registry.npmmirror.com/has-bigints@1.0.2 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive@1.0.2 + dev: true + + registry.npmmirror.com/unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz} + name: unc-path-regex + version: 0.1.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/undeclared-identifiers@1.1.3: + resolution: {integrity: sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz} + name: undeclared-identifiers + version: 1.1.3 + hasBin: true + dependencies: + acorn-node: registry.npmmirror.com/acorn-node@1.8.2 + dash-ast: registry.npmmirror.com/dash-ast@1.0.0 + get-assigned-identifiers: registry.npmmirror.com/get-assigned-identifiers@1.2.0 + simple-concat: registry.npmmirror.com/simple-concat@1.0.1 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: true + + registry.npmmirror.com/undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz} + name: undefsafe + version: 2.0.5 + dev: true + + registry.npmmirror.com/undertaker-registry@1.0.1: + resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz} + name: undertaker-registry + version: 1.0.1 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/undertaker@1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/undertaker/-/undertaker-1.3.0.tgz} + name: undertaker + version: 1.3.0 + engines: {node: '>= 0.10'} + dependencies: + arr-flatten: registry.npmmirror.com/arr-flatten@1.1.0 + arr-map: registry.npmmirror.com/arr-map@2.0.2 + bach: registry.npmmirror.com/bach@1.2.0 + collection-map: registry.npmmirror.com/collection-map@1.0.0 + es6-weak-map: registry.npmmirror.com/es6-weak-map@2.0.3 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein@1.1.4 + last-run: registry.npmmirror.com/last-run@1.1.1 + object.defaults: registry.npmmirror.com/object.defaults@1.1.0 + object.reduce: registry.npmmirror.com/object.reduce@1.0.1 + undertaker-registry: registry.npmmirror.com/undertaker-registry@1.0.1 + dev: true + + registry.npmmirror.com/unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz} + name: unicode-canonical-property-names-ecmascript + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz} + name: unicode-match-property-ecmascript + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: registry.npmmirror.com/unicode-canonical-property-names-ecmascript@2.0.0 + unicode-property-aliases-ecmascript: registry.npmmirror.com/unicode-property-aliases-ecmascript@2.0.0 + dev: true + + registry.npmmirror.com/unicode-match-property-value-ecmascript@2.0.0: + resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz} + name: unicode-match-property-value-ecmascript + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/unicode-property-aliases-ecmascript@2.0.0: + resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz} + name: unicode-property-aliases-ecmascript + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz} + name: union-value + version: 1.0.1 + engines: {node: '>=0.10.0'} + dependencies: + arr-union: registry.npmmirror.com/arr-union@3.1.0 + get-value: registry.npmmirror.com/get-value@2.0.6 + is-extendable: registry.npmmirror.com/is-extendable@0.1.1 + set-value: registry.npmmirror.com/set-value@2.0.1 + dev: true + + registry.npmmirror.com/unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz} + name: unique-stream + version: 2.3.1 + dependencies: + json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 + through2-filter: registry.npmmirror.com/through2-filter@3.0.0 + dev: true + + registry.npmmirror.com/unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz} + name: unique-string + version: 2.0.0 + engines: {node: '>=8'} + dependencies: + crypto-random-string: registry.npmmirror.com/crypto-random-string@2.0.0 + dev: true + + registry.npmmirror.com/unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz} + name: unpipe + version: 1.0.0 + engines: {node: '>= 0.8'} + dev: false + + registry.npmmirror.com/unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz} + name: unset-value + version: 1.0.0 + engines: {node: '>=0.10.0'} + dependencies: + has-value: registry.npmmirror.com/has-value@0.3.1 + isobject: registry.npmmirror.com/isobject@3.0.1 + dev: true + + registry.npmmirror.com/upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz} + name: upath + version: 1.2.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/update-notifier@5.1.0: + resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/update-notifier/-/update-notifier-5.1.0.tgz} + name: update-notifier + version: 5.1.0 + engines: {node: '>=10'} + dependencies: + boxen: registry.npmmirror.com/boxen@5.1.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + configstore: registry.npmmirror.com/configstore@5.0.1 + has-yarn: registry.npmmirror.com/has-yarn@2.1.0 + import-lazy: registry.npmmirror.com/import-lazy@2.1.0 + is-ci: registry.npmmirror.com/is-ci@2.0.0 + is-installed-globally: registry.npmmirror.com/is-installed-globally@0.4.0 + is-npm: registry.npmmirror.com/is-npm@5.0.0 + is-yarn-global: registry.npmmirror.com/is-yarn-global@0.3.0 + latest-version: registry.npmmirror.com/latest-version@5.1.0 + pupa: registry.npmmirror.com/pupa@2.1.1 + semver: registry.npmmirror.com/semver@7.3.7 + semver-diff: registry.npmmirror.com/semver-diff@3.1.1 + xdg-basedir: registry.npmmirror.com/xdg-basedir@4.0.0 + dev: true + + registry.npmmirror.com/uri-js@4.2.2: + resolution: {integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.2.2.tgz} + name: uri-js + version: 4.2.2 + dependencies: + punycode: registry.npmmirror.com/punycode@2.1.1 + + registry.npmmirror.com/urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz} + name: urix + version: 0.1.0 + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + registry.npmmirror.com/url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz} + name: url-parse-lax + version: 3.0.0 + engines: {node: '>=4'} + dependencies: + prepend-http: registry.npmmirror.com/prepend-http@2.0.0 + dev: true + + registry.npmmirror.com/url@0.11.0: + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/url/-/url-0.11.0.tgz} + name: url + version: 0.11.0 + dependencies: + punycode: registry.npmmirror.com/punycode@1.3.2 + querystring: registry.npmmirror.com/querystring@0.2.0 + dev: true + + registry.npmmirror.com/use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/use/-/use-3.1.1.tgz} + name: use + version: 3.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz} + name: util-deprecate + version: 1.0.2 + + registry.npmmirror.com/util@0.10.3: + resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/util/-/util-0.10.3.tgz} + name: util + version: 0.10.3 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.1 + dev: true + + registry.npmmirror.com/util@0.12.4: + resolution: {integrity: sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/util/-/util-0.12.4.tgz} + name: util + version: 0.12.4 + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-generator-function: registry.npmmirror.com/is-generator-function@1.0.10 + is-typed-array: registry.npmmirror.com/is-typed-array@1.1.9 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + which-typed-array: registry.npmmirror.com/which-typed-array@1.1.8 + dev: true + + registry.npmmirror.com/utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz} + name: utils-merge + version: 1.0.1 + engines: {node: '>= 0.4.0'} + dev: false + + registry.npmmirror.com/uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz} + name: uuid + version: 3.4.0 + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + registry.npmmirror.com/uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz} + name: uuid + version: 8.3.2 + hasBin: true + dev: false + + registry.npmmirror.com/v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz} + name: v8-compile-cache + version: 2.3.0 + dev: true + + registry.npmmirror.com/v8flags@3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/v8flags/-/v8flags-3.2.0.tgz} + name: v8flags + version: 3.2.0 + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: registry.npmmirror.com/homedir-polyfill@1.0.3 + dev: true + + registry.npmmirror.com/validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} + name: validate-npm-package-license + version: 3.0.4 + dependencies: + spdx-correct: registry.npmmirror.com/spdx-correct@3.1.1 + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + dev: true + + registry.npmmirror.com/value-or-function@3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/value-or-function/-/value-or-function-3.0.0.tgz} + name: value-or-function + version: 3.0.0 + engines: {node: '>= 0.10'} + dev: true + + registry.npmmirror.com/vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz} + name: vary + version: 1.1.2 + engines: {node: '>= 0.8'} + dev: false + + registry.npmmirror.com/verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz} + name: verror + version: 1.10.0 + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: registry.npmmirror.com/assert-plus@1.0.0 + core-util-is: registry.npmmirror.com/core-util-is@1.0.2 + extsprintf: registry.npmmirror.com/extsprintf@1.3.0 + dev: false + + registry.npmmirror.com/vinyl-fs@3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz} + name: vinyl-fs + version: 3.0.3 + engines: {node: '>= 0.10'} + dependencies: + fs-mkdirp-stream: registry.npmmirror.com/fs-mkdirp-stream@1.0.0 + glob-stream: registry.npmmirror.com/glob-stream@6.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + is-valid-glob: registry.npmmirror.com/is-valid-glob@1.0.0 + lazystream: registry.npmmirror.com/lazystream@1.0.1 + lead: registry.npmmirror.com/lead@1.0.0 + object.assign: registry.npmmirror.com/object.assign@4.1.2 + pumpify: registry.npmmirror.com/pumpify@1.5.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.7 + remove-bom-buffer: registry.npmmirror.com/remove-bom-buffer@3.0.0 + remove-bom-stream: registry.npmmirror.com/remove-bom-stream@1.2.0 + resolve-options: registry.npmmirror.com/resolve-options@1.1.0 + through2: registry.npmmirror.com/through2@2.0.5 + to-through: registry.npmmirror.com/to-through@2.0.0 + value-or-function: registry.npmmirror.com/value-or-function@3.0.0 + vinyl: registry.npmmirror.com/vinyl@2.2.1 + vinyl-sourcemap: registry.npmmirror.com/vinyl-sourcemap@1.1.0 + dev: true + + registry.npmmirror.com/vinyl-sourcemap@1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz} + name: vinyl-sourcemap + version: 1.1.0 + engines: {node: '>= 0.10'} + dependencies: + append-buffer: registry.npmmirror.com/append-buffer@1.0.2 + convert-source-map: registry.npmmirror.com/convert-source-map@1.8.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.10 + normalize-path: registry.npmmirror.com/normalize-path@2.1.1 + now-and-later: registry.npmmirror.com/now-and-later@2.0.1 + remove-bom-buffer: registry.npmmirror.com/remove-bom-buffer@3.0.0 + vinyl: registry.npmmirror.com/vinyl@2.2.1 + dev: true + + registry.npmmirror.com/vinyl-sourcemaps-apply@0.2.1: + resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz} + name: vinyl-sourcemaps-apply + version: 0.2.1 + dependencies: + source-map: registry.npmmirror.com/source-map@0.5.7 + dev: true + + registry.npmmirror.com/vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vinyl/-/vinyl-2.2.1.tgz} + name: vinyl + version: 2.2.1 + engines: {node: '>= 0.10'} + dependencies: + clone: registry.npmmirror.com/clone@2.1.2 + clone-buffer: registry.npmmirror.com/clone-buffer@1.0.0 + clone-stats: registry.npmmirror.com/clone-stats@1.0.0 + cloneable-readable: registry.npmmirror.com/cloneable-readable@1.1.3 + remove-trailing-separator: registry.npmmirror.com/remove-trailing-separator@1.1.0 + replace-ext: registry.npmmirror.com/replace-ext@1.0.1 + dev: true + + registry.npmmirror.com/vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz} + name: vm-browserify + version: 1.1.2 + dev: true + + registry.npmmirror.com/which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} + name: which-boxed-primitive + version: 1.0.2 + dependencies: + is-bigint: registry.npmmirror.com/is-bigint@1.0.4 + is-boolean-object: registry.npmmirror.com/is-boolean-object@1.1.2 + is-number-object: registry.npmmirror.com/is-number-object@1.0.7 + is-string: registry.npmmirror.com/is-string@1.0.7 + is-symbol: registry.npmmirror.com/is-symbol@1.0.4 + dev: true + + registry.npmmirror.com/which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-module/-/which-module-1.0.0.tgz} + name: which-module + version: 1.0.0 + dev: true + + registry.npmmirror.com/which-typed-array@1.1.8: + resolution: {integrity: sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.8.tgz} + name: which-typed-array + version: 1.1.8 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.2 + es-abstract: registry.npmmirror.com/es-abstract@1.20.1 + for-each: registry.npmmirror.com/for-each@0.3.3 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + is-typed-array: registry.npmmirror.com/is-typed-array@1.1.9 + dev: true + + registry.npmmirror.com/which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which/-/which-1.3.1.tgz} + name: which + version: 1.3.1 + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe@2.0.0 + dev: true + + registry.npmmirror.com/which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz} + name: which + version: 2.0.2 + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe@2.0.0 + dev: true + + registry.npmmirror.com/widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/widest-line/-/widest-line-3.1.0.tgz} + name: widest-line + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + dev: true + + registry.npmmirror.com/word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz} + name: word-wrap + version: 1.2.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz} + name: workerpool + version: 6.2.1 + dev: true + + registry.npmmirror.com/wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz} + name: wrap-ansi + version: 2.1.0 + engines: {node: '>=0.10.0'} + dependencies: + string-width: registry.npmmirror.com/string-width@1.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@3.0.1 + dev: true + + registry.npmmirror.com/wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz} + name: wrap-ansi + version: 7.0.0 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/wrap-comment@1.0.1: + resolution: {integrity: sha512-APccrMwl/ont0RHFTXNAQfM647duYYEfs6cngrIyTByTI0xbWnDnPSptFZhS68L4WCjt2ZxuhCFwuY6Pe88KZQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-comment/-/wrap-comment-1.0.1.tgz} + name: wrap-comment + version: 1.0.1 + dev: true + + registry.npmmirror.com/wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz} + name: wrappy + version: 1.0.2 + dev: true + + registry.npmmirror.com/write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz} + name: write-file-atomic + version: 3.0.3 + dependencies: + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + is-typedarray: registry.npmmirror.com/is-typedarray@1.0.0 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + typedarray-to-buffer: registry.npmmirror.com/typedarray-to-buffer@3.1.5 + dev: true + + registry.npmmirror.com/xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz} + name: xdg-basedir + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/xhr-response@1.0.1: + resolution: {integrity: sha512-m2FlVRCl3VqDcpc8UaWZJpwuHpFR2vYeXv6ipXU2Uuu4vNKFYVEFI0emuJN370Fge+JCbiAnS+JJmSoWVmWrjQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xhr-response/-/xhr-response-1.0.1.tgz} + name: xhr-response + version: 1.0.1 + dev: false + + registry.npmmirror.com/xhr-send@1.0.0: + resolution: {integrity: sha512-789EG4qW6Z0nPvG74AV3WWQCnBG5HxJXNiBsnEivZ8OpbvVA0amH0+g+MNT99o5kt/XLdRezm5KS1wJzcGJztw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xhr-send/-/xhr-send-1.0.0.tgz} + name: xhr-send + version: 1.0.0 + dev: false + + registry.npmmirror.com/xhr-status@1.0.1: + resolution: {integrity: sha512-VF0WSqtmkf56OmF26LCWsWvRb1a+WYGdHDoQnPPCVUQTM8CVUAOBcUDsm7nP7SQcgEEdrvF4DmhEADuXdGieyw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xhr-status/-/xhr-status-1.0.1.tgz} + name: xhr-status + version: 1.0.1 + dev: false + + registry.npmmirror.com/xtend@2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xtend/-/xtend-2.1.2.tgz} + name: xtend + version: 2.1.2 + engines: {node: '>=0.4'} + dependencies: + object-keys: registry.npmmirror.com/object-keys@0.4.0 + + registry.npmmirror.com/xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz} + name: xtend + version: 4.0.2 + engines: {node: '>=0.4'} + + registry.npmmirror.com/y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/y18n/-/y18n-3.2.2.tgz} + name: y18n + version: 3.2.2 + dev: true + + registry.npmmirror.com/y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} + name: y18n + version: 5.0.8 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} + name: yallist + version: 4.0.0 + + registry.npmmirror.com/yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz} + name: yargs-parser + version: 20.2.4 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yargs-parser@5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-5.0.1.tgz} + name: yargs-parser + version: 5.0.1 + dependencies: + camelcase: registry.npmmirror.com/camelcase@3.0.0 + object.assign: registry.npmmirror.com/object.assign@4.1.2 + dev: true + + registry.npmmirror.com/yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz} + name: yargs-unparser + version: 2.0.0 + engines: {node: '>=10'} + dependencies: + camelcase: registry.npmmirror.com/camelcase@6.3.0 + decamelize: registry.npmmirror.com/decamelize@4.0.0 + flat: registry.npmmirror.com/flat@5.0.2 + is-plain-obj: registry.npmmirror.com/is-plain-obj@2.1.0 + dev: true + + registry.npmmirror.com/yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz} + name: yargs + version: 16.2.0 + engines: {node: '>=10'} + dependencies: + cliui: registry.npmmirror.com/cliui@7.0.4 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + dev: true + + registry.npmmirror.com/yargs@7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yargs/-/yargs-7.1.2.tgz} + name: yargs + version: 7.1.2 + dependencies: + camelcase: registry.npmmirror.com/camelcase@3.0.0 + cliui: registry.npmmirror.com/cliui@3.2.0 + decamelize: registry.npmmirror.com/decamelize@1.2.0 + get-caller-file: registry.npmmirror.com/get-caller-file@1.0.3 + os-locale: registry.npmmirror.com/os-locale@1.4.0 + read-pkg-up: registry.npmmirror.com/read-pkg-up@1.0.1 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + require-main-filename: registry.npmmirror.com/require-main-filename@1.0.1 + set-blocking: registry.npmmirror.com/set-blocking@2.0.0 + string-width: registry.npmmirror.com/string-width@1.0.2 + which-module: registry.npmmirror.com/which-module@1.0.0 + y18n: registry.npmmirror.com/y18n@3.2.2 + yargs-parser: registry.npmmirror.com/yargs-parser@5.0.1 + dev: true + + registry.npmmirror.com/yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz} + name: yocto-queue + version: 0.1.0 + engines: {node: '>=10'} + dev: true diff --git a/backend/src/constants.js b/backend/src/constants.js new file mode 100644 index 000000000..748135783 --- /dev/null +++ b/backend/src/constants.js @@ -0,0 +1,15 @@ +export const SCHEMA_VERSION_KEY = 'schemaVersion'; +export const SETTINGS_KEY = 'settings'; +export const SUBS_KEY = 'subs'; +export const COLLECTIONS_KEY = 'collections'; +export const FILES_KEY = 'files'; +export const MODULES_KEY = 'modules'; +export const ARTIFACTS_KEY = 'artifacts'; +export const RULES_KEY = 'rules'; +export const GIST_BACKUP_KEY = 'Auto Generated Sub-Store Backup'; +export const GIST_BACKUP_FILE_NAME = 'Sub-Store'; +export const ARTIFACT_REPOSITORY_KEY = 'Sub-Store Artifacts Repository'; +export const RESOURCE_CACHE_KEY = '#sub-store-cached-resource'; +export const CACHE_EXPIRATION_TIME_MS = 60 * 60 * 1000; // 1 hour +export const SCRIPT_RESOURCE_CACHE_KEY = '#sub-store-cached-script-resource'; // cached-script-resource CSR +export const CSR_EXPIRATION_TIME_KEY = '#sub-store-csr-expiration-time'; // Custom expiration time key; (Loon|Surge) Default write 48 hour diff --git a/backend/src/core/app.js b/backend/src/core/app.js new file mode 100644 index 000000000..08517b604 --- /dev/null +++ b/backend/src/core/app.js @@ -0,0 +1,4 @@ +import { OpenAPI } from '@/vendor/open-api'; + +const $ = new OpenAPI('sub-store'); +export default $; diff --git a/backend/src/core/proxy-utils/index.js b/backend/src/core/proxy-utils/index.js new file mode 100644 index 000000000..e20c9bb84 --- /dev/null +++ b/backend/src/core/proxy-utils/index.js @@ -0,0 +1,291 @@ +import YAML from 'static-js-yaml'; +import download from '@/utils/download'; +import { isIPv4, isIPv6, isValidPortNumber } from '@/utils'; +import PROXY_PROCESSORS, { ApplyProcessor } from './processors'; +import PROXY_PREPROCESSORS from './preprocessors'; +import PROXY_PRODUCERS from './producers'; +import PROXY_PARSERS from './parsers'; +import $ from '@/core/app'; + +function preprocess(raw) { + for (const processor of PROXY_PREPROCESSORS) { + try { + if (processor.test(raw)) { + $.info(`Pre-processor [${processor.name}] activated`); + return processor.parse(raw); + } + } catch (e) { + $.error(`Parser [${processor.name}] failed\n Reason: ${e}`); + } + } + return raw; +} + +function parse(raw) { + raw = preprocess(raw); + // parse + const lines = raw.split('\n'); + const proxies = []; + let lastParser; + + for (let line of lines) { + line = line.trim(); + if (line.length === 0) continue; // skip empty line + let success = false; + + // try to parse with last used parser + if (lastParser) { + const [proxy, error] = tryParse(lastParser, line); + if (!error) { + proxies.push(lastParse(proxy)); + success = true; + } + } + + if (!success) { + // search for a new parser + for (const parser of PROXY_PARSERS) { + const [proxy, error] = tryParse(parser, line); + if (!error) { + proxies.push(lastParse(proxy)); + lastParser = parser; + success = true; + $.info(`${parser.name} is activated`); + break; + } + } + } + + if (!success) { + $.error(`Failed to parse line: ${line}`); + } + } + return proxies; +} + +async function process(proxies, operators = [], targetPlatform, source) { + for (const item of operators) { + // process script + let script; + let $arguments = {}; + if (item.type.indexOf('Script') !== -1) { + const { mode, content } = item.args; + if (mode === 'link') { + let noCache; + let url = content; + if (url.endsWith('#noCache')) { + url = url.replace(/#noCache$/, ''); + noCache = true; + } + // extract link arguments + const rawArgs = url.split('#'); + if (rawArgs.length > 1) { + try { + // 支持 `#${encodeURIComponent(JSON.stringify({arg1: "1"}))}` + $arguments = JSON.parse(decodeURIComponent(rawArgs[1])); + } catch (e) { + for (const pair of rawArgs[1].split('&')) { + const key = pair.split('=')[0]; + const value = pair.split('=')[1]; + // 部分兼容之前的逻辑 const value = pair.split('=')[1] || true; + $arguments[key] = + value == null || value === '' + ? true + : decodeURIComponent(value); + } + } + } + + // if this is a remote script, download it + try { + script = await download( + `${url.split('#')[0]}${noCache ? '#noCache' : ''}`, + ); + // $.info(`Script loaded: >>>\n ${script}`); + } catch (err) { + $.error( + `Error when downloading remote script: ${item.args.content}.\n Reason: ${err}`, + ); + throw new Error(`无法下载脚本: ${url}`); + } + } else { + script = content; + } + } + + if (!PROXY_PROCESSORS[item.type]) { + $.error(`Unknown operator: "${item.type}"`); + continue; + } + + $.info( + `Applying "${item.type}" with arguments:\n >>> ${ + JSON.stringify(item.args, null, 2) || 'None' + }`, + ); + let processor; + if (item.type.indexOf('Script') !== -1) { + processor = PROXY_PROCESSORS[item.type]( + script, + targetPlatform, + $arguments, + source, + ); + } else { + processor = PROXY_PROCESSORS[item.type](item.args || {}); + } + proxies = await ApplyProcessor(processor, proxies); + } + return proxies; +} + +function produce(proxies, targetPlatform, type, opts = {}) { + const producer = PROXY_PRODUCERS[targetPlatform]; + if (!producer) { + throw new Error(`Target platform: ${targetPlatform} is not supported!`); + } + + // filter unsupported proxies + proxies = proxies.filter( + (proxy) => + !(proxy.supported && proxy.supported[targetPlatform] === false), + ); + + $.info(`Producing proxies for target: ${targetPlatform}`); + if (typeof producer.type === 'undefined' || producer.type === 'SINGLE') { + let localPort = 10000; + const list = proxies + .map((proxy) => { + try { + let line = producer.produce(proxy, type, opts); + if ( + line.length > 0 && + line.includes('__SubStoreLocalPort__') + ) { + line = line.replace( + /__SubStoreLocalPort__/g, + localPort++, + ); + } + return line; + } catch (err) { + $.error( + `Cannot produce proxy: ${JSON.stringify( + proxy, + null, + 2, + )}\nReason: ${err}`, + ); + return ''; + } + }) + .filter((line) => line.length > 0); + return type === 'internal' ? list : list.join('\n'); + } else if (producer.type === 'ALL') { + return producer.produce(proxies, type, opts); + } +} + +export const ProxyUtils = { + parse, + process, + produce, + isIPv4, + isIPv6, + isIP, + yaml: YAML, +}; + +function tryParse(parser, line) { + if (!safeMatch(parser, line)) return [null, new Error('Parser mismatch')]; + try { + const proxy = parser.parse(line); + return [proxy, null]; + } catch (err) { + return [null, err]; + } +} + +function safeMatch(parser, line) { + try { + return parser.test(line); + } catch (err) { + return false; + } +} + +function lastParse(proxy) { + if (isValidPortNumber(proxy.port)) { + proxy.port = parseInt(proxy.port, 10); + } + if (proxy.server) { + proxy.server = `${proxy.server}` + .trim() + .replace(/^\[/, '') + .replace(/\]$/, ''); + } + if (proxy.type === 'trojan') { + if (proxy.network === 'tcp') { + delete proxy.network; + } + } + if (['trojan', 'tuic', 'hysteria', 'hysteria2'].includes(proxy.type)) { + proxy.tls = true; + } + if (proxy.network) { + let transportHost = proxy[`${proxy.network}-opts`]?.headers?.Host; + let transporthost = proxy[`${proxy.network}-opts`]?.headers?.host; + if (transporthost && !transportHost) { + proxy[`${proxy.network}-opts`].headers.Host = transporthost; + delete proxy[`${proxy.network}-opts`].headers.host; + } + } + if (proxy.tls && !proxy.sni) { + if (proxy.network) { + let transportHost = proxy[`${proxy.network}-opts`]?.headers?.Host; + transportHost = Array.isArray(transportHost) + ? transportHost[0] + : transportHost; + if (transportHost) { + proxy.sni = transportHost; + } + } + if (!proxy.sni && !isIP(proxy.server)) { + proxy.sni = proxy.server; + } + } + // 非 tls, 有 ws/http 传输层, 使用域名的节点, 将设置传输层 Host 防止之后域名解析后丢失域名(不覆盖现有的 Host) + if ( + !proxy.tls && + ['ws', 'http'].includes(proxy.network) && + !proxy[`${proxy.network}-opts`]?.headers?.Host && + !isIP(proxy.server) + ) { + proxy[`${proxy.network}-opts`] = proxy[`${proxy.network}-opts`] || {}; + proxy[`${proxy.network}-opts`].headers = + proxy[`${proxy.network}-opts`].headers || {}; + proxy[`${proxy.network}-opts`].headers.Host = + ['vmess', 'vless'].includes(proxy.type) && proxy.network === 'http' + ? [proxy.server] + : proxy.server; + } + // 统一将 VMess 和 VLESS 的 http 传输层的 path 和 Host 处理为数组 + if (['vmess', 'vless'].includes(proxy.type) && proxy.network === 'http') { + let transportPath = proxy[`${proxy.network}-opts`]?.path; + let transportHost = proxy[`${proxy.network}-opts`]?.headers?.Host; + if (transportHost && !Array.isArray(transportHost)) { + proxy[`${proxy.network}-opts`].headers.Host = [transportHost]; + } + if (transportPath && !Array.isArray(transportPath)) { + proxy[`${proxy.network}-opts`].path = [transportPath]; + } + } + if (['hysteria', 'hysteria2'].includes(proxy.type) && !proxy.ports) { + delete proxy.ports; + } + return proxy; +} + +function isIP(ip) { + return isIPv4(ip) || isIPv6(ip); +} diff --git a/backend/src/core/proxy-utils/parsers/index.js b/backend/src/core/proxy-utils/parsers/index.js new file mode 100644 index 000000000..c33306ec8 --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/index.js @@ -0,0 +1,907 @@ +import { getIfNotBlank, isPresent, isNotBlank, getIfPresent } from '@/utils'; +import getSurgeParser from './peggy/surge'; +import getLoonParser from './peggy/loon'; +import getQXParser from './peggy/qx'; +import getTrojanURIParser from './peggy/trojan-uri'; + +import { Base64 } from 'js-base64'; + +// Parse SS URI format (only supports new SIP002, legacy format is depreciated). +// reference: https://github.com/shadowsocks/shadowsocks-org/wiki/SIP002-URI-Scheme +function URI_SS() { + const name = 'URI SS Parser'; + const test = (line) => { + return /^ss:\/\//.test(line); + }; + const parse = (line) => { + // parse url + let content = line.split('ss://')[1]; + + const proxy = { + name: decodeURIComponent(line.split('#')[1]), + type: 'ss', + }; + content = content.split('#')[0]; // strip proxy name + // handle IPV4 and IPV6 + let serverAndPortArray = content.match(/@([^/]*)(\/|$)/); + let userInfoStr = Base64.decode(content.split('@')[0]); + if (!serverAndPortArray) { + content = Base64.decode(content); + userInfoStr = content.split('@')[0]; + serverAndPortArray = content.match(/@([^/]*)(\/|$)/); + } + const serverAndPort = serverAndPortArray[1]; + const portIdx = serverAndPort.lastIndexOf(':'); + proxy.server = serverAndPort.substring(0, portIdx); + proxy.port = `${serverAndPort.substring(portIdx + 1)}`.match( + /\d+/, + )?.[0]; + + const userInfo = userInfoStr.split(':'); + proxy.cipher = userInfo[0]; + proxy.password = userInfo[1]; + + // handle obfs + const idx = content.indexOf('?plugin='); + if (idx !== -1) { + const pluginInfo = ( + 'plugin=' + + decodeURIComponent(content.split('?plugin=')[1].split('&')[0]) + ).split(';'); + const params = {}; + for (const item of pluginInfo) { + const [key, val] = item.split('='); + if (key) params[key] = val || true; // some options like "tls" will not have value + } + switch (params.plugin) { + case 'obfs-local': + case 'simple-obfs': + proxy.plugin = 'obfs'; + proxy['plugin-opts'] = { + mode: params.obfs, + host: getIfNotBlank(params['obfs-host']), + }; + break; + case 'v2ray-plugin': + proxy.obfs = 'v2ray-plugin'; + proxy['plugin-opts'] = { + mode: 'websocket', + host: getIfNotBlank(params['obfs-host']), + path: getIfNotBlank(params.path), + tls: getIfPresent(params.tls), + }; + break; + default: + throw new Error( + `Unsupported plugin option: ${params.plugin}`, + ); + } + } + return proxy; + }; + return { name, test, parse }; +} + +// Parse URI SSR format, such as ssr://xxx +function URI_SSR() { + const name = 'URI SSR Parser'; + const test = (line) => { + return /^ssr:\/\//.test(line); + }; + const parse = (line) => { + line = Base64.decode(line.split('ssr://')[1]); + + // handle IPV6 & IPV4 format + let splitIdx = line.indexOf(':origin'); + if (splitIdx === -1) { + splitIdx = line.indexOf(':auth_'); + } + const serverAndPort = line.substring(0, splitIdx); + const server = serverAndPort.substring( + 0, + serverAndPort.lastIndexOf(':'), + ); + const port = serverAndPort.substring( + serverAndPort.lastIndexOf(':') + 1, + ); + + let params = line + .substring(splitIdx + 1) + .split('/?')[0] + .split(':'); + let proxy = { + type: 'ssr', + server, + port, + protocol: params[0], + cipher: params[1], + obfs: params[2], + password: Base64.decode(params[3]), + }; + // get other params + const other_params = {}; + line = line.split('/?')[1].split('&'); + if (line.length > 1) { + for (const item of line) { + let [key, val] = item.split('='); + val = val.trim(); + if (val.length > 0) { + other_params[key] = val; + } + } + } + proxy = { + ...proxy, + name: other_params.remarks + ? Base64.decode(other_params.remarks) + : proxy.server, + 'protocol-param': getIfNotBlank( + Base64.decode(other_params.protoparam || '').replace(/\s/g, ''), + ), + 'obfs-param': getIfNotBlank( + Base64.decode(other_params.obfsparam || '').replace(/\s/g, ''), + ), + }; + return proxy; + }; + + return { name, test, parse }; +} + +// V2rayN URI VMess format +// reference: https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2) + +// Quantumult VMess format +function URI_VMess() { + const name = 'URI VMess Parser'; + const test = (line) => { + return /^vmess:\/\//.test(line); + }; + const parse = (line) => { + line = line.split('vmess://')[1]; + let content = Base64.decode(line); + if (/=\s*vmess/.test(content)) { + // Quantumult VMess URI format + const partitions = content.split(',').map((p) => p.trim()); + // get keyword params + const params = {}; + for (const part of partitions) { + if (part.indexOf('=') !== -1) { + const [key, val] = part.split('='); + params[key.trim()] = val.trim(); + } + } + + const proxy = { + name: partitions[0].split('=')[0].trim(), + type: 'vmess', + server: partitions[1], + port: partitions[2], + cipher: getIfNotBlank(partitions[3], 'auto'), + uuid: partitions[4].match(/^"(.*)"$/)[1], + tls: params.obfs === 'wss', + udp: getIfPresent(params['udp-relay']), + tfo: getIfPresent(params['fast-open']), + 'skip-cert-verify': isPresent(params['tls-verification']) + ? !params['tls-verification'] + : undefined, + }; + + // handle ws headers + if (isPresent(params.obfs)) { + if (params.obfs === 'ws' || params.obfs === 'wss') { + proxy.network = 'ws'; + proxy['ws-opts'].path = ( + getIfNotBlank(params['obfs-path']) || '"/"' + ).match(/^"(.*)"$/)[1]; + let obfs_host = params['obfs-header']; + if (obfs_host && obfs_host.indexOf('Host') !== -1) { + obfs_host = obfs_host.match( + /Host:\s*([a-zA-Z0-9-.]*)/, + )[1]; + } + if (isNotBlank(obfs_host)) { + proxy['ws-opts'].headers = { + Host: obfs_host, + }; + } + } else { + throw new Error(`Unsupported obfs: ${params.obfs}`); + } + } + return proxy; + } else { + let params = {}; + + try { + // V2rayN URI format + params = JSON.parse(content); + } catch (e) { + // Shadowrocket URI format + // eslint-disable-next-line no-unused-vars + let [__, base64Line, qs] = /(^[^?]+?)\/?\?(.*)$/.exec(line); + content = Base64.decode(base64Line); + + for (const addon of qs.split('&')) { + const [key, valueRaw] = addon.split('='); + let value = valueRaw; + value = decodeURIComponent(valueRaw); + if (value.indexOf(',') === -1) { + params[key] = value; + } else { + params[key] = value.split(','); + } + } + // eslint-disable-next-line no-unused-vars + let [___, cipher, uuid, server, port] = + /(^[^:]+?):([^:]+?)@(.*):(\d+)$/.exec(content); + + params.scy = cipher; + params.id = uuid; + params.port = port; + params.add = server; + } + const proxy = { + name: params.ps ?? params.remarks, + type: 'vmess', + server: params.add, + port: parseInt(getIfPresent(params.port), 10), + cipher: getIfPresent(params.scy, 'auto'), + uuid: params.id, + alterId: parseInt( + getIfPresent(params.aid ?? params.alterId, 0), + 10, + ), + tls: ['tls', true, 1, '1'].includes(params.tls), + 'skip-cert-verify': isPresent(params.verify_cert) + ? !params.verify_cert + : undefined, + }; + // https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2) + if (proxy.tls && proxy.sni) { + proxy.sni = params.sni; + } + // handle obfs + if (params.net === 'ws' || params.obfs === 'websocket') { + proxy.network = 'ws'; + } else if ( + ['tcp', 'http'].includes(params.net) || + params.obfs === 'http' + ) { + proxy.network = 'http'; + } else if (['grpc'].includes(params.net)) { + proxy.network = 'grpc'; + } + if (proxy.network) { + let transportHost = params.host ?? params.obfsParam; + try { + const parsedObfs = JSON.parse(transportHost); + const parsedHost = parsedObfs?.Host; + if (parsedHost) { + transportHost = parsedHost; + } + // eslint-disable-next-line no-empty + } catch (e) {} + let transportPath = params.path; + + if (proxy.network === 'http') { + if (transportHost) { + transportHost = Array.isArray(transportHost) + ? transportHost[0] + : transportHost; + } + if (transportPath) { + transportPath = Array.isArray(transportPath) + ? transportPath[0] + : transportPath; + } + } + if (transportPath || transportHost) { + if (['grpc'].includes(proxy.network)) { + proxy[`${proxy.network}-opts`] = { + 'grpc-service-name': getIfNotBlank(transportPath), + '_grpc-type': getIfNotBlank(params.type), + }; + } else { + proxy[`${proxy.network}-opts`] = { + path: getIfNotBlank(transportPath), + headers: { Host: getIfNotBlank(transportHost) }, + }; + } + } else { + delete proxy.network; + } + + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/docs/config.yaml#L413 + // sni 优先级应高于 host + if (proxy.tls && !proxy.sni && transportHost) { + proxy.sni = transportHost; + } + } + return proxy; + } + }; + return { name, test, parse }; +} + +function URI_VLESS() { + const name = 'URI VLESS Parser'; + const test = (line) => { + return /^vless:\/\//.test(line); + }; + const parse = (line) => { + line = line.split('vless://')[1]; + // eslint-disable-next-line no-unused-vars + let [__, uuid, server, port, ___, addons = '', name] = + /^(.*?)@(.*?):(\d+)\/?(\?(.*?))?(?:#(.*?))?$/.exec(line); + port = parseInt(`${port}`, 10); + uuid = decodeURIComponent(uuid); + if (name != null) { + name = decodeURIComponent(name); + } + name = name ?? `VLESS ${server}:${port}`; + const proxy = { + type: 'vless', + name, + server, + port, + uuid, + }; + const params = {}; + for (const addon of addons.split('&')) { + const [key, valueRaw] = addon.split('='); + let value = valueRaw; + value = decodeURIComponent(valueRaw); + params[key] = value; + } + + proxy.tls = params.security && params.security !== 'none'; + proxy.sni = params.sni; + proxy.flow = params.flow; + proxy['client-fingerprint'] = params.fp; + proxy.alpn = params.alpn ? params.alpn.split(',') : undefined; + proxy['skip-cert-verify'] = /(TRUE)|1/i.test(params.allowInsecure); + + if (['reality'].includes(params.security)) { + const opts = {}; + if (params.pbk) { + opts['public-key'] = params.pbk; + } + if (params.sid) { + opts['short-id'] = params.sid; + } + if (Object.keys(opts).length > 0) { + proxy[`${params.security}-opts`] = opts; + } + } + + proxy.network = params.type; + if (proxy.network && !['tcp', 'none'].includes(proxy.network)) { + const opts = {}; + if (params.path) { + opts.path = params.path; + } + if (params.host) { + opts.headers = { Host: params.host }; + } + if (params.serviceName) { + opts[`${proxy.network}-service-name`] = params.serviceName; + } + // https://github.com/XTLS/Xray-core/issues/91 + if (['grpc'].includes(proxy.network)) { + opts['_grpc-type'] = params.mode || 'gun'; + } + if (Object.keys(opts).length > 0) { + proxy[`${proxy.network}-opts`] = opts; + } + } + + if (proxy.tls && !proxy.sni) { + if (proxy.network === 'ws') { + proxy.sni = proxy['ws-opts']?.headers?.Host; + } else if (proxy.network === 'http') { + let httpHost = proxy['http-opts']?.headers?.Host; + proxy.sni = Array.isArray(httpHost) ? httpHost[0] : httpHost; + } + } + + return proxy; + }; + return { name, test, parse }; +} +function URI_Hysteria2() { + const name = 'URI Hysteria2 Parser'; + const test = (line) => { + return /^(hysteria2|hy2):\/\//.test(line); + }; + const parse = (line) => { + line = line.split(/(hysteria2|hy2):\/\//)[2]; + // eslint-disable-next-line no-unused-vars + let [__, password, server, ___, port, ____, addons = '', name] = + /^(.*?)@(.*?)(:(\d+))?\/?(\?(.*?))?(?:#(.*?))?$/.exec(line); + port = parseInt(`${port}`, 10); + if (isNaN(port)) { + port = 443; + } + password = decodeURIComponent(password); + if (name != null) { + name = decodeURIComponent(name); + } + name = name ?? `Hysteria2 ${server}:${port}`; + + const proxy = { + type: 'hysteria2', + name, + server, + port, + password, + }; + + const params = {}; + for (const addon of addons.split('&')) { + const [key, valueRaw] = addon.split('='); + let value = valueRaw; + value = decodeURIComponent(valueRaw); + params[key] = value; + } + + proxy.sni = params.sni; + if (!proxy.sni && params.peer) { + proxy.sni = params.peer; + } + if (params.obfs && params.obfs !== 'none') { + proxy.obfs = params.obfs; + } + + proxy['obfs-password'] = params['obfs-password']; + proxy['skip-cert-verify'] = /(TRUE)|1/i.test(params.insecure); + proxy.tfo = /(TRUE)|1/i.test(params.fastopen); + proxy['tls-fingerprint'] = params.pinSHA256; + + return proxy; + }; + return { name, test, parse }; +} + +// Trojan URI format +function URI_Trojan() { + const name = 'URI Trojan Parser'; + const test = (line) => { + return /^trojan:\/\//.test(line); + }; + + const parse = (line) => { + let [newLine, name] = line.split(/#(.+)/, 2); + const parser = getTrojanURIParser(); + const proxy = parser.parse(newLine); + if (isNotBlank(name)) { + try { + proxy.name = decodeURIComponent(name); + } catch (e) { + console.log(e); + } + } + return proxy; + }; + return { name, test, parse }; +} + +function Clash_All() { + const name = 'Clash Parser'; + const test = (line) => { + try { + JSON.parse(line); + } catch (e) { + return false; + } + return true; + }; + const parse = (line) => { + const proxy = JSON.parse(line); + if ( + ![ + 'ss', + 'ssr', + 'vmess', + 'socks5', + 'http', + 'snell', + 'trojan', + 'tuic', + 'vless', + 'hysteria', + 'hysteria2', + 'wireguard', + ].includes(proxy.type) + ) { + throw new Error( + `Clash does not support proxy with type: ${proxy.type}`, + ); + } + + // handle vmess sni + if (['vmess', 'vless'].includes(proxy.type)) { + proxy.sni = proxy.servername; + delete proxy.servername; + if (proxy.tls && !proxy.sni) { + if (proxy.network === 'ws') { + proxy.sni = proxy['ws-opts']?.headers?.Host; + } else if (proxy.network === 'http') { + let httpHost = proxy['http-opts']?.headers?.Host; + proxy.sni = Array.isArray(httpHost) + ? httpHost[0] + : httpHost; + } + } + } + + if (proxy['benchmark-url']) { + proxy['test-url'] = proxy['benchmark-url']; + } + + return proxy; + }; + return { name, test, parse }; +} + +function QX_SS() { + const name = 'QX SS Parser'; + const test = (line) => { + return ( + /^shadowsocks\s*=/.test(line.split(',')[0].trim()) && + line.indexOf('ssr-protocol') === -1 + ); + }; + const parse = (line) => { + const parser = getQXParser(); + return parser.parse(line); + }; + return { name, test, parse }; +} + +function QX_SSR() { + const name = 'QX SSR Parser'; + const test = (line) => { + return ( + /^shadowsocks\s*=/.test(line.split(',')[0].trim()) && + line.indexOf('ssr-protocol') !== -1 + ); + }; + const parse = (line) => getQXParser().parse(line); + return { name, test, parse }; +} + +function QX_VMess() { + const name = 'QX VMess Parser'; + const test = (line) => { + return /^vmess\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => getQXParser().parse(line); + return { name, test, parse }; +} + +function QX_Trojan() { + const name = 'QX Trojan Parser'; + const test = (line) => { + return /^trojan\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => getQXParser().parse(line); + return { name, test, parse }; +} + +function QX_Http() { + const name = 'QX HTTP Parser'; + const test = (line) => { + return /^http\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => getQXParser().parse(line); + return { name, test, parse }; +} + +function QX_Socks5() { + const name = 'QX Socks5 Parser'; + const test = (line) => { + return /^socks5\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => getQXParser().parse(line); + return { name, test, parse }; +} + +function Loon_SS() { + const name = 'Loon SS Parser'; + const test = (line) => { + return ( + line.split(',')[0].split('=')[1].trim().toLowerCase() === + 'shadowsocks' + ); + }; + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} + +function Loon_SSR() { + const name = 'Loon SSR Parser'; + const test = (line) => { + return ( + line.split(',')[0].split('=')[1].trim().toLowerCase() === + 'shadowsocksr' + ); + }; + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} + +function Loon_VMess() { + const name = 'Loon VMess Parser'; + const test = (line) => { + // distinguish between surge vmess + return ( + /^.*=\s*vmess/i.test(line.split(',')[0]) && + line.indexOf('username') === -1 + ); + }; + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} + +function Loon_Vless() { + const name = 'Loon Vless Parser'; + const test = (line) => { + return /^.*=\s*vless/i.test(line.split(',')[0]); + }; + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} + +function Loon_Trojan() { + const name = 'Loon Trojan Parser'; + const test = (line) => { + return /^.*=\s*trojan/i.test(line.split(',')[0]); + }; + + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} +function Loon_Hysteria2() { + const name = 'Loon Hysteria2 Parser'; + const test = (line) => { + return /^.*=\s*Hysteria2/i.test(line.split(',')[0]); + }; + + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} + +function Loon_Http() { + const name = 'Loon HTTP Parser'; + const test = (line) => { + return /^.*=\s*http/i.test(line.split(',')[0]); + }; + + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} + +function Loon_WireGuard() { + const name = 'Loon WireGuard Parser'; + const test = (line) => { + return /^.*=\s*wireguard/i.test(line.split(',')[0]); + }; + + const parse = (line) => { + const name = line.match( + /(^.*?)\s*?=\s*?wireguard\s*?,.+?\s*?=\s*?.+?/i, + )?.[1]; + line = line.replace(name, '').replace(/^\s*?=\s*?wireguard\s*/i, ''); + let peers = line.match( + /,\s*?peers\s*?=\s*?\[\s*?\{\s*?(.+?)\s*?\}\s*?\]/i, + )?.[1]; + let serverPort = peers.match( + /(,|^)\s*?endpoint\s*?=\s*?"?(.+?):(\d+)"?\s*?(,|$)/i, + ); + let server = serverPort?.[2]; + let port = parseInt(serverPort?.[3], 10); + let mtu = line.match(/(,|^)\s*?mtu\s*?=\s*?"?(\d+?)"?\s*?(,|$)/i)?.[2]; + if (mtu) { + mtu = parseInt(mtu, 10); + } + let keepalive = line.match( + /(,|^)\s*?keepalive\s*?=\s*?"?(\d+?)"?\s*?(,|$)/i, + )?.[2]; + if (keepalive) { + keepalive = parseInt(keepalive, 10); + } + let reserved = peers.match( + /(,|^)\s*?reserved\s*?=\s*?"?(\[\s*?.+?\s*?\])"?\s*?(,|$)/i, + )?.[2]; + if (reserved) { + reserved = JSON.parse(reserved); + } + + let dns; + let dnsv4 = line.match(/(,|^)\s*?dns\s*?=\s*?"?(.+?)"?\s*?(,|$)/i)?.[2]; + let dnsv6 = line.match( + /(,|^)\s*?dnsv6\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + if (dnsv4 || dnsv6) { + dns = []; + if (dnsv4) { + dns.push(dnsv4); + } + if (dnsv6) { + dns.push(dnsv6); + } + } + let allowedIps = peers + .match(/(,|^)\s*?allowed-ips\s*?=\s*?"(.+?)"\s*?(,|$)/i)?.[2] + ?.split(',') + .map((i) => i.trim()); + let preSharedKey = peers.match( + /(,|^)\s*?preshared-key\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + let ip = line.match( + /(,|^)\s*?interface-ip\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + let ipv6 = line.match( + /(,|^)\s*?interface-ipv6\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + let publicKey = peers.match( + /(,|^)\s*?public-key\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + // https://github.com/MetaCubeX/mihomo/blob/0404e35be8736b695eae018a08debb175c1f96e6/docs/config.yaml#L717 + const proxy = { + type: 'wireguard', + name, + server, + port, + ip, + ipv6, + 'private-key': line.match( + /(,|^)\s*?private-key\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2], + 'public-key': publicKey, + mtu, + keepalive, + reserved, + 'allowed-ips': allowedIps, + 'preshared-key': preSharedKey, + dns, + udp: true, + peers: [ + { + server, + port, + ip, + ipv6, + 'public-key': publicKey, + 'pre-shared-key': preSharedKey, + 'allowed-ips': allowedIps, + reserved, + }, + ], + }; + + proxy; + if (Array.isArray(proxy.dns) && proxy.dns.length > 0) { + proxy['remote-dns-resolve'] = true; + } + return proxy; + }; + return { name, test, parse }; +} + +function Surge_SS() { + const name = 'Surge SS Parser'; + const test = (line) => { + return /^.*=\s*ss/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_VMess() { + const name = 'Surge VMess Parser'; + const test = (line) => { + return ( + /^.*=\s*vmess/.test(line.split(',')[0]) && + line.indexOf('username') !== -1 + ); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_Trojan() { + const name = 'Surge Trojan Parser'; + const test = (line) => { + return /^.*=\s*trojan/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_Http() { + const name = 'Surge HTTP Parser'; + const test = (line) => { + return /^.*=\s*https?/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_Socks5() { + const name = 'Surge Socks5 Parser'; + const test = (line) => { + return /^.*=\s*socks5(-tls)?/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_Snell() { + const name = 'Surge Snell Parser'; + const test = (line) => { + return /^.*=\s*snell/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_Tuic() { + const name = 'Surge Tuic Parser'; + const test = (line) => { + return /^.*=\s*tuic(-v5)?/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} +function Surge_WireGuard() { + const name = 'Surge WireGuard Parser'; + const test = (line) => { + return /^.*=\s*wireguard/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +function Surge_Hysteria2() { + const name = 'Surge Hysteria2 Parser'; + const test = (line) => { + return /^.*=\s*hysteria2/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} + +export default [ + URI_SS(), + URI_SSR(), + URI_VMess(), + URI_VLESS(), + URI_Hysteria2(), + URI_Trojan(), + Clash_All(), + Surge_SS(), + Surge_VMess(), + Surge_Trojan(), + Surge_Http(), + Surge_Snell(), + Surge_Tuic(), + Surge_WireGuard(), + Surge_Hysteria2(), + Surge_Socks5(), + Loon_SS(), + Loon_SSR(), + Loon_VMess(), + Loon_Vless(), + Loon_Hysteria2(), + Loon_Trojan(), + Loon_Http(), + Loon_WireGuard(), + QX_SS(), + QX_SSR(), + QX_VMess(), + QX_Trojan(), + QX_Http(), + QX_Socks5(), +]; diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.js b/backend/src/core/proxy-utils/parsers/peggy/loon.js new file mode 100644 index 000000000..3197b205b --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.js @@ -0,0 +1,192 @@ +import * as peggy from 'peggy'; +const grammars = String.raw` +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } +}} + +// per-parser initializer +{ + const proxy = {}; + const obfs = {}; + const transport = {}; + const $ = {}; + + function handleTransport() { + if (transport.type === "tcp") { /* do nothing */ } + else if (transport.type === "ws") { + proxy.network = "ws"; + $set(proxy, "ws-opts.path", transport.path); + $set(proxy, "ws-opts.headers.Host", transport.host); + } else if (transport.type === "http") { + proxy.network = "http"; + $set(proxy, "http-opts.path", transport.path); + $set(proxy, "http-opts.headers.Host", transport.host); + } + } +} + +start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/hysteria2) { + return proxy; +} + +shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ssr_protocol_param/obfs_ssr/obfs_ssr_param/obfs_host/obfs_uri/fast_open/udp_relay/others)*{ + proxy.type = "ssr"; + // handle ssr obfs + proxy.obfs = obfs.type; +} +shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs_hostv)? (obfs_ss/obfs_host/obfs_uri/fast_open/udp_relay/others)* { + proxy.type = "ss"; + // handle ss obfs + if (obfs.type == "http" || obfs.type === "tls") { + proxy.plugin = "obfs"; + $set(proxy, "plugin-opts.mode", obfs.type); + $set(proxy, "plugin-opts.host", obfs.host); + $set(proxy, "plugin-opts.path", obfs.path); + } +} +vmess = tag equals "vmess"i address method uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/vmess_alterId/fast_open/udp_relay/others)* { + proxy.type = "vmess"; + proxy.cipher = proxy.cipher || "none"; + proxy.alterId = proxy.alterId || 0; + handleTransport(); +} +vless = tag equals "vless"i address uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "vless"; + handleTransport(); +} +trojan = tag equals "trojan"i address password (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "trojan"; + handleTransport(); +} +hysteria2 = tag equals "hysteria2"i address password (tls_host/tls_verification/udp_relay/download_bandwidth/ecn/others)* { + proxy.type = "hysteria2"; +} +https = tag equals "https"i address (username password)? (tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "http"; + proxy.tls = true; +} +http = tag equals "http"i address (username password)? (fast_open/udp_relay/others)* { + proxy.type = "http"; +} + +address = comma server:server comma port:port { + proxy.server = server; + proxy.port = port; +} + +server = ip/domain + +ip = & { + const start = peg$currPos; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + j++; + } + peg$currPos = j; + $.ip = input.substring(start, j).trim(); + return true; +} { return $.ip; } + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } + throw new Error("Invalid domain: " + domain); +} + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } + throw new Error("Invalid port number: " + port); +} + +method = comma cipher:cipher { + proxy.cipher = cipher; +} +cipher = ("aes-128-gcm"/"aes-192-gcm"/"aes-256-gcm"/"aes-128-cfb"/"aes-192-cfb"/"aes-256-cfb"/"aes-128-ctr"/"aes-192-ctr"/"aes-256-ctr"/"rc4-md5"/"xchacha20-ietf-poly1305"/"chacha20-ietf-poly1305"/"chacha20-ietf"/"chacha20-poly1305"/"chacha20"/"none"/"auto"); + +username = & { + let j = peg$currPos; + let start, end; + let first = true; + while (j < input.length) { + if (input[j] === ',') { + if (first) { + start = j + 1; + first = false; + } else { + end = j; + break; + } + } + j++; + } + const match = input.substring(start, end); + if (match.indexOf("=") === -1) { + $.username = match; + peg$currPos = end; + return true; + } +} { proxy.username = $.username; } +password = comma '"' match:[^"]* '"' { proxy.password = match.join(""); } +uuid = comma '"' match:[^"]+ '"' { proxy.uuid = match.join(""); } + +obfs_typev = comma type:("http"/"tls") { obfs.type = type; } +obfs_hostv = comma match:[^,]+ { obfs.host = match.join(""); } + +obfs_ss = comma "obfs-name" equals type:("http"/"tls") { obfs.type = type; } + +obfs_ssr = comma "obfs" equals type:("plain"/"http_simple"/"http_post"/"random_head"/"tls1.2_ticket_auth"/"tls1.2_ticket_fastauth") { obfs.type = type; } +obfs_ssr_param = comma "obfs-param" equals match:$[^,]+ { proxy["obfs-param"] = match; } + +obfs_host = comma "obfs-host" equals host:domain { obfs.host = host; } +obfs_uri = comma "obfs-uri" equals uri:uri { obfs.path = uri; } +uri = $[^,]+ + +transport = comma "transport" equals type:("tcp"/"ws"/"http") { transport.type = type; } +transport_host = comma "host" equals host:domain { transport.host = host; } +transport_path = comma "path" equals path:uri { transport.path = path; } + +ssr_protocol = comma "protocol" equals protocol:("origin"/"auth_sha1_v4"/"auth_aes128_md5"/"auth_aes128_sha1"/"auth_chain_a"/"auth_chain_b") { proxy.protocol = protocol; } +ssr_protocol_param = comma "protocol-param" equals param:$[^=,]+ { proxy["protocol-param"] = param; } + +vmess_alterId = comma "alterId" equals alterId:$[0-9]+ { proxy.alterId = parseInt(alterId); } + +over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } +tls_host = comma "tls-name" equals host:domain { proxy.sni = host; } +tls_verification = comma "skip-cert-verify" equals flag:bool { proxy["skip-cert-verify"] = flag; } + +fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } +udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } + +ecn = comma "ecn" equals flag:bool { proxy.ecn = flag; } +download_bandwidth = comma "download-bandwidth" equals match:[^,]+ { proxy.down = match.join(""); } + +tag = match:[^=,]* { proxy.name = match.join("").trim(); } +comma = _ "," _ +equals = _ "=" _ +_ = [ \r\t]* +bool = b:("true"/"false") { return b === "true" } +others = comma [^=,]+ equals [^=,]+ +`; +let parser; +export default function getParser() { + if (!parser) { + parser = peggy.generate(grammars); + } + return parser; +} diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.peg b/backend/src/core/proxy-utils/parsers/peggy/loon.peg new file mode 100644 index 000000000..145985aa9 --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.peg @@ -0,0 +1,182 @@ +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } +}} + +// per-parser initializer +{ + const proxy = {}; + const obfs = {}; + const transport = {}; + const $ = {}; + + function handleTransport() { + if (transport.type === "tcp") { /* do nothing */ } + else if (transport.type === "ws") { + proxy.network = "ws"; + $set(proxy, "ws-opts.path", transport.path); + $set(proxy, "ws-opts.headers.Host", transport.host); + } else if (transport.type === "http") { + proxy.network = "http"; + $set(proxy, "http-opts.path", transport.path); + $set(proxy, "http-opts.headers.Host", transport.host); + } + } +} + +start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/hysteria2) { + return proxy; +} + +shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ssr_protocol_param/obfs_ssr/obfs_ssr_param/obfs_host/obfs_uri/fast_open/udp_relay/others)*{ + proxy.type = "ssr"; + // handle ssr obfs + proxy.obfs = obfs.type; +} +shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs_hostv)? (obfs_ss/obfs_host/obfs_uri/fast_open/udp_relay/others)* { + proxy.type = "ss"; + // handle ss obfs + if (obfs.type == "http" || obfs.type === "tls") { + proxy.plugin = "obfs"; + $set(proxy, "plugin-opts.mode", obfs.type); + $set(proxy, "plugin-opts.host", obfs.host); + $set(proxy, "plugin-opts.path", obfs.path); + } +} +vmess = tag equals "vmess"i address method uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/vmess_alterId/fast_open/udp_relay/others)* { + proxy.type = "vmess"; + proxy.cipher = proxy.cipher || "none"; + proxy.alterId = proxy.alterId || 0; + handleTransport(); +} +vless = tag equals "vless"i address uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "vless"; + handleTransport(); +} +trojan = tag equals "trojan"i address password (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "trojan"; + handleTransport(); +} +hysteria2 = tag equals "hysteria2"i address password (tls_host/tls_verification/udp_relay/download_bandwidth/ecn/others)* { + proxy.type = "hysteria2"; +} +https = tag equals "https"i address (username password)? (tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "http"; + proxy.tls = true; +} +http = tag equals "http"i address (username password)? (fast_open/udp_relay/others)* { + proxy.type = "http"; +} + +address = comma server:server comma port:port { + proxy.server = server; + proxy.port = port; +} + +server = ip/domain + +ip = & { + const start = peg$currPos; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + j++; + } + peg$currPos = j; + $.ip = input.substring(start, j).trim(); + return true; +} { return $.ip; } + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } + throw new Error("Invalid domain: " + domain); +} + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } + throw new Error("Invalid port number: " + port); +} + +method = comma cipher:cipher { + proxy.cipher = cipher; +} +cipher = ("aes-128-gcm"/"aes-192-gcm"/"aes-256-gcm"/"aes-128-cfb"/"aes-192-cfb"/"aes-256-cfb"/"aes-128-ctr"/"aes-192-ctr"/"aes-256-ctr"/"rc4-md5"/"xchacha20-ietf-poly1305"/"chacha20-ietf-poly1305"/"chacha20-ietf"/"chacha20-poly1305"/"chacha20"/"none"/"auto"); + +username = & { + let j = peg$currPos; + let start, end; + let first = true; + while (j < input.length) { + if (input[j] === ',') { + if (first) { + start = j + 1; + first = false; + } else { + end = j; + break; + } + } + j++; + } + const match = input.substring(start, end); + if (match.indexOf("=") === -1) { + $.username = match; + peg$currPos = end; + return true; + } +} { proxy.username = $.username; } +password = comma '"' match:[^"]* '"' { proxy.password = match.join(""); } +uuid = comma '"' match:[^"]+ '"' { proxy.uuid = match.join(""); } + +obfs_typev = comma type:("http"/"tls") { obfs.type = type; } +obfs_hostv = comma match:[^,]+ { obfs.host = match.join(""); } + +obfs_ss = comma "obfs-name" equals type:("http"/"tls") { obfs.type = type; } + +obfs_ssr = comma "obfs" equals type:("plain"/"http_simple"/"http_post"/"random_head"/"tls1.2_ticket_auth"/"tls1.2_ticket_fastauth") { obfs.type = type; } +obfs_ssr_param = comma "obfs-param" equals match:$[^,]+ { proxy["obfs-param"] = match; } + +obfs_host = comma "obfs-host" equals host:domain { obfs.host = host; } +obfs_uri = comma "obfs-uri" equals uri:uri { obfs.path = uri; } +uri = $[^,]+ + +transport = comma "transport" equals type:("tcp"/"ws"/"http") { transport.type = type; } +transport_host = comma "host" equals host:domain { transport.host = host; } +transport_path = comma "path" equals path:uri { transport.path = path; } + +ssr_protocol = comma "protocol" equals protocol:("origin"/"auth_sha1_v4"/"auth_aes128_md5"/"auth_aes128_sha1"/"auth_chain_a"/"auth_chain_b") { proxy.protocol = protocol; } +ssr_protocol_param = comma "protocol-param" equals param:$[^=,]+ { proxy["protocol-param"] = param; } + +vmess_alterId = comma "alterId" equals alterId:$[0-9]+ { proxy.alterId = parseInt(alterId); } + +over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } +tls_host = comma "tls-name" equals host:domain { proxy.sni = host; } +tls_verification = comma "skip-cert-verify" equals flag:bool { proxy["skip-cert-verify"] = flag; } + +fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } +udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } + +ecn = comma "ecn" equals flag:bool { proxy.ecn = flag; } +download_bandwidth = comma "download-bandwidth" equals match:[^,]+ { proxy.down = match.join(""); } + +tag = match:[^=,]* { proxy.name = match.join("").trim(); } +comma = _ "," _ +equals = _ "=" _ +_ = [ \r\t]* +bool = b:("true"/"false") { return b === "true" } +others = comma [^=,]+ equals [^=,]+ \ No newline at end of file diff --git a/backend/src/core/proxy-utils/parsers/peggy/qx.js b/backend/src/core/proxy-utils/parsers/peggy/qx.js new file mode 100644 index 000000000..9fefcb475 --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/qx.js @@ -0,0 +1,194 @@ +import * as peggy from 'peggy'; +const grammars = String.raw` +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } +}} + +// per-parse initializer +{ + const proxy = {}; + const obfs = {}; + const $ = {}; + + function handleObfs() { + if (obfs.type === "ws" || obfs.type === "wss") { + proxy.network = "ws"; + if (obfs.type === 'wss') { + proxy.tls = true; + } + $set(proxy, "ws-opts.path", obfs.path); + $set(proxy, "ws-opts.headers.Host", obfs.host); + } else if (obfs.type === "over-tls") { + proxy.tls = true; + } else if (obfs.type === "http") { + proxy.network = "http"; + $set(proxy, "http-opts.path", obfs.path); + $set(proxy, "http-opts.headers.Host", obfs.host); + } + } +} + +start = (trojan/shadowsocks/vmess/http/socks5) { + return proxy +} + +trojan = "trojan" equals address + (password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/obfs/obfs_host/obfs_uri/tag/udp_relay/udp_over_tcp/fast_open/server_check_url/others)* { + proxy.type = "trojan"; + handleObfs(); +} + +shadowsocks = "shadowsocks" equals address + (password/method/obfs_ssr/obfs_ss/obfs_host/obfs_uri/ssr_protocol/ssr_protocol_param/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/udp_relay/udp_over_tcp/fast_open/tag/server_check_url/others)* { + if (proxy.protocol) { + proxy.type = "ssr"; + // handle ssr obfs + if (obfs.host) proxy["obfs-param"] = obfs.host; + if (obfs.type) proxy.obfs = obfs.type; + } else { + proxy.type = "ss"; + // handle ss obfs + if (obfs.type == "http" || obfs.type === "tls") { + proxy.plugin = "obfs"; + $set(proxy, "plugin-opts", { + mode: obfs.type + }); + } else if (obfs.type === "ws" || obfs.type === "wss") { + proxy.plugin = "v2ray-plugin"; + $set(proxy, "plugin-opts.mode", "websocket"); + if (obfs.type === "wss") { + $set(proxy, "plugin-opts.tls", true); + } + } else if (obfs.type === 'over-tls') { + throw new Error('ss over-tls is not supported'); + } + if (obfs.type) { + $set(proxy, "plugin-opts.host", obfs.host); + $set(proxy, "plugin-opts.path", obfs.path); + } + } +} + +vmess = "vmess" equals address + (uuid/method/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/obfs/obfs_host/obfs_uri/udp_relay/udp_over_tcp/fast_open/aead/server_check_url/others)* { + proxy.type = "vmess"; + proxy.cipher = proxy.cipher || "none"; + if (proxy.aead) { + proxy.alterId = 0; + } else { + proxy.alterId = proxy.alterId || 0; + } + handleObfs(); +} + +http = "http" equals address + (username/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)*{ + proxy.type = "http"; +} + +socks5 = "socks5" equals address + (username/password/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)* { + proxy.type = "socks5"; +} + +address = server:server ":" port:port { + proxy.server = server; + proxy.port = port; +} +server = ip/domain + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } +} + +ip = & { + const start = peg$currPos; + let end; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + if (input[j] === ":") end = j; + j++; + } + peg$currPos = end || j; + $.ip = input.substring(start, end).trim(); + return true; +} { return $.ip; } + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } +} + +username = comma "username" equals username:[^=,]+ { proxy.username = username.join("").trim(); } +password = comma "password" equals password:[^=,]+ { proxy.password = password.join("").trim(); } +uuid = comma "password" equals uuid:[^=,]+ { proxy.uuid = uuid.join("").trim(); } + +method = comma "method" equals cipher:cipher { + proxy.cipher = cipher; +}; +cipher = ("aes-128-gcm"/"aes-192-gcm"/"aes-256-gcm"/"aes-128-cfb"/"aes-192-cfb"/"aes-256-cfb"/"aes-128-ctr"/"aes-192-ctr"/"aes-256-ctr"/"rc4-md5"/"xchacha20-ietf-poly1305"/"chacha20-ietf-poly1305"/"chacha20-ietf"/"chacha20-poly1305"/"chacha20"/"none"); +aead = comma "aead" equals flag:bool { proxy.aead = flag; } + +udp_relay = comma "udp-relay" equals flag:bool { proxy.udp = flag; } +udp_over_tcp = comma "udp-over-tcp" equals flag:bool { throw new Error("UDP over TCP is not supported"); } +fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } + +over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } +tls_host = comma "tls-host" equals sni:domain { proxy.sni = sni; } +tls_verification = comma "tls-verification" equals flag:bool { + proxy["skip-cert-verify"] = !flag; +} +tls_fingerprint = comma "tls-cert-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); } +tls_pubkey_sha256 = comma "tls-pubkey-sha256" equals param:$[^=,]+ { proxy["tls-pubkey-sha256"] = param; } +tls_alpn = comma "tls-alpn" equals param:$[^=,]+ { proxy["tls-alpn"] = param; } +tls_no_session_ticket = comma "tls-no-session-ticket" equals flag:bool { + proxy["tls-no-session-ticket"] = flag; +} +tls_no_session_reuse = comma "tls-no-session-reuse" equals flag:bool { + proxy["tls-no-session-reuse"] = flag; +} + +obfs_ss = comma "obfs" equals type:("http"/"tls"/"wss"/"ws"/"over-tls") { obfs.type = type; return type; } +obfs_ssr = comma "obfs" equals type:("plain"/"http_simple"/"http_post"/"random_head"/"tls1.2_ticket_auth"/"tls1.2_ticket_fastauth") { obfs.type = type; return type; } +obfs = comma "obfs" equals type:("wss"/"ws"/"over-tls"/"http") { obfs.type = type; return type; }; + +obfs_host = comma "obfs-host" equals host:domain { obfs.host = host; } +obfs_uri = comma "obfs-uri" equals uri:uri { obfs.path = uri; } + +ssr_protocol = comma "ssr-protocol" equals protocol:("origin"/"auth_sha1_v4"/"auth_aes128_md5"/"auth_aes128_sha1"/"auth_chain_a"/"auth_chain_b") { proxy.protocol = protocol; return protocol; } +ssr_protocol_param = comma "ssr-protocol-param" equals param:$[^=,]+ { proxy["protocol-param"] = param; } + +server_check_url = comma "server_check_url" equals param:$[^=,]+ { proxy["test-url"] = param; } + +uri = $[^,]+ + +tag = comma "tag" equals tag:[^=,]+ { proxy.name = tag.join(""); } +others = comma [^=,]+ equals [^=,]+ +comma = _ "," _ +equals = _ "=" _ +_ = [ \r\t]* +bool = b:("true"/"false") { return b === "true" } +`; +let parser; +export default function getParser() { + if (!parser) { + parser = peggy.generate(grammars); + } + return parser; +} diff --git a/backend/src/core/proxy-utils/parsers/peggy/qx.peg b/backend/src/core/proxy-utils/parsers/peggy/qx.peg new file mode 100644 index 000000000..f2ae8cec1 --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/qx.peg @@ -0,0 +1,184 @@ +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } +}} + +// per-parse initializer +{ + const proxy = {}; + const obfs = {}; + const $ = {}; + + function handleObfs() { + if (obfs.type === "ws" || obfs.type === "wss") { + proxy.network = "ws"; + if (obfs.type === 'wss') { + proxy.tls = true; + } + $set(proxy, "ws-opts.path", obfs.path); + $set(proxy, "ws-opts.headers.Host", obfs.host); + } else if (obfs.type === "over-tls") { + proxy.tls = true; + } else if (obfs.type === "http") { + proxy.network = "http"; + $set(proxy, "http-opts.path", obfs.path); + $set(proxy, "http-opts.headers.Host", obfs.host); + } + } +} + +start = (trojan/shadowsocks/vmess/http/socks5) { + return proxy +} + +trojan = "trojan" equals address + (password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/obfs/obfs_host/obfs_uri/tag/udp_relay/udp_over_tcp/fast_open/server_check_url/others)* { + proxy.type = "trojan"; + handleObfs(); +} + +shadowsocks = "shadowsocks" equals address + (password/method/obfs_ssr/obfs_ss/obfs_host/obfs_uri/ssr_protocol/ssr_protocol_param/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/udp_relay/udp_over_tcp/fast_open/tag/server_check_url/others)* { + if (proxy.protocol) { + proxy.type = "ssr"; + // handle ssr obfs + if (obfs.host) proxy["obfs-param"] = obfs.host; + if (obfs.type) proxy.obfs = obfs.type; + } else { + proxy.type = "ss"; + // handle ss obfs + if (obfs.type == "http" || obfs.type === "tls") { + proxy.plugin = "obfs"; + $set(proxy, "plugin-opts", { + mode: obfs.type + }); + } else if (obfs.type === "ws" || obfs.type === "wss") { + proxy.plugin = "v2ray-plugin"; + $set(proxy, "plugin-opts.mode", "websocket"); + if (obfs.type === "wss") { + $set(proxy, "plugin-opts.tls", true); + } + } else if (obfs.type === 'over-tls') { + throw new Error('ss over-tls is not supported'); + } + if (obfs.type) { + $set(proxy, "plugin-opts.host", obfs.host); + $set(proxy, "plugin-opts.path", obfs.path); + } + } +} + +vmess = "vmess" equals address + (uuid/method/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/obfs/obfs_host/obfs_uri/udp_relay/udp_over_tcp/fast_open/aead/server_check_url/others)* { + proxy.type = "vmess"; + proxy.cipher = proxy.cipher || "none"; + if (proxy.aead) { + proxy.alterId = 0; + } else { + proxy.alterId = proxy.alterId || 0; + } + handleObfs(); +} + +http = "http" equals address + (username/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)*{ + proxy.type = "http"; +} + +socks5 = "socks5" equals address + (username/password/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)* { + proxy.type = "socks5"; +} + +address = server:server ":" port:port { + proxy.server = server; + proxy.port = port; +} +server = ip/domain + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } +} + +ip = & { + const start = peg$currPos; + let end; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + if (input[j] === ":") end = j; + j++; + } + peg$currPos = end || j; + $.ip = input.substring(start, end).trim(); + return true; +} { return $.ip; } + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } +} + +username = comma "username" equals username:[^=,]+ { proxy.username = username.join("").trim(); } +password = comma "password" equals password:[^=,]+ { proxy.password = password.join("").trim(); } +uuid = comma "password" equals uuid:[^=,]+ { proxy.uuid = uuid.join("").trim(); } + +method = comma "method" equals cipher:cipher { + proxy.cipher = cipher; +}; +cipher = ("aes-128-gcm"/"aes-192-gcm"/"aes-256-gcm"/"aes-128-cfb"/"aes-192-cfb"/"aes-256-cfb"/"aes-128-ctr"/"aes-192-ctr"/"aes-256-ctr"/"rc4-md5"/"xchacha20-ietf-poly1305"/"chacha20-ietf-poly1305"/"chacha20-ietf"/"chacha20-poly1305"/"chacha20"/"none"); +aead = comma "aead" equals flag:bool { proxy.aead = flag; } + +udp_relay = comma "udp-relay" equals flag:bool { proxy.udp = flag; } +udp_over_tcp = comma "udp-over-tcp" equals flag:bool { throw new Error("UDP over TCP is not supported"); } +fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } + +over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } +tls_host = comma "tls-host" equals sni:domain { proxy.sni = sni; } +tls_verification = comma "tls-verification" equals flag:bool { + proxy["skip-cert-verify"] = !flag; +} +tls_fingerprint = comma "tls-cert-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); } +tls_pubkey_sha256 = comma "tls-pubkey-sha256" equals param:$[^=,]+ { proxy["tls-pubkey-sha256"] = param; } +tls_alpn = comma "tls-alpn" equals param:$[^=,]+ { proxy["tls-alpn"] = param; } +tls_no_session_ticket = comma "tls-no-session-ticket" equals flag:bool { + proxy["tls-no-session-ticket"] = flag; +} +tls_no_session_reuse = comma "tls-no-session-reuse" equals flag:bool { + proxy["tls-no-session-reuse"] = flag; +} + +obfs_ss = comma "obfs" equals type:("http"/"tls"/"wss"/"ws"/"over-tls") { obfs.type = type; return type; } +obfs_ssr = comma "obfs" equals type:("plain"/"http_simple"/"http_post"/"random_head"/"tls1.2_ticket_auth"/"tls1.2_ticket_fastauth") { obfs.type = type; return type; } +obfs = comma "obfs" equals type:("wss"/"ws"/"over-tls"/"http") { obfs.type = type; return type; }; + +obfs_host = comma "obfs-host" equals host:domain { obfs.host = host; } +obfs_uri = comma "obfs-uri" equals uri:uri { obfs.path = uri; } + +ssr_protocol = comma "ssr-protocol" equals protocol:("origin"/"auth_sha1_v4"/"auth_aes128_md5"/"auth_aes128_sha1"/"auth_chain_a"/"auth_chain_b") { proxy.protocol = protocol; return protocol; } +ssr_protocol_param = comma "ssr-protocol-param" equals param:$[^=,]+ { proxy["protocol-param"] = param; } + +server_check_url = comma "server_check_url" equals param:$[^=,]+ { proxy["test-url"] = param; } + +uri = $[^,]+ + +tag = comma "tag" equals tag:[^=,]+ { proxy.name = tag.join(""); } +others = comma [^=,]+ equals [^=,]+ +comma = _ "," _ +equals = _ "=" _ +_ = [ \r\t]* +bool = b:("true"/"false") { return b === "true" } \ No newline at end of file diff --git a/backend/src/core/proxy-utils/parsers/peggy/surge.js b/backend/src/core/proxy-utils/parsers/peggy/surge.js new file mode 100644 index 000000000..33aef9146 --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/surge.js @@ -0,0 +1,225 @@ +import * as peggy from 'peggy'; +const grammars = String.raw` +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } +}} + +// per-parser initializer +{ + const proxy = {}; + const obfs = {}; + const $ = {}; + + function handleWebsocket() { + if (obfs.type === "ws") { + proxy.network = "ws"; + $set(proxy, "ws-opts.path", obfs.path); + $set(proxy, "ws-opts.headers", obfs['ws-headers']); + if (proxy['ws-opts'] && proxy['ws-opts']['headers'] && proxy['ws-opts']['headers'].Host) { + proxy['ws-opts']['headers'].Host = proxy['ws-opts']['headers'].Host.replace(/^"(.*)"$/, '$1') + } + } + } +} + +start = (shadowsocks/vmess/trojan/https/http/snell/socks5/socks5_tls/tuic/tuic_v5/wireguard/hysteria2) { + return proxy; +} + +shadowsocks = tag equals "ss" address (method/passwordk/obfs/obfs_host/obfs_uri/ip_version/no_error_alert/fast_open/udp_relay/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "ss"; + // handle obfs + if (obfs.type == "http" || obfs.type === "tls") { + proxy.plugin = "obfs"; + $set(proxy, "plugin-opts.mode", obfs.type); + $set(proxy, "plugin-opts.host", obfs.host); + $set(proxy, "plugin-opts.path", obfs.path); + } +} +vmess = tag equals "vmess" address (vmess_uuid/vmess_aead/ws/ws_path/ws_headers/method/ip_version/no_error_alert/tls/sni/tls_fingerprint/tls_verification/fast_open/udp_relay/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "vmess"; + proxy.cipher = proxy.cipher || "none"; + if (proxy.aead) { + proxy.alterId = 0; + } else { + proxy.alterId = proxy.alterId || 0; + } + handleWebsocket(); +} +trojan = tag equals "trojan" address (passwordk/ws/ws_path/ws_headers/tls/sni/tls_fingerprint/tls_verification/ip_version/no_error_alert/fast_open/udp_relay/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "trojan"; + handleWebsocket(); +} +https = tag equals "https" address (username password)? (usernamek passwordk)? (sni/tls_fingerprint/tls_verification/ip_version/no_error_alert/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "http"; + proxy.tls = true; +} +http = tag equals "http" address (username password)? (usernamek passwordk)? (ip_version/no_error_alert/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "http"; +} +snell = tag equals "snell" address (snell_version/snell_psk/obfs/obfs_host/obfs_uri/ip_version/no_error_alert/fast_open/udp_relay/reuse/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "snell"; + // handle obfs + if (obfs.type == "http" || obfs.type === "tls") { + $set(proxy, "obfs-opts.mode", obfs.type); + $set(proxy, "obfs-opts.host", obfs.host); + $set(proxy, "obfs-opts.path", obfs.path); + } +} +tuic = tag equals "tuic" address (alpn/token/ip_version/no_error_alert/tls_verification/sni/fast_open/tfo/ecn/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "tuic"; +} +tuic_v5 = tag equals "tuic-v5" address (alpn/passwordk/uuidk/ip_version/no_error_alert/tls_verification/sni/fast_open/tfo/ecn/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "tuic"; + proxy.version = 5; +} +wireguard = tag equals "wireguard" (section_name/no_error_alert/ip_version/underlying_proxy/test_url/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "wireguard-surge"; +} +hysteria2 = tag equals "hysteria2" address (no_error_alert/ip_version/underlying_proxy/test_url/sni/tls_verification/passwordk/tls_fingerprint/download_bandwidth/ecn/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "hysteria2"; +} +socks5 = tag equals "socks5" address (username password)? (usernamek passwordk)? (no_error_alert/ip_version/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "socks5"; +} +socks5_tls = tag equals "socks5-tls" address (username password)? (usernamek passwordk)? (no_error_alert/ip_version/sni/tls_fingerprint/tls_verification/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "socks5"; + proxy.tls = true; +} + +address = comma server:server comma port:port { + proxy.server = server; + proxy.port = port; +} + +server = ip/domain + +ip = & { + const start = peg$currPos; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + j++; + } + peg$currPos = j; + $.ip = input.substring(start, j).trim(); + return true; +} { return $.ip; } + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } +} + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } +} + +username = & { + let j = peg$currPos; + let start, end; + let first = true; + while (j < input.length) { + if (input[j] === ',') { + if (first) { + start = j + 1; + first = false; + } else { + end = j; + break; + } + } + j++; + } + const match = input.substring(start, end); + if (match.indexOf("=") === -1) { + $.username = match; + peg$currPos = end; + return true; + } +} { proxy.username = $.username; } +password = comma match:[^,]+ { proxy.password = match.join(""); } + +tls = comma "tls" equals flag:bool { proxy.tls = flag; } +sni = comma "sni" equals sni:domain { proxy.sni = sni; } +tls_verification = comma "skip-cert-verify" equals flag:bool { proxy["skip-cert-verify"] = flag; } +tls_fingerprint = comma "server-cert-fingerprint-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); } + +snell_psk = comma "psk" equals match:[^,]+ { proxy.psk = match.join(""); } +snell_version = comma "version" equals match:$[0-9]+ { proxy.version = parseInt(match.trim()); } + +usernamek = comma "username" equals match:[^,]+ { proxy.username = match.join(""); } +passwordk = comma "password" equals match:[^,]+ { proxy.password = match.join(""); } +vmess_uuid = comma "username" equals match:[^,]+ { proxy.uuid = match.join(""); } +vmess_aead = comma "vmess-aead" equals flag:bool { proxy.aead = flag; } + +method = comma "encrypt-method" equals cipher:cipher { + proxy.cipher = cipher; +} +cipher = ("aes-128-gcm"/"aes-192-gcm"/"aes-256-gcm"/"aes-128-cfb"/"aes-192-cfb"/"aes-256-cfb"/"aes-128-ctr"/"aes-192-ctr"/"aes-256-ctr"/"rc4-md5"/"xchacha20-ietf-poly1305"/"chacha20-ietf-poly1305"/"chacha20-ietf"/"chacha20-poly1305"/"chacha20"/"none"); + +ws = comma "ws" equals flag:bool { obfs.type = "ws"; } +ws_headers = comma "ws-headers" equals headers:$[^,]+ { + const pairs = headers.split("|"); + const result = {}; + pairs.forEach(pair => { + const [key, value] = pair.trim().split(":"); + result[key.trim()] = value.trim(); + }) + obfs["ws-headers"] = result; +} +ws_path = comma "ws-path" equals path:uri { obfs.path = path; } + +obfs = comma "obfs" equals type:("http"/"tls") { obfs.type = type; } +obfs_host = comma "obfs-host" equals host:domain { obfs.host = host; }; +obfs_uri = comma "obfs-uri" equals path:uri { obfs.path = path } +uri = $[^,]+ + +udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } +fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } +reuse = comma "reuse" equals flag:bool { proxy.reuse = flag; } +ecn = comma "ecn" equals flag:bool { proxy.ecn = flag; } +tfo = comma "tfo" equals flag:bool { proxy.tfo = flag; } +ip_version = comma "ip-version" equals match:[^,]+ { proxy["ip-version"] = match.join(""); } +section_name = comma "section-name" equals match:[^,]+ { proxy["section-name"] = match.join(""); } +no_error_alert = comma "no-error-alert" equals match:[^,]+ { proxy["no-error-alert"] = match.join(""); } +underlying_proxy = comma "underlying-proxy" equals match:[^,]+ { proxy["underlying-proxy"] = match.join(""); } +download_bandwidth = comma "download-bandwidth" equals match:[^,]+ { proxy.down = match.join(""); } +test_url = comma "test-url" equals match:[^,]+ { proxy["test-url"] = match.join(""); } +block_quic = comma "block-quic" equals match:[^,]+ { proxy["block-quic"] = match.join(""); } +shadow_tls_version = comma "shadow-tls-version" equals match:$[0-9]+ { proxy["shadow-tls-version"] = parseInt(match.trim()); } +shadow_tls_sni = comma "shadow-tls-sni" equals match:[^,]+ { proxy["shadow-tls-sni"] = match.join(""); } +shadow_tls_password = comma "shadow-tls-password" equals match:[^,]+ { proxy["shadow-tls-password"] = match.join(""); } +token = comma "token" equals match:[^,]+ { proxy.token = match.join(""); } +alpn = comma "alpn" equals match:[^,]+ { proxy.alpn = match.join(""); } +uuidk = comma "uuid" equals match:[^,]+ { proxy.uuid = match.join(""); } + +tag = match:[^=,]* { proxy.name = match.join("").trim(); } +comma = _ "," _ +equals = _ "=" _ +_ = [ \r\t]* +bool = b:("true"/"false") { return b === "true" } +others = comma [^=,]+ equals [^=,]+ +`; +let parser; +export default function getParser() { + if (!parser) { + parser = peggy.generate(grammars); + } + return parser; +} diff --git a/backend/src/core/proxy-utils/parsers/peggy/surge.peg b/backend/src/core/proxy-utils/parsers/peggy/surge.peg new file mode 100644 index 000000000..b79ba0753 --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/surge.peg @@ -0,0 +1,215 @@ +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } +}} + +// per-parser initializer +{ + const proxy = {}; + const obfs = {}; + const $ = {}; + + function handleWebsocket() { + if (obfs.type === "ws") { + proxy.network = "ws"; + $set(proxy, "ws-opts.path", obfs.path); + $set(proxy, "ws-opts.headers", obfs['ws-headers']); + if (proxy['ws-opts'] && proxy['ws-opts']['headers'] && proxy['ws-opts']['headers'].Host) { + proxy['ws-opts']['headers'].Host = proxy['ws-opts']['headers'].Host.replace(/^"(.*)"$/, '$1') + } + } + } +} + +start = (shadowsocks/vmess/trojan/https/http/snell/socks5/socks5_tls/tuic/tuic_v5/wireguard/hysteria2) { + return proxy; +} + +shadowsocks = tag equals "ss" address (method/passwordk/obfs/obfs_host/obfs_uri/ip_version/no_error_alert/fast_open/udp_relay/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "ss"; + // handle obfs + if (obfs.type == "http" || obfs.type === "tls") { + proxy.plugin = "obfs"; + $set(proxy, "plugin-opts.mode", obfs.type); + $set(proxy, "plugin-opts.host", obfs.host); + $set(proxy, "plugin-opts.path", obfs.path); + } +} +vmess = tag equals "vmess" address (vmess_uuid/vmess_aead/ws/ws_path/ws_headers/method/ip_version/no_error_alert/tls/sni/tls_fingerprint/tls_verification/fast_open/udp_relay/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "vmess"; + proxy.cipher = proxy.cipher || "none"; + if (proxy.aead) { + proxy.alterId = 0; + } else { + proxy.alterId = proxy.alterId || 0; + } + handleWebsocket(); +} +trojan = tag equals "trojan" address (passwordk/ws/ws_path/ws_headers/tls/sni/tls_fingerprint/tls_verification/ip_version/no_error_alert/fast_open/udp_relay/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "trojan"; + handleWebsocket(); +} +https = tag equals "https" address (username password)? (usernamek passwordk)? (sni/tls_fingerprint/tls_verification/ip_version/no_error_alert/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "http"; + proxy.tls = true; +} +http = tag equals "http" address (username password)? (usernamek passwordk)? (ip_version/no_error_alert/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "http"; +} +snell = tag equals "snell" address (snell_version/snell_psk/obfs/obfs_host/obfs_uri/ip_version/no_error_alert/fast_open/udp_relay/reuse/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "snell"; + // handle obfs + if (obfs.type == "http" || obfs.type === "tls") { + $set(proxy, "obfs-opts.mode", obfs.type); + $set(proxy, "obfs-opts.host", obfs.host); + $set(proxy, "obfs-opts.path", obfs.path); + } +} +tuic = tag equals "tuic" address (alpn/token/ip_version/no_error_alert/tls_verification/sni/fast_open/tfo/ecn/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "tuic"; +} +tuic_v5 = tag equals "tuic-v5" address (alpn/passwordk/uuidk/ip_version/no_error_alert/tls_verification/sni/fast_open/tfo/ecn/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "tuic"; + proxy.version = 5; +} +wireguard = tag equals "wireguard" (section_name/no_error_alert/ip_version/underlying_proxy/test_url/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "wireguard-surge"; +} +hysteria2 = tag equals "hysteria2" address (no_error_alert/ip_version/underlying_proxy/test_url/sni/tls_verification/passwordk/tls_fingerprint/download_bandwidth/ecn/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "hysteria2"; +} +socks5 = tag equals "socks5" address (username password)? (usernamek passwordk)? (no_error_alert/ip_version/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "socks5"; +} +socks5_tls = tag equals "socks5-tls" address (username password)? (usernamek passwordk)? (no_error_alert/ip_version/sni/tls_fingerprint/tls_verification/fast_open/shadow_tls_version/shadow_tls_sni/shadow_tls_password/block_quic/others)* { + proxy.type = "socks5"; + proxy.tls = true; +} + +address = comma server:server comma port:port { + proxy.server = server; + proxy.port = port; +} + +server = ip/domain + +ip = & { + const start = peg$currPos; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + j++; + } + peg$currPos = j; + $.ip = input.substring(start, j).trim(); + return true; +} { return $.ip; } + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } +} + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } +} + +username = & { + let j = peg$currPos; + let start, end; + let first = true; + while (j < input.length) { + if (input[j] === ',') { + if (first) { + start = j + 1; + first = false; + } else { + end = j; + break; + } + } + j++; + } + const match = input.substring(start, end); + if (match.indexOf("=") === -1) { + $.username = match; + peg$currPos = end; + return true; + } +} { proxy.username = $.username; } +password = comma match:[^,]+ { proxy.password = match.join(""); } + +tls = comma "tls" equals flag:bool { proxy.tls = flag; } +sni = comma "sni" equals sni:domain { proxy.sni = sni; } +tls_verification = comma "skip-cert-verify" equals flag:bool { proxy["skip-cert-verify"] = flag; } +tls_fingerprint = comma "server-cert-fingerprint-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); } + +snell_psk = comma "psk" equals match:[^,]+ { proxy.psk = match.join(""); } +snell_version = comma "version" equals match:$[0-9]+ { proxy.version = parseInt(match.trim()); } + +usernamek = comma "username" equals match:[^,]+ { proxy.username = match.join(""); } +passwordk = comma "password" equals match:[^,]+ { proxy.password = match.join(""); } +vmess_uuid = comma "username" equals match:[^,]+ { proxy.uuid = match.join(""); } +vmess_aead = comma "vmess-aead" equals flag:bool { proxy.aead = flag; } + +method = comma "encrypt-method" equals cipher:cipher { + proxy.cipher = cipher; +} +cipher = ("aes-128-gcm"/"aes-192-gcm"/"aes-256-gcm"/"aes-128-cfb"/"aes-192-cfb"/"aes-256-cfb"/"aes-128-ctr"/"aes-192-ctr"/"aes-256-ctr"/"rc4-md5"/"xchacha20-ietf-poly1305"/"chacha20-ietf-poly1305"/"chacha20-ietf"/"chacha20-poly1305"/"chacha20"/"none"); + +ws = comma "ws" equals flag:bool { obfs.type = "ws"; } +ws_headers = comma "ws-headers" equals headers:$[^,]+ { + const pairs = headers.split("|"); + const result = {}; + pairs.forEach(pair => { + const [key, value] = pair.trim().split(":"); + result[key.trim()] = value.trim(); + }) + obfs["ws-headers"] = result; +} +ws_path = comma "ws-path" equals path:uri { obfs.path = path; } + +obfs = comma "obfs" equals type:("http"/"tls") { obfs.type = type; } +obfs_host = comma "obfs-host" equals host:domain { obfs.host = host; }; +obfs_uri = comma "obfs-uri" equals path:uri { obfs.path = path } +uri = $[^,]+ + +udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } +fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } +reuse = comma "reuse" equals flag:bool { proxy.reuse = flag; } +ecn = comma "ecn" equals flag:bool { proxy.ecn = flag; } +tfo = comma "tfo" equals flag:bool { proxy.tfo = flag; } +ip_version = comma "ip-version" equals match:[^,]+ { proxy["ip-version"] = match.join(""); } +section_name = comma "section-name" equals match:[^,]+ { proxy["section-name"] = match.join(""); } +no_error_alert = comma "no-error-alert" equals match:[^,]+ { proxy["no-error-alert"] = match.join(""); } +underlying_proxy = comma "underlying-proxy" equals match:[^,]+ { proxy["underlying-proxy"] = match.join(""); } +download_bandwidth = comma "download-bandwidth" equals match:[^,]+ { proxy.down = match.join(""); } +test_url = comma "test-url" equals match:[^,]+ { proxy["test-url"] = match.join(""); } +block_quic = comma "block-quic" equals match:[^,]+ { proxy["block-quic"] = match.join(""); } +shadow_tls_version = comma "shadow-tls-version" equals match:$[0-9]+ { proxy["shadow-tls-version"] = parseInt(match.trim()); } +shadow_tls_sni = comma "shadow-tls-sni" equals match:[^,]+ { proxy["shadow-tls-sni"] = match.join(""); } +shadow_tls_password = comma "shadow-tls-password" equals match:[^,]+ { proxy["shadow-tls-password"] = match.join(""); } +token = comma "token" equals match:[^,]+ { proxy.token = match.join(""); } +alpn = comma "alpn" equals match:[^,]+ { proxy.alpn = match.join(""); } +uuidk = comma "uuid" equals match:[^,]+ { proxy.uuid = match.join(""); } + +tag = match:[^=,]* { proxy.name = match.join("").trim(); } +comma = _ "," _ +equals = _ "=" _ +_ = [ \r\t]* +bool = b:("true"/"false") { return b === "true" } +others = comma [^=,]+ equals [^=,]+ \ No newline at end of file diff --git a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js new file mode 100644 index 000000000..a7fd3042b --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js @@ -0,0 +1,132 @@ +import * as peggy from 'peggy'; +const grammars = String.raw` +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } + + function toBool(str) { + if (typeof str === 'undefined' || str === null) return undefined; + return /(TRUE)|1/i.test(str); + } +}} + +{ + const proxy = {}; + const obfs = {}; + const $ = {}; + const params = {}; +} + +start = (trojan) { + return proxy +} + +trojan = "trojan://" password:password "@" server:server ":" port:port params? name:name?{ + proxy.type = "trojan"; + proxy.password = password; + proxy.server = server; + proxy.port = port; + proxy.name = name; + + // name may be empty + if (!proxy.name) { + proxy.name = server + ":" + port; + } +}; + +password = match:$[^@]+ { + return decodeURIComponent(match); +}; + +server = ip/domain; + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } +} + +ip = & { + const start = peg$currPos; + let end; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + if (input[j] === ":") end = j; + j++; + } + peg$currPos = end || j; + $.ip = input.substring(start, end).trim(); + return true; +} { return $.ip; } + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } else { + throw new Error("Invalid port: " + port); + } +} + +params = "/"? "?" head:param tail:("&"@param)* { + proxy["skip-cert-verify"] = toBool(params["allowInsecure"]); + proxy.sni = params["sni"] || params["peer"]; + + if (toBool(params["ws"])) { + proxy.network = "ws"; + $set(proxy, "ws-opts.path", params["wspath"]); + } + + if (params["type"]) { + proxy.network = params["type"] + if (['grpc'].includes(proxy.network)) { + proxy[proxy.network + '-opts'] = { + 'grpc-service-name': params["serviceName"], + '_grpc-type': params["mode"], + }; + } else { + if (params["path"]) { + $set(proxy, proxy.network+"-opts.path", decodeURIComponent(params["path"])); + } + if (params["host"]) { + $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); + } + } + } + + proxy.udp = toBool(params["udp"]); + proxy.tfo = toBool(params["tfo"]); +} + +param = kv/single; + +kv = key:$[a-z]i+ "=" value:$[^]i* { + params[key] = value; +} + +single = key:$[a-z]i+ { + params[key] = true; +}; + +name = "#" + match:$.* { + return decodeURIComponent(match); +} +`; +let parser; +export default function getParser() { + if (!parser) { + parser = peggy.generate(grammars); + } + return parser; +} diff --git a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg new file mode 100644 index 000000000..5cb0b7ece --- /dev/null +++ b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg @@ -0,0 +1,122 @@ +// global initializer +{{ + function $set(obj, path, value) { + if (Object(obj) !== obj) return obj; + if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; + path + .slice(0, -1) + .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ + path[path.length - 1] + ] = value; + return obj; + } + + function toBool(str) { + if (typeof str === 'undefined' || str === null) return undefined; + return /(TRUE)|1/i.test(str); + } +}} + +{ + const proxy = {}; + const obfs = {}; + const $ = {}; + const params = {}; +} + +start = (trojan) { + return proxy +} + +trojan = "trojan://" password:password "@" server:server ":" port:port params? name:name?{ + proxy.type = "trojan"; + proxy.password = password; + proxy.server = server; + proxy.port = port; + proxy.name = name; + + // name may be empty + if (!proxy.name) { + proxy.name = server + ":" + port; + } +}; + +password = match:$[^@]+ { + return decodeURIComponent(match); +}; + +server = ip/domain; + +domain = match:[0-9a-zA-z-_.]+ { + const domain = match.join(""); + if (/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/.test(domain)) { + return domain; + } +} + +ip = & { + const start = peg$currPos; + let end; + let j = start; + while (j < input.length) { + if (input[j] === ",") break; + if (input[j] === ":") end = j; + j++; + } + peg$currPos = end || j; + $.ip = input.substring(start, end).trim(); + return true; +} { return $.ip; } + +port = digits:[0-9]+ { + const port = parseInt(digits.join(""), 10); + if (port >= 0 && port <= 65535) { + return port; + } else { + throw new Error("Invalid port: " + port); + } +} + +params = "/"? "?" head:param tail:("&"@param)* { + proxy["skip-cert-verify"] = toBool(params["allowInsecure"]); + proxy.sni = params["sni"] || params["peer"]; + + if (toBool(params["ws"])) { + proxy.network = "ws"; + $set(proxy, "ws-opts.path", params["wspath"]); + } + + if (params["type"]) { + proxy.network = params["type"] + if (['grpc'].includes(proxy.network)) { + proxy[proxy.network + '-opts'] = { + 'grpc-service-name': params["serviceName"], + '_grpc-type': params["mode"], + }; + } else { + if (params["path"]) { + $set(proxy, proxy.network+"-opts.path", decodeURIComponent(params["path"])); + } + if (params["host"]) { + $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); + } + } + } + + proxy.udp = toBool(params["udp"]); + proxy.tfo = toBool(params["tfo"]); +} + +param = kv/single; + +kv = key:$[a-z]i+ "=" value:$[^]i* { + params[key] = value; +} + +single = key:$[a-z]i+ { + params[key] = true; +}; + +name = "#" + match:$.* { + return decodeURIComponent(match); +} \ No newline at end of file diff --git a/backend/src/core/proxy-utils/preprocessors/index.js b/backend/src/core/proxy-utils/preprocessors/index.js new file mode 100644 index 000000000..1c57cf0d6 --- /dev/null +++ b/backend/src/core/proxy-utils/preprocessors/index.js @@ -0,0 +1,113 @@ +import { safeLoad } from 'static-js-yaml'; +import { Base64 } from 'js-base64'; + +function HTML() { + const name = 'HTML'; + const test = (raw) => /^/.test(raw); + // simply discard HTML + const parse = () => ''; + return { name, test, parse }; +} + +function Base64Encoded() { + const name = 'Base64 Pre-processor'; + + const keys = [ + 'dm1lc3M', // vmess + 'c3NyOi8v', // ssr:// + 'dHJvamFu', // trojan + 'c3M6Ly', // ss:/ + 'c3NkOi8v', // ssd:// + 'c2hhZG93', // shadow + 'aHR0c', // htt + 'dmxlc3M=', // vless + 'aHlzdGVyaWEy', // hysteria2 + ]; + + const test = function (raw) { + return ( + !/^\w+:\/\/\w+/im.test(raw) && + keys.some((k) => raw.indexOf(k) !== -1) + ); + }; + const parse = function (raw) { + raw = Base64.decode(raw); + return raw; + }; + return { name, test, parse }; +} + +function Clash() { + const name = 'Clash Pre-processor'; + const test = function (raw) { + if (!/proxies/.test(raw)) return false; + const content = safeLoad(raw); + return content.proxies && Array.isArray(content.proxies); + }; + const parse = function (raw) { + // Clash YAML format + const proxies = safeLoad(raw).proxies; + return proxies.map((p) => JSON.stringify(p)).join('\n'); + }; + return { name, test, parse }; +} + +function SSD() { + const name = 'SSD Pre-processor'; + const test = function (raw) { + return raw.indexOf('ssd://') === 0; + }; + const parse = function (raw) { + // preprocessing for SSD subscription format + const output = []; + let ssdinfo = JSON.parse(Base64.decode(raw.split('ssd://')[1])); + let port = ssdinfo.port; + let method = ssdinfo.encryption; + let password = ssdinfo.password; + // servers config + let servers = ssdinfo.servers; + for (let i = 0; i < servers.length; i++) { + let server = servers[i]; + method = server.encryption ? server.encryption : method; + password = server.password ? server.password : password; + let userinfo = Base64.encode(method + ':' + password); + let hostname = server.server; + port = server.port ? server.port : port; + let tag = server.remarks ? server.remarks : i; + let plugin = server.plugin_options + ? '/?plugin=' + + encodeURIComponent( + server.plugin + ';' + server.plugin_options, + ) + : ''; + output[i] = + 'ss://' + + userinfo + + '@' + + hostname + + ':' + + port + + plugin + + '#' + + tag; + } + return output.join('\n'); + }; + return { name, test, parse }; +} + +function FullConfig() { + const name = 'Full Config Preprocessor'; + const test = function (raw) { + return /^(\[server_local\]|\[Proxy\])/gm.test(raw); + }; + const parse = function (raw) { + const match = raw.match( + /^\[server_local|Proxy\]([\s\S]+?)^\[.+?\](\r?\n|$)/im, + )?.[1]; + return match || raw; + }; + return { name, test, parse }; +} + +export default [HTML(), Clash(), Base64Encoded(), SSD(), FullConfig()]; diff --git a/backend/src/core/proxy-utils/processors/index.js b/backend/src/core/proxy-utils/processors/index.js new file mode 100644 index 000000000..edbc0b80e --- /dev/null +++ b/backend/src/core/proxy-utils/processors/index.js @@ -0,0 +1,833 @@ +import resourceCache from '@/utils/resource-cache'; +import scriptResourceCache from '@/utils/script-resource-cache'; +import { isIPv4, isIPv6 } from '@/utils'; +import { FULL } from '@/utils/logical'; +import { getFlag } from '@/utils/geo'; +import lodash from 'lodash'; +import $ from '@/core/app'; +import { hex_md5 } from '@/vendor/md5'; +import { ProxyUtils } from '@/core/proxy-utils'; +import { produceArtifact } from '@/restful/sync'; + +import env from '@/utils/env'; +import { getFlowHeaders, parseFlowHeaders, flowTransfer } from '@/utils/flow'; + +/** + The rule "(name CONTAINS "🇨🇳") AND (port IN [80, 443])" can be expressed as follows: + { + operator: "AND", + child: [ + { + attr: "name", + proposition: "CONTAINS", + value: "🇨🇳" + }, + { + attr: "port", + proposition: "IN", + value: [80, 443] + } + ] +} + */ + +function ConditionalFilter({ rule }) { + return { + name: 'Conditional Filter', + func: (proxies) => { + return proxies.map((proxy) => isMatch(rule, proxy)); + }, + }; +} + +function isMatch(rule, proxy) { + // leaf node + if (!rule.operator) { + switch (rule.proposition) { + case 'IN': + return rule.value.indexOf(proxy[rule.attr]) !== -1; + case 'CONTAINS': + if (typeof proxy[rule.attr] !== 'string') return false; + return proxy[rule.attr].indexOf(rule.value) !== -1; + case 'EQUALS': + return proxy[rule.attr] === rule.value; + case 'EXISTS': + return ( + proxy[rule.attr] !== null || + typeof proxy[rule.attr] !== 'undefined' + ); + default: + throw new Error(`Unknown proposition: ${rule.proposition}`); + } + } + + // operator nodes + switch (rule.operator) { + case 'AND': + return rule.child.every((child) => isMatch(child, proxy)); + case 'OR': + return rule.child.some((child) => isMatch(child, proxy)); + case 'NOT': + return !isMatch(rule.child, proxy); + default: + throw new Error(`Unknown operator: ${rule.operator}`); + } +} + +function QuickSettingOperator(args) { + return { + name: 'Quick Setting Operator', + func: (proxies) => { + if (get(args.useless)) { + const filter = UselessFilter(); + const selected = filter.func(proxies); + proxies.filter((_, i) => selected[i]); + } + + return proxies.map((proxy) => { + proxy.udp = get(args.udp, proxy.udp); + proxy.tfo = get(args.tfo, proxy.tfo); + proxy['skip-cert-verify'] = get( + args.scert, + proxy['skip-cert-verify'], + ); + if (proxy.type === 'vmess') { + proxy.aead = get(args['vmess aead'], proxy.aead); + } + return proxy; + }); + }, + }; + + function get(value, defaultValue) { + switch (value) { + case 'ENABLED': + return true; + case 'DISABLED': + return false; + default: + return defaultValue; + } + } +} + +// add or remove flag for proxies +function FlagOperator({ mode }) { + return { + name: 'Flag Operator', + func: (proxies) => { + return proxies.map((proxy) => { + if (mode === 'remove') { + // no flag + proxy.name = removeFlag(proxy.name); + } else { + // get flag + const newFlag = getFlag(proxy.name); + // remove old flag + proxy.name = removeFlag(proxy.name); + proxy.name = newFlag + ' ' + proxy.name; + proxy.name = proxy.name.replace(/🇹🇼/g, '🇨🇳'); + } + return proxy; + }); + }, + }; +} + +// duplicate handler +function HandleDuplicateOperator(arg) { + const { action, template, link, position } = { + ...{ + action: 'rename', + template: '0 1 2 3 4 5 6 7 8 9', + link: '-', + position: 'back', + }, + ...arg, + }; + return { + name: 'Handle Duplicate Operator', + func: (proxies) => { + if (action === 'delete') { + const chosen = {}; + return proxies.filter((p) => { + if (chosen[p.name]) { + return false; + } + chosen[p.name] = true; + return true; + }); + } else if (action === 'rename') { + const numbers = template.split(' '); + // count occurrences of each name + const counter = {}; + let maxLen = 0; + proxies.forEach((p) => { + if (typeof counter[p.name] === 'undefined') + counter[p.name] = 1; + else counter[p.name]++; + maxLen = Math.max( + counter[p.name].toString().length, + maxLen, + ); + }); + const increment = {}; + return proxies.map((p) => { + if (counter[p.name] > 1) { + if (typeof increment[p.name] == 'undefined') + increment[p.name] = 1; + let num = ''; + let cnt = increment[p.name]++; + let numDigits = 0; + while (cnt > 0) { + num = numbers[cnt % 10] + num; + cnt = parseInt(cnt / 10); + numDigits++; + } + // padding + while (numDigits++ < maxLen) { + num = numbers[0] + num; + } + if (position === 'front') { + p.name = num + link + p.name; + } else if (position === 'back') { + p.name = p.name + link + num; + } + } + return p; + }); + } + }, + }; +} + +// sort proxies according to their names +function SortOperator(order = 'asc') { + return { + name: 'Sort Operator', + func: (proxies) => { + switch (order) { + case 'asc': + case 'desc': + return proxies.sort((a, b) => { + let res = a.name > b.name ? 1 : -1; + res *= order === 'desc' ? -1 : 1; + return res; + }); + case 'random': + return shuffle(proxies); + default: + throw new Error('Unknown sort option: ' + order); + } + }, + }; +} + +// sort by regex +function RegexSortOperator(expressions) { + return { + name: 'Regex Sort Operator', + func: (proxies) => { + expressions = expressions.map((expr) => buildRegex(expr)); + return proxies.sort((a, b) => { + const oA = getRegexOrder(expressions, a.name); + const oB = getRegexOrder(expressions, b.name); + if (oA && !oB) return -1; + if (oB && !oA) return 1; + if (oA && oB) return oA < oB ? -1 : 1; + if ((!oA && !oB) || (oA && oB && oA === oB)) + return a.name < b.name ? -1 : 1; // fallback to normal sort + }); + }, + }; +} + +function getRegexOrder(expressions, str) { + let order = null; + for (let i = 0; i < expressions.length; i++) { + if (expressions[i].test(str)) { + order = i + 1; // plus 1 is important! 0 will be treated as false!!! + break; + } + } + return order; +} + +// rename by regex +// keywords: [{expr: "string format regex", now: "now"}] +function RegexRenameOperator(regex) { + return { + name: 'Regex Rename Operator', + func: (proxies) => { + return proxies.map((proxy) => { + for (const { expr, now } of regex) { + proxy.name = proxy.name + .replace(buildRegex(expr, 'g'), now) + .trim(); + } + return proxy; + }); + }, + }; +} + +// delete regex operator +// regex: ['a', 'b', 'c'] +function RegexDeleteOperator(regex) { + const regex_ = regex.map((r) => { + return { + expr: r, + now: '', + }; + }); + return { + name: 'Regex Delete Operator', + func: RegexRenameOperator(regex_).func, + }; +} + +/** Script Operator + function operator(proxies) { + const {arg1} = $arguments; + + // do something + return proxies; + } + + WARNING: + 1. This function name should be `operator`! + 2. Always declare variables before using them! + */ +function ScriptOperator(script, targetPlatform, $arguments, source) { + return { + name: 'Script Operator', + func: async (proxies) => { + let output = proxies; + await (async function () { + const operator = createDynamicFunction( + 'operator', + script, + $arguments, + ); + output = operator(proxies, targetPlatform, { source, ...env }); + })(); + return output; + }, + nodeFunc: async (proxies) => { + let output = proxies; + await (async function () { + const operator = createDynamicFunction( + 'operator', + `async function operator(input = []) { + if (Array.isArray(input)) { + let proxies = input + let list = [] + for await (let $server of proxies) { + ${script} + list.push($server) + } + return list + } else { + let { $content, $files } = input + ${script} + return { $content, $files } + } + + }`, + $arguments, + ); + output = operator(proxies, targetPlatform, { source, ...env }); + })(); + return output; + }, + }; +} + +const DOMAIN_RESOLVERS = { + Google: async function (domain) { + const id = hex_md5(`GOOGLE:${domain}`); + const cached = resourceCache.get(id); + if (cached) return cached; + const resp = await $.http.get({ + url: `https://8.8.4.4/resolve?name=${encodeURIComponent( + domain, + )}&type=A`, + headers: { + accept: 'application/dns-json', + }, + }); + const body = JSON.parse(resp.body); + if (body['Status'] !== 0) { + throw new Error(`Status is ${body['Status']}`); + } + const answers = body['Answer']; + if (answers.length === 0) { + throw new Error('No answers'); + } + const result = answers[answers.length - 1].data; + resourceCache.set(id, result); + return result; + }, + 'IP-API': async function (domain) { + const id = hex_md5(`IP-API:${domain}`); + const cached = resourceCache.get(id); + if (cached) return cached; + const resp = await $.http.get({ + url: `http://ip-api.com/json/${encodeURIComponent( + domain, + )}?lang=zh-CN`, + }); + const body = JSON.parse(resp.body); + if (body['status'] !== 'success') { + throw new Error(`Status is ${body['status']}`); + } + const result = body.query; + resourceCache.set(id, result); + return result; + }, + Cloudflare: async function (domain) { + const id = hex_md5(`CLOUDFLARE:${domain}`); + const cached = resourceCache.get(id); + if (cached) return cached; + const resp = await $.http.get({ + url: `https://1.0.0.1/dns-query?name=${encodeURIComponent( + domain, + )}&type=A`, + headers: { + accept: 'application/dns-json', + }, + }); + const body = JSON.parse(resp.body); + if (body['Status'] !== 0) { + throw new Error(`Status is ${body['Status']}`); + } + const answers = body['Answer']; + if (answers.length === 0) { + throw new Error('No answers'); + } + const result = answers[answers.length - 1].data; + resourceCache.set(id, result); + return result; + }, + Ali: async function (domain) { + const id = hex_md5(`ALI:${domain}`); + const cached = resourceCache.get(id); + if (cached) return cached; + const resp = await $.http.get({ + url: `http://223.6.6.6/resolve?name=${encodeURIComponent( + domain, + )}&type=A&short=1`, + headers: { + accept: 'application/dns-json', + }, + }); + const answers = JSON.parse(resp.body); + if (answers.length === 0) { + throw new Error('No answers'); + } + const result = answers[answers.length - 1]; + resourceCache.set(id, result); + return result; + }, + Tencent: async function (domain) { + const id = hex_md5(`ALI:${domain}`); + const cached = resourceCache.get(id); + if (cached) return cached; + const resp = await $.http.get({ + url: `http://119.28.28.28/d?type=A&dn=${encodeURIComponent( + domain, + )}`, + headers: { + accept: 'application/dns-json', + }, + }); + const answers = resp.body.split(';').map((i) => i.split(',')[0]); + if (answers.length === 0) { + throw new Error('No answers'); + } + const result = answers[answers.length - 1]; + resourceCache.set(id, result); + return result; + }, +}; + +function ResolveDomainOperator({ provider }) { + const resolver = DOMAIN_RESOLVERS[provider]; + if (!resolver) { + throw new Error(`Cannot find resolver: ${provider}`); + } + return { + name: 'Resolve Domain Operator', + func: async (proxies) => { + const results = {}; + const limit = 15; // more than 20 concurrency may result in surge TCP connection shortage. + const totalDomain = [ + ...new Set( + proxies + .filter((p) => !isIP(p.server) && !p['no-resolve']) + .map((c) => c.server), + ), + ]; + const totalBatch = Math.ceil(totalDomain.length / limit); + for (let i = 0; i < totalBatch; i++) { + const currentBatch = []; + for (let domain of totalDomain.splice(0, limit)) { + currentBatch.push( + resolver(domain) + .then((ip) => { + results[domain] = ip; + $.info( + `Successfully resolved domain: ${domain} ➟ ${ip}`, + ); + }) + .catch((err) => { + $.error( + `Failed to resolve domain: ${domain} with resolver [${provider}]: ${err}`, + ); + }), + ); + } + await Promise.all(currentBatch); + } + proxies.forEach((p) => { + if (!p['no-resolve']) { + if (results[p.server]) { + p.server = results[p.server]; + p.resolved = true; + } else { + p.resolved = false; + } + } + }); + + return proxies; + }, + }; +} + +function isIP(ip) { + return isIPv4(ip) || isIPv6(ip); +} + +ResolveDomainOperator.resolver = DOMAIN_RESOLVERS; + +/**************************** Filters ***************************************/ +// filter useless proxies +function UselessFilter() { + const KEYWORDS = [ + '网址', + '流量', + '时间', + '应急', + '过期', + 'Bandwidth', + 'expire', + ]; + return { + name: 'Useless Filter', + func: RegexFilter({ + regex: KEYWORDS, + keep: false, + }).func, + }; +} + +// filter by regions +function RegionFilter(regions) { + const REGION_MAP = { + HK: '🇭🇰', + TW: '🇹🇼', + US: '🇺🇸', + SG: '🇸🇬', + JP: '🇯🇵', + UK: '🇬🇧', + }; + return { + name: 'Region Filter', + func: (proxies) => { + // this would be high memory usage + return proxies.map((proxy) => { + const flag = getFlag(proxy.name); + return regions.some((r) => REGION_MAP[r] === flag); + }); + }, + }; +} + +// filter by regex +function RegexFilter({ regex = [], keep = true }) { + return { + name: 'Regex Filter', + func: (proxies) => { + return proxies.map((proxy) => { + const selected = regex.some((r) => { + return buildRegex(r).test(proxy.name); + }); + return keep ? selected : !selected; + }); + }, + }; +} + +function buildRegex(str, ...options) { + options = options.join(''); + if (str.startsWith('(?i)')) { + str = str.substring(4); + return new RegExp(str, 'i' + options); + } else { + return new RegExp(str, options); + } +} + +// filter by proxy types +function TypeFilter(types) { + return { + name: 'Type Filter', + func: (proxies) => { + return proxies.map((proxy) => types.some((t) => proxy.type === t)); + }, + }; +} + +/** + Script Example + + function filter(proxies) { + return proxies.map(p => { + return p.name.indexOf('🇭🇰') !== -1; + }); + } + + WARNING: + 1. This function name should be `filter`! + 2. Always declare variables before using them! + */ +function ScriptFilter(script, targetPlatform, $arguments, source) { + return { + name: 'Script Filter', + func: async (proxies) => { + let output = FULL(proxies.length, true); + await (async function () { + const filter = createDynamicFunction( + 'filter', + script, + $arguments, + ); + output = filter(proxies, targetPlatform, { source, ...env }); + })(); + return output; + }, + nodeFunc: async (proxies) => { + let output = FULL(proxies.length, true); + await (async function () { + const filter = createDynamicFunction( + 'filter', + `async function filter(input = []) { + let proxies = input + let list = [] + const fn = async ($server) => { + ${script} + } + for await (let $server of proxies) { + list.push(await fn($server)) + } + return list + }`, + $arguments, + ); + output = filter(proxies, targetPlatform, { source, ...env }); + })(); + return output; + }, + }; +} + +export default { + 'Useless Filter': UselessFilter, + 'Region Filter': RegionFilter, + 'Regex Filter': RegexFilter, + 'Type Filter': TypeFilter, + 'Script Filter': ScriptFilter, + 'Conditional Filter': ConditionalFilter, + + 'Quick Setting Operator': QuickSettingOperator, + 'Flag Operator': FlagOperator, + 'Sort Operator': SortOperator, + 'Regex Sort Operator': RegexSortOperator, + 'Regex Rename Operator': RegexRenameOperator, + 'Regex Delete Operator': RegexDeleteOperator, + 'Script Operator': ScriptOperator, + 'Handle Duplicate Operator': HandleDuplicateOperator, + 'Resolve Domain Operator': ResolveDomainOperator, +}; + +async function ApplyFilter(filter, objs) { + // select proxies + let selected = FULL(objs.length, true); + try { + selected = await filter.func(objs); + } catch (err) { + let funcErr = ''; + let funcErrMsg = `${err.message ?? err}`; + if (funcErrMsg.includes('$server is not defined')) { + funcErr = ''; + } else { + $.error( + `Cannot apply filter ${filter.name}(function filter)! Reason: ${err}`, + ); + funcErr = `执行 function filter 失败 ${funcErrMsg}; `; + } + try { + selected = await filter.nodeFunc(objs); + } catch (err) { + $.error( + `Cannot apply filter ${filter.name}(node script)! Reason: ${err}`, + ); + let nodeErr = ''; + let nodeErrMsg = `${err.message ?? err}`; + if (funcErr && nodeErrMsg === funcErrMsg) { + nodeErr = ''; + funcErr = `执行失败 ${funcErrMsg}`; + } else { + nodeErr = `执行节点快捷过滤脚本 失败 ${nodeErr}`; + } + throw new Error(`脚本过滤 ${funcErr}${nodeErr}`); + } + } + return objs.filter((_, i) => selected[i]); +} + +async function ApplyOperator(operator, objs) { + let output = clone(objs); + try { + const output_ = await operator.func(output); + if (output_) output = output_; + } catch (err) { + let funcErr = ''; + let funcErrMsg = `${err.message ?? err}`; + if ( + funcErrMsg.includes('$server is not defined') || + funcErrMsg.includes('$content is not defined') || + funcErrMsg.includes('$files is not defined') + ) { + funcErr = ''; + } else { + $.error( + `Cannot apply operator ${operator.name}(function operator)! Reason: ${err}`, + ); + funcErr = `执行 function operator 失败 ${funcErrMsg}; `; + } + try { + const output_ = await operator.nodeFunc(output); + if (output_) output = output_; + } catch (err) { + $.error( + `Cannot apply operator ${operator.name}(node script)! Reason: ${err}`, + ); + let nodeErr = ''; + let nodeErrMsg = `${err.message ?? err}`; + if (funcErr && nodeErrMsg === funcErrMsg) { + nodeErr = ''; + funcErr = `执行失败 ${funcErrMsg}`; + } else { + nodeErr = `执行节点快捷脚本 失败 ${nodeErr}`; + } + throw new Error(`脚本操作 ${funcErr}${nodeErr}`); + } + } + return output; +} + +export async function ApplyProcessor(processor, objs) { + if (processor.name.indexOf('Filter') !== -1) { + return ApplyFilter(processor, objs); + } else if (processor.name.indexOf('Operator') !== -1) { + return ApplyOperator(processor, objs); + } +} + +// shuffle array +function shuffle(array) { + let currentIndex = array.length, + temporaryValue, + randomIndex; + + // While there remain elements to shuffle... + while (0 !== currentIndex) { + // Pick a remaining element... + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + + // And swap it with the current element. + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + + return array; +} + +// deep clone object +function clone(object) { + return JSON.parse(JSON.stringify(object)); +} + +// remove flag +function removeFlag(str) { + return str + .replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g, '') + .trim(); +} + +function createDynamicFunction(name, script, $arguments) { + const flowUtils = { getFlowHeaders, parseFlowHeaders, flowTransfer }; + if ($.env.isLoon) { + return new Function( + '$arguments', + '$substore', + 'lodash', + '$persistentStore', + '$httpClient', + '$notification', + 'ProxyUtils', + 'scriptResourceCache', + 'flowUtils', + 'produceArtifact', + `${script}\n return ${name}`, + )( + $arguments, + $, + lodash, + // eslint-disable-next-line no-undef + $persistentStore, + // eslint-disable-next-line no-undef + $httpClient, + // eslint-disable-next-line no-undef + $notification, + ProxyUtils, + scriptResourceCache, + flowUtils, + produceArtifact, + ); + } else { + return new Function( + '$arguments', + '$substore', + 'lodash', + 'ProxyUtils', + 'scriptResourceCache', + 'flowUtils', + 'produceArtifact', + + `${script}\n return ${name}`, + )( + $arguments, + $, + lodash, + ProxyUtils, + scriptResourceCache, + flowUtils, + produceArtifact, + ); + } +} diff --git a/backend/src/core/proxy-utils/producers/clash.js b/backend/src/core/proxy-utils/producers/clash.js new file mode 100644 index 000000000..42e5c7664 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/clash.js @@ -0,0 +1,140 @@ +import { isPresent } from '@/core/proxy-utils/producers/utils'; + +export default function Clash_Producer() { + const type = 'ALL'; + const produce = (proxies, type, opts = {}) => { + // VLESS XTLS is not supported by Clash + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/docs/config.yaml#L532 + // github.com/Dreamacro/clash/pull/2891/files + // filter unsupported proxies + // https://clash.wiki/configuration/outbound.html#shadowsocks + const list = proxies + .filter((proxy) => { + if (opts['include-unsupported-proxy']) return true; + if ( + ![ + 'ss', + 'ssr', + 'vmess', + 'vless', + 'socks5', + 'http', + 'snell', + 'trojan', + 'wireguard', + ].includes(proxy.type) || + (proxy.type === 'ss' && + ![ + 'aes-128-gcm', + 'aes-192-gcm', + 'aes-256-gcm', + 'aes-128-cfb', + 'aes-192-cfb', + 'aes-256-cfb', + 'aes-128-ctr', + 'aes-192-ctr', + 'aes-256-ctr', + 'rc4-md5', + 'chacha20-ietf', + 'xchacha20', + 'chacha20-ietf-poly1305', + 'xchacha20-ietf-poly1305', + ].includes(proxy.cipher)) || + (proxy.type === 'snell' && String(proxy.version) === '4') || + (proxy.type === 'vless' && + (typeof proxy.flow !== 'undefined' || + proxy['reality-opts'])) + ) { + return false; + } + return true; + }) + .map((proxy) => { + if (proxy.type === 'vmess') { + // handle vmess aead + if (isPresent(proxy, 'aead')) { + if (proxy.aead) { + proxy.alterId = 0; + } + delete proxy.aead; + } + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + // https://dreamacro.github.io/clash/configuration/outbound.html#vmess + if ( + isPresent(proxy, 'cipher') && + ![ + 'auto', + 'aes-128-gcm', + 'chacha20-poly1305', + 'none', + ].includes(proxy.cipher) + ) { + proxy.cipher = 'auto'; + } + } else if (proxy.type === 'wireguard') { + proxy.keepalive = + proxy.keepalive ?? proxy['persistent-keepalive']; + proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; + } else if (proxy.type === 'vless') { + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + } + + if ( + ['vmess', 'vless'].includes(proxy.type) && + proxy.network === 'http' + ) { + let httpPath = proxy['http-opts']?.path; + if ( + isPresent(proxy, 'http-opts.path') && + !Array.isArray(httpPath) + ) { + proxy['http-opts'].path = [httpPath]; + } + let httpHost = proxy['http-opts']?.headers?.Host; + if ( + isPresent(proxy, 'http-opts.headers.Host') && + !Array.isArray(httpHost) + ) { + proxy['http-opts'].headers.Host = [httpHost]; + } + } + if ( + ['trojan', 'tuic', 'hysteria', 'hysteria2'].includes( + proxy.type, + ) + ) { + delete proxy.tls; + } + + if (proxy['tls-fingerprint']) { + proxy.fingerprint = proxy['tls-fingerprint']; + } + delete proxy['tls-fingerprint']; + delete proxy.subName; + delete proxy.collectionName; + if ( + ['grpc'].includes(proxy.network) && + proxy[`${proxy.network}-opts`] + ) { + delete proxy[`${proxy.network}-opts`]['_grpc-type']; + } + return proxy; + }); + return type === 'internal' + ? list + : 'proxies:\n' + + list + .map((proxy) => ' - ' + JSON.stringify(proxy) + '\n') + .join(''); + }; + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/producers/clashmeta.js b/backend/src/core/proxy-utils/producers/clashmeta.js new file mode 100644 index 000000000..d3d964a1c --- /dev/null +++ b/backend/src/core/proxy-utils/producers/clashmeta.js @@ -0,0 +1,145 @@ +import { isPresent } from '@/core/proxy-utils/producers/utils'; + +export default function ClashMeta_Producer() { + const type = 'ALL'; + const produce = (proxies, type, opts = {}) => { + const list = proxies + .filter((proxy) => { + if (opts['include-unsupported-proxy']) return true; + if (proxy.type === 'snell' && String(proxy.version) === '4') { + return false; + } + return true; + }) + .map((proxy) => { + if (proxy.type === 'vmess') { + // handle vmess aead + if (isPresent(proxy, 'aead')) { + if (proxy.aead) { + proxy.alterId = 0; + } + delete proxy.aead; + } + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/docs/config.yaml#L400 + // https://stash.wiki/proxy-protocols/proxy-types#vmess + if ( + isPresent(proxy, 'cipher') && + ![ + 'auto', + 'aes-128-gcm', + 'chacha20-poly1305', + 'none', + ].includes(proxy.cipher) + ) { + proxy.cipher = 'auto'; + } + } else if (proxy.type === 'tuic') { + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } else { + proxy.alpn = ['h3']; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + } + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/adapter/outbound/tuic.go#L197 + if ( + (!proxy.token || proxy.token.length === 0) && + !isPresent(proxy, 'version') + ) { + proxy.version = 5; + } + } else if (proxy.type === 'hysteria') { + // auth_str 将会在未来某个时候删除 但是有的机场不规范 + if ( + isPresent(proxy, 'auth_str') && + !isPresent(proxy, 'auth-str') + ) { + proxy['auth-str'] = proxy['auth_str']; + } + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + } + } else if (proxy.type === 'wireguard') { + proxy.keepalive = + proxy.keepalive ?? proxy['persistent-keepalive']; + proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; + } else if (proxy.type === 'vless') { + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + } + + if ( + ['vmess', 'vless'].includes(proxy.type) && + proxy.network === 'http' + ) { + let httpPath = proxy['http-opts']?.path; + if ( + isPresent(proxy, 'http-opts.path') && + !Array.isArray(httpPath) + ) { + proxy['http-opts'].path = [httpPath]; + } + let httpHost = proxy['http-opts']?.headers?.Host; + if ( + isPresent(proxy, 'http-opts.headers.Host') && + !Array.isArray(httpHost) + ) { + proxy['http-opts'].headers.Host = [httpHost]; + } + } + + if ( + ['trojan', 'tuic', 'hysteria', 'hysteria2'].includes( + proxy.type, + ) + ) { + delete proxy.tls; + } + + if (proxy['tls-fingerprint']) { + proxy.fingerprint = proxy['tls-fingerprint']; + } + delete proxy['tls-fingerprint']; + delete proxy.subName; + delete proxy.collectionName; + if ( + ['grpc'].includes(proxy.network) && + proxy[`${proxy.network}-opts`] + ) { + delete proxy[`${proxy.network}-opts`]['_grpc-type']; + } + return proxy; + }); + + return type === 'internal' + ? list + : 'proxies:\n' + + list + .map((proxy) => ' - ' + JSON.stringify(proxy) + '\n') + .join(''); + }; + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/producers/index.js b/backend/src/core/proxy-utils/producers/index.js new file mode 100644 index 000000000..79721de68 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/index.js @@ -0,0 +1,36 @@ +import Surge_Producer from './surge'; +import SurgeMac_Producer from './surgemac'; +import Clash_Producer from './clash'; +import ClashMeta_Producer from './clashmeta'; +import Stash_Producer from './stash'; +import Loon_Producer from './loon'; +import URI_Producer from './uri'; +import V2Ray_Producer from './v2ray'; +import QX_Producer from './qx'; +import Shadowrocket_Producer from './shadowrocket'; +import Surfboard_Producer from './surfboard'; +import singbox_Producer from './sing-box'; + +function JSON_Producer() { + const type = 'ALL'; + const produce = (proxies) => JSON.stringify(proxies, null, 2); + return { type, produce }; +} + +export default { + QX: QX_Producer(), + QuantumultX: QX_Producer(), + Surge: Surge_Producer(), + SurgeMac: SurgeMac_Producer(), + Loon: Loon_Producer(), + Clash: Clash_Producer(), + ClashMeta: ClashMeta_Producer(), + URI: URI_Producer(), + V2Ray: V2Ray_Producer(), + JSON: JSON_Producer(), + Stash: Stash_Producer(), + Shadowrocket: Shadowrocket_Producer(), + ShadowRocket: Shadowrocket_Producer(), + Surfboard: Surfboard_Producer(), + 'sing-box': singbox_Producer(), +}; diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js new file mode 100644 index 000000000..e21476b72 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -0,0 +1,369 @@ +/* eslint-disable no-case-declarations */ +const targetPlatform = 'Loon'; +import { isPresent, Result } from './utils'; +import { isIPv4, isIPv6 } from '@/utils'; + +export default function Loon_Producer() { + const produce = (proxy) => { + switch (proxy.type) { + case 'ss': + return shadowsocks(proxy); + case 'ssr': + return shadowsocksr(proxy); + case 'trojan': + return trojan(proxy); + case 'vmess': + return vmess(proxy); + case 'vless': + return vless(proxy); + case 'http': + return http(proxy); + case 'wireguard': + return wireguard(proxy); + case 'hysteria2': + return hysteria2(proxy); + } + throw new Error( + `Platform ${targetPlatform} does not support proxy type: ${proxy.type}`, + ); + }; + return { produce }; +} + +function shadowsocks(proxy) { + const result = new Result(proxy); + result.append( + `${proxy.name}=shadowsocks,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}"`, + ); + + // obfs + if (isPresent(proxy, 'plugin')) { + if (proxy.plugin === 'obfs') { + result.append(`,obfs-name=${proxy['plugin-opts'].mode}`); + result.appendIfPresent( + `,obfs-host=${proxy['plugin-opts'].host}`, + 'plugin-opts.host', + ); + result.appendIfPresent( + `,obfs-uri=${proxy['plugin-opts'].path}`, + 'plugin-opts.path', + ); + } else { + throw new Error(`plugin ${proxy.plugin} is not supported`); + } + } + + // tfo + result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function shadowsocksr(proxy) { + const result = new Result(proxy); + result.append( + `${proxy.name}=shadowsocksr,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}"`, + ); + + // ssr protocol + result.append(`,protocol=${proxy.protocol}`); + result.appendIfPresent( + `,protocol-param=${proxy['protocol-param']}`, + 'protocol-param', + ); + + // obfs + result.appendIfPresent(`,obfs=${proxy.obfs}`, 'obfs'); + result.appendIfPresent(`,obfs-param=${proxy['obfs-param']}`, 'obfs-param'); + + // tfo + result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function trojan(proxy) { + const result = new Result(proxy); + result.append( + `${proxy.name}=trojan,${proxy.server},${proxy.port},"${proxy.password}"`, + ); + + // transport + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + result.append(`,transport=ws`); + result.appendIfPresent( + `,path=${proxy['ws-opts']?.path}`, + 'ws-opts.path', + ); + result.appendIfPresent( + `,host=${proxy['ws-opts']?.headers?.Host}`, + 'ws-opts.headers.Host', + ); + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + } + + // tls verification + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // sni + result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); + + // tfo + result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function vmess(proxy) { + const result = new Result(proxy); + result.append( + `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.uuid}"`, + ); + + // transport + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + result.append(`,transport=ws`); + result.appendIfPresent( + `,path=${proxy['ws-opts']?.path}`, + 'ws-opts.path', + ); + result.appendIfPresent( + `,host=${proxy['ws-opts']?.headers?.Host}`, + 'ws-opts.headers.Host', + ); + } else if (proxy.network === 'http') { + result.append(`,transport=http`); + let httpPath = proxy['http-opts']?.path; + let httpHost = proxy['http-opts']?.headers?.Host; + result.appendIfPresent( + `,path=${Array.isArray(httpPath) ? httpPath[0] : httpPath}`, + 'http-opts.path', + ); + result.appendIfPresent( + `,host=${Array.isArray(httpHost) ? httpHost[0] : httpHost}`, + 'http-opts.headers.Host', + ); + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + } else { + result.append(`,transport=tcp`); + } + + // tls + result.appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); + + // tls verification + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // sni + result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); + + // AEAD + if (isPresent(proxy, 'aead')) { + result.append(`,alterId=0`); + } else { + result.append(`,alterId=${proxy.alterId}`); + } + + // tfo + result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp=${proxy.udp}`, 'udp'); + return result.toString(); +} + +function vless(proxy) { + if (proxy['reality-opts']) { + throw new Error(`reality is unsupported`); + } + const result = new Result(proxy); + result.append( + `${proxy.name}=vless,${proxy.server},${proxy.port},"${proxy.uuid}"`, + ); + + // transport + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + result.append(`,transport=ws`); + result.appendIfPresent( + `,path=${proxy['ws-opts']?.path}`, + 'ws-opts.path', + ); + result.appendIfPresent( + `,host=${proxy['ws-opts']?.headers?.Host}`, + 'ws-opts.headers.Host', + ); + } else if (proxy.network === 'http') { + result.append(`,transport=http`); + let httpPath = proxy['http-opts']?.path; + let httpHost = proxy['http-opts']?.headers?.Host; + result.appendIfPresent( + `,path=${Array.isArray(httpPath) ? httpPath[0] : httpPath}`, + 'http-opts.path', + ); + result.appendIfPresent( + `,host=${Array.isArray(httpHost) ? httpHost[0] : httpHost}`, + 'http-opts.headers.Host', + ); + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + } else { + result.append(`,transport=tcp`); + } + + // tls + result.appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); + + // tls verification + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // sni + result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); + + // tfo + result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp=${proxy.udp}`, 'udp'); + return result.toString(); +} + +function http(proxy) { + const result = new Result(proxy); + const type = proxy.tls ? 'https' : 'http'; + result.append(`${proxy.name}=${type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,${proxy.username}`, 'username'); + result.appendIfPresent(`,"${proxy.password}"`, 'password'); + + // sni + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + + // tls verification + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + return result.toString(); +} + +function wireguard(proxy) { + if (Array.isArray(proxy.peers) && proxy.peers.length > 0) { + proxy.server = proxy.peers[0].server; + proxy.port = proxy.peers[0].port; + proxy.ip = proxy.peers[0].ip; + proxy.ipv6 = proxy.peers[0].ipv6; + proxy['public-key'] = proxy.peers[0]['public-key']; + proxy['preshared-key'] = proxy.peers[0]['pre-shared-key']; + // https://github.com/MetaCubeX/mihomo/blob/0404e35be8736b695eae018a08debb175c1f96e6/docs/config.yaml#L717 + proxy['allowed-ips'] = proxy.peers[0]['allowed-ips']; + proxy.reserved = proxy.peers[0].reserved; + } + const result = new Result(proxy); + result.append(`${proxy.name}=wireguard`); + + result.appendIfPresent(`,interface-ip=${proxy.ip}`, 'ip'); + result.appendIfPresent(`,interface-ipv6=${proxy.ipv6}`, 'ipv6'); + + result.appendIfPresent( + `,private-key="${proxy['private-key']}"`, + 'private-key', + ); + result.appendIfPresent(`,mtu=${proxy.mtu}`, 'mtu'); + + if (proxy.dns) { + if (Array.isArray(proxy.dns)) { + proxy.dnsv6 = proxy.dns.find((i) => isIPv6(i)); + proxy.dns = proxy.dns.find((i) => isIPv4(i)); + } + } + result.appendIfPresent(`,dns=${proxy.dns}`, 'dns'); + result.appendIfPresent(`,dnsv6=${proxy.dnsv6}`, 'dnsv6'); + result.appendIfPresent( + `,keepalive=${proxy['persistent-keepalive']}`, + 'persistent-keepalive', + ); + result.appendIfPresent(`,keepalive=${proxy.keepalive}`, 'keepalive'); + const allowedIps = Array.isArray(proxy['allowed-ips']) + ? proxy['allowed-ips'].join(',') + : proxy['allowed-ips']; + let reserved = Array.isArray(proxy.reserved) + ? proxy.reserved.join(',') + : proxy.reserved; + if (reserved) { + reserved = `,reserved=[${reserved}]`; + } + let presharedKey = proxy['preshared-key'] ?? proxy['pre-shared-key']; + if (presharedKey) { + presharedKey = `,preshared-key="${presharedKey}"`; + } + result.append( + `,peers=[{public-key="${proxy['public-key']}",allowed-ips="${ + allowedIps ?? '0.0.0.0/0,::/0' + }",endpoint=${proxy.server}:${proxy.port}${reserved ?? ''}${ + presharedKey ?? '' + }}]`, + ); + + return result.toString(); +} + +function hysteria2(proxy) { + if (proxy.obfs || proxy['obfs-password']) { + throw new Error(`obfs is unsupported`); + } + const result = new Result(proxy); + result.append(`${proxy.name}=Hysteria2,${proxy.server},${proxy.port}`); + + result.appendIfPresent(`,"${proxy.password}"`, 'password'); + + // sni + result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // udp + result.appendIfPresent(`,udp=${proxy.udp}`, 'udp'); + + // download-bandwidth + result.appendIfPresent( + `,download-bandwidth=${`${proxy['down']}`.match(/\d+/)?.[0] || 0}`, + 'down', + ); + + result.appendIfPresent(`,ecn=${proxy.ecn}`, 'ecn'); + + return result.toString(); +} diff --git a/backend/src/core/proxy-utils/producers/qx.js b/backend/src/core/proxy-utils/producers/qx.js new file mode 100644 index 000000000..614f67aba --- /dev/null +++ b/backend/src/core/proxy-utils/producers/qx.js @@ -0,0 +1,453 @@ +import { isPresent, Result } from './utils'; + +const targetPlatform = 'QX'; + +export default function QX_Producer() { + const produce = (proxy) => { + switch (proxy.type) { + case 'ss': + return shadowsocks(proxy); + case 'ssr': + return shadowsocksr(proxy); + case 'trojan': + return trojan(proxy); + case 'vmess': + return vmess(proxy); + case 'http': + return http(proxy); + case 'socks5': + return socks5(proxy); + } + throw new Error( + `Platform ${targetPlatform} does not support proxy type: ${proxy.type}`, + ); + }; + return { produce }; +} + +function shadowsocks(proxy) { + const result = new Result(proxy); + const append = result.append.bind(result); + const appendIfPresent = result.appendIfPresent.bind(result); + + append(`shadowsocks=${proxy.server}:${proxy.port}`); + append(`,method=${proxy.cipher}`); + append(`,password=${proxy.password}`); + + // obfs + if (needTls(proxy)) { + proxy.tls = true; + } + if (isPresent(proxy, 'plugin')) { + if (proxy.plugin === 'obfs') { + const opts = proxy['plugin-opts']; + append(`,obfs=${opts.mode}`); + } else if ( + proxy.plugin === 'v2ray-plugin' && + proxy['plugin-opts'].mode === 'websocket' + ) { + const opts = proxy['plugin-opts']; + if (opts.tls) append(`,obfs=wss`); + else append(`,obfs=ws`); + } else { + throw new Error(`plugin is not supported`); + } + appendIfPresent( + `,obfs-host=${proxy['plugin-opts'].host}`, + 'plugin-opts.host', + ); + appendIfPresent( + `,obfs-uri=${proxy['plugin-opts'].path}`, + 'plugin-opts.path', + ); + } + + if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); + // tls fingerprint + appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + appendIfPresent( + `,tls-verification=${!proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + appendIfPresent(`,tls-host=${proxy.sni}`, 'sni'); + } + + // tfo + appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // server_check_url + result.appendIfPresent( + `,server_check_url=${proxy['test-url']}`, + 'test-url', + ); + + // tag + append(`,tag=${proxy.name}`); + + return result.toString(); +} + +function shadowsocksr(proxy) { + const result = new Result(proxy); + const append = result.append.bind(result); + const appendIfPresent = result.appendIfPresent.bind(result); + + append(`shadowsocks=${proxy.server}:${proxy.port}`); + append(`,method=${proxy.cipher}`); + append(`,password=${proxy.password}`); + + // ssr protocol + append(`,ssr-protocol=${proxy.protocol}`); + appendIfPresent( + `,ssr-protocol-param=${proxy['protocol-param']}`, + 'protocol-param', + ); + + // obfs + appendIfPresent(`,obfs=${proxy.obfs}`, 'obfs'); + appendIfPresent(`,obfs-host=${proxy['obfs-param']}`, 'obfs-param'); + + // tfo + appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // server_check_url + result.appendIfPresent( + `,server_check_url=${proxy['test-url']}`, + 'test-url', + ); + + // tag + append(`,tag=${proxy.name}`); + + return result.toString(); +} + +function trojan(proxy) { + const result = new Result(proxy); + const append = result.append.bind(result); + const appendIfPresent = result.appendIfPresent.bind(result); + + append(`trojan=${proxy.server}:${proxy.port}`); + append(`,password=${proxy.password}`); + + // obfs ws + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + if (needTls(proxy)) append(`,obfs=wss`); + else append(`,obfs=ws`); + appendIfPresent( + `,obfs-uri=${proxy['ws-opts']?.path}`, + 'ws-opts.path', + ); + appendIfPresent( + `,obfs-host=${proxy['ws-opts']?.headers?.Host}`, + 'ws-opts.headers.Host', + ); + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + } + + // over tls + if (proxy.network !== 'ws' && needTls(proxy)) { + append(`,over-tls=true`); + } + + if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); + // tls fingerprint + appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + appendIfPresent( + `,tls-verification=${!proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + appendIfPresent(`,tls-host=${proxy.sni}`, 'sni'); + } + + // tfo + appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // server_check_url + result.appendIfPresent( + `,server_check_url=${proxy['test-url']}`, + 'test-url', + ); + + // tag + append(`,tag=${proxy.name}`); + + return result.toString(); +} + +function vmess(proxy) { + const result = new Result(proxy); + const append = result.append.bind(result); + const appendIfPresent = result.appendIfPresent.bind(result); + + append(`vmess=${proxy.server}:${proxy.port}`); + + // cipher + let cipher; + if (proxy.cipher === 'auto') { + cipher = 'chacha20-ietf-poly1305'; + } else { + cipher = proxy.cipher; + } + append(`,method=${cipher}`); + + append(`,password=${proxy.uuid}`); + + // obfs + if (needTls(proxy)) { + proxy.tls = true; + } + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + if (proxy.tls) append(`,obfs=wss`); + else append(`,obfs=ws`); + } else if (proxy.network === 'http') { + append(`,obfs=http`); + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + let transportPath = proxy[`${proxy.network}-opts`]?.path; + let transportHost = proxy[`${proxy.network}-opts`]?.headers?.Host; + appendIfPresent( + `,obfs-uri=${ + Array.isArray(transportPath) ? transportPath[0] : transportPath + }`, + `${proxy.network}-opts.path`, + ); + appendIfPresent( + `,obfs-host=${ + Array.isArray(transportHost) ? transportHost[0] : transportHost + }`, + `${proxy.network}-opts.headers.Host`, + ); + } else { + // over-tls + if (proxy.tls) append(`,obfs=over-tls`); + } + + if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); + // tls fingerprint + appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + appendIfPresent( + `,tls-verification=${!proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + appendIfPresent(`,tls-host=${proxy.sni}`, 'sni'); + } + + // AEAD + if (isPresent(proxy, 'aead')) { + append(`,aead=${proxy.aead}`); + } else { + append(`,aead=${proxy.alterId === 0}`); + } + + // tfo + appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // server_check_url + result.appendIfPresent( + `,server_check_url=${proxy['test-url']}`, + 'test-url', + ); + + // tag + append(`,tag=${proxy.name}`); + + return result.toString(); +} + +function http(proxy) { + const result = new Result(proxy); + const append = result.append.bind(result); + const appendIfPresent = result.appendIfPresent.bind(result); + + append(`http=${proxy.server}:${proxy.port}`); + appendIfPresent(`,username=${proxy.username}`, 'username'); + appendIfPresent(`,password=${proxy.password}`, 'password'); + + // tls + if (needTls(proxy)) { + proxy.tls = true; + } + appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); + + if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); + // tls fingerprint + appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + appendIfPresent( + `,tls-verification=${!proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + appendIfPresent(`,tls-host=${proxy.sni}`, 'sni'); + } + + // tfo + appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // server_check_url + result.appendIfPresent( + `,server_check_url=${proxy['test-url']}`, + 'test-url', + ); + + // tag + append(`,tag=${proxy.name}`); + + return result.toString(); +} + +function socks5(proxy) { + const result = new Result(proxy); + const append = result.append.bind(result); + const appendIfPresent = result.appendIfPresent.bind(result); + + append(`socks5=${proxy.server}:${proxy.port}`); + appendIfPresent(`,username=${proxy.username}`, 'username'); + appendIfPresent(`,password=${proxy.password}`, 'password'); + + // tls + if (needTls(proxy)) { + proxy.tls = true; + } + appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); + + if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); + // tls fingerprint + appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + appendIfPresent( + `,tls-verification=${!proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + appendIfPresent(`,tls-host=${proxy.sni}`, 'sni'); + } + + // tfo + appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); + + // udp + appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // server_check_url + result.appendIfPresent( + `,server_check_url=${proxy['test-url']}`, + 'test-url', + ); + + // tag + append(`,tag=${proxy.name}`); + + return result.toString(); +} + +function needTls(proxy) { + return proxy.tls; +} diff --git a/backend/src/core/proxy-utils/producers/shadowrocket.js b/backend/src/core/proxy-utils/producers/shadowrocket.js new file mode 100644 index 000000000..84e29f994 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/shadowrocket.js @@ -0,0 +1,162 @@ +import { isPresent } from '@/core/proxy-utils/producers/utils'; + +export default function ShadowRocket_Producer() { + const type = 'ALL'; + const produce = (proxies, type, opts = {}) => { + const list = proxies + .filter((proxy) => { + if (opts['include-unsupported-proxy']) return true; + if (proxy.type === 'snell' && String(proxy.version) === '4') { + return false; + } + return true; + }) + .map((proxy) => { + if (proxy.type === 'vmess') { + // handle vmess aead + if (isPresent(proxy, 'aead')) { + if (proxy.aead) { + proxy.alterId = 0; + } + delete proxy.aead; + } + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/docs/config.yaml#L400 + // https://stash.wiki/proxy-protocols/proxy-types#vmess + if ( + isPresent(proxy, 'cipher') && + ![ + 'auto', + 'aes-128-gcm', + 'chacha20-poly1305', + 'none', + ].includes(proxy.cipher) + ) { + proxy.cipher = 'auto'; + } + } else if (proxy.type === 'tuic') { + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } else { + proxy.alpn = ['h3']; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + } + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/adapter/outbound/tuic.go#L197 + if ( + (!proxy.token || proxy.token.length === 0) && + !isPresent(proxy, 'version') + ) { + proxy.version = 5; + } + } else if (proxy.type === 'hysteria') { + // auth_str 将会在未来某个时候删除 但是有的机场不规范 + if ( + isPresent(proxy, 'auth_str') && + !isPresent(proxy, 'auth-str') + ) { + proxy['auth-str'] = proxy['auth_str']; + } + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + } + } else if (proxy.type === 'hysteria2') { + if (proxy['obfs-password'] && proxy.obfs == 'salamander') { + proxy.obfs = proxy['obfs-password']; + delete proxy['obfs-password']; + } + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + } + } else if (proxy.type === 'wireguard') { + proxy.keepalive = + proxy.keepalive ?? proxy['persistent-keepalive']; + proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; + } else if (proxy.type === 'vless') { + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + } + + if ( + ['vmess', 'vless'].includes(proxy.type) && + proxy.network === 'http' + ) { + let httpPath = proxy['http-opts']?.path; + if ( + isPresent(proxy, 'http-opts.path') && + !Array.isArray(httpPath) + ) { + proxy['http-opts'].path = [httpPath]; + } + let httpHost = proxy['http-opts']?.headers?.Host; + if ( + isPresent(proxy, 'http-opts.headers.Host') && + !Array.isArray(httpHost) + ) { + proxy['http-opts'].headers.Host = [httpHost]; + } + } + + if ( + ['trojan', 'tuic', 'hysteria', 'hysteria2'].includes( + proxy.type, + ) + ) { + delete proxy.tls; + } + + if (proxy['tls-fingerprint']) { + proxy.fingerprint = proxy['tls-fingerprint']; + } + delete proxy['tls-fingerprint']; + delete proxy.subName; + delete proxy.collectionName; + if ( + ['grpc'].includes(proxy.network) && + proxy[`${proxy.network}-opts`] + ) { + delete proxy[`${proxy.network}-opts`]['_grpc-type']; + } + return proxy; + }); + return type === 'internal' + ? list + : 'proxies:\n' + + list + .map((proxy) => { + return ' - ' + JSON.stringify(proxy) + '\n'; + }) + .join(''); + }; + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/producers/sing-box.js b/backend/src/core/proxy-utils/producers/sing-box.js new file mode 100644 index 000000000..80b2122cb --- /dev/null +++ b/backend/src/core/proxy-utils/producers/sing-box.js @@ -0,0 +1,688 @@ +import ClashMeta_Producer from './clashmeta'; +import $ from '@/core/app'; + +const tfoParser = (proxy, parsedProxy) => { + parsedProxy.tcp_fast_open = false; + if (proxy.tfo) parsedProxy.tcp_fast_open = true; + if (proxy.tcp_fast_open) parsedProxy.tcp_fast_open = true; + if (proxy['tcp-fast-open']) parsedProxy.tcp_fast_open = true; + if (!parsedProxy.tcp_fast_open) delete parsedProxy.tcp_fast_open; +}; + +const smuxParser = (smux, proxy) => { + if (!smux || !smux.enabled) return; + proxy.multiplex = { enabled: true }; + proxy.multiplex.protocol = smux.protocol; + if (smux['max-connections']) + proxy.multiplex.max_connections = parseInt( + `${smux['max-connections']}`, + 10, + ); + if (smux['max-streams']) + proxy.multiplex.max_streams = parseInt(`${smux['max-streams']}`, 10); + if (smux['min-streams']) + proxy.multiplex.min_streams = parseInt(`${smux['min-streams']}`, 10); + if (smux.padding) proxy.multiplex.padding = true; +}; + +const wsParser = (proxy, parsedProxy) => { + const transport = { type: 'ws', headers: {} }; + if (proxy['ws-opts']) { + const { path: wsPath = '', headers: wsHeaders = {} } = proxy['ws-opts']; + if (wsPath !== '') transport.path = `${wsPath}`; + if (Object.keys(wsHeaders).length > 0) { + const headers = {}; + for (const key of Object.keys(wsHeaders)) { + let value = wsHeaders[key]; + if (value === '') continue; + if (!Array.isArray(value)) value = [`${value}`]; + if (value.length > 0) headers[key] = value; + } + const { Host: wsHost } = headers; + if (wsHost.length === 1) + for (const item of `Host:${wsHost[0]}`.split('\n')) { + const [key, value] = item.split(':'); + if (value.trim() === '') continue; + headers[key.trim()] = value.trim().split(','); + } + transport.headers = headers; + } + } + if (proxy['ws-headers']) { + const headers = {}; + for (const key of Object.keys(proxy['ws-headers'])) { + let value = proxy['ws-headers'][key]; + if (value === '') continue; + if (!Array.isArray(value)) value = [`${value}`]; + if (value.length > 0) headers[key] = value; + } + const { Host: wsHost } = headers; + if (wsHost.length === 1) + for (const item of `Host:${wsHost[0]}`.split('\n')) { + const [key, value] = item.split(':'); + if (value.trim() === '') continue; + headers[key.trim()] = value.trim().split(','); + } + for (const key of Object.keys(headers)) + transport.headers[key] = headers[key]; + } + if (proxy['ws-path'] && proxy['ws-path'] !== '') + transport.path = `${proxy['ws-path']}`; + if (transport.path) { + const reg = /^(.*?)(?:\?ed=(\d+))?$/; + // eslint-disable-next-line no-unused-vars + const [_, path = '', ed = ''] = reg.exec(transport.path); + transport.path = path; + if (ed !== '') { + transport.early_data_header_name = 'Sec-WebSocket-Protocol'; + transport.max_early_data = parseInt(ed, 10); + } + } + + if (parsedProxy.tls.insecure) + parsedProxy.tls.server_name = transport.headers.Host[0]; + if (proxy['ws-opts'] && proxy['ws-opts']['v2ray-http-upgrade']) { + transport.type = 'httpupgrade'; + if (transport.headers.Host) { + transport.host = transport.headers.Host[0]; + delete transport.headers.Host; + } + if (transport.max_early_data) delete transport.max_early_data; + if (transport.early_data_header_name) + delete transport.early_data_header_name; + } + for (const key of Object.keys(transport.headers)) { + const value = transport.headers[key]; + if (value.length === 1) transport.headers[key] = value[0]; + } + parsedProxy.transport = transport; +}; + +const h1Parser = (proxy, parsedProxy) => { + const transport = { type: 'http', headers: {} }; + if (proxy['http-opts']) { + const { + method = '', + path: h1Path = '', + headers: h1Headers = {}, + } = proxy['http-opts']; + if (method !== '') transport.method = method; + if (Array.isArray(h1Path)) { + transport.path = `${h1Path[0]}`; + } else if (h1Path !== '') transport.path = `${h1Path}`; + for (const key of Object.keys(h1Headers)) { + let value = h1Headers[key]; + if (value === '') continue; + if (key.toLowerCase() === 'host') { + let host = value; + if (!Array.isArray(host)) + host = `${host}`.split(',').map((i) => i.trim()); + if (host.length > 0) transport.host = host; + continue; + } + if (!Array.isArray(value)) + value = `${value}`.split(',').map((i) => i.trim()); + if (value.length > 0) transport.headers[key] = value; + } + } + if (proxy['http-host'] && proxy['http-host'] !== '') { + let host = proxy['http-host']; + if (!Array.isArray(host)) + host = `${host}`.split(',').map((i) => i.trim()); + if (host.length > 0) transport.host = host; + } + if (!transport.host) return; + if (proxy['http-path'] && proxy['http-path'] !== '') { + const path = proxy['http-path']; + if (Array.isArray(path)) { + transport.path = `${path[0]}`; + } else if (path !== '') transport.path = `${path}`; + } + if (parsedProxy.tls.insecure) + parsedProxy.tls.server_name = transport.host[0]; + if (transport.host.length === 1) transport.host = transport.host[0]; + for (const key of Object.keys(transport.headers)) { + const value = transport.headers[key]; + if (value.length === 1) transport.headers[key] = value[0]; + } + parsedProxy.transport = transport; +}; + +const h2Parser = (proxy, parsedProxy) => { + const transport = { type: 'http' }; + if (proxy['h2-opts']) { + let { host = '', path = '' } = proxy['h2-opts']; + if (path !== '') transport.path = `${path}`; + if (host !== '') { + if (!Array.isArray(host)) + host = `${host}`.split(',').map((i) => i.trim()); + if (host.length > 0) transport.host = host; + } + } + if (proxy['h2-host'] && proxy['h2-host'] !== '') { + let host = proxy['h2-host']; + if (!Array.isArray(host)) + host = `${host}`.split(',').map((i) => i.trim()); + if (host.length > 0) transport.host = host; + } + if (proxy['h2-path'] && proxy['h2-path'] !== '') + transport.path = `${proxy['h2-path']}`; + parsedProxy.tls.enabled = true; + if (parsedProxy.tls.insecure) + parsedProxy.tls.server_name = transport.host[0]; + if (transport.host.length === 1) transport.host = transport.host[0]; + parsedProxy.transport = transport; +}; + +const grpcParser = (proxy, parsedProxy) => { + const transport = { type: 'grpc' }; + if (proxy['grpc-opts']) { + const serviceName = proxy['grpc-opts']['grpc-service-name']; + if (serviceName && serviceName !== '') + transport.service_name = serviceName; + } + parsedProxy.transport = transport; +}; + +const tlsParser = (proxy, parsedProxy) => { + if (proxy.tls) parsedProxy.tls.enabled = true; + if (proxy.servername && proxy.servername !== '') + parsedProxy.tls.server_name = proxy.servername; + if (proxy.peer && proxy.peer !== '') + parsedProxy.tls.server_name = proxy.peer; + if (proxy.sni && proxy.sni !== '') parsedProxy.tls.server_name = proxy.sni; + if (proxy['skip-cert-verify']) parsedProxy.tls.insecure = true; + if (proxy.insecure) parsedProxy.tls.insecure = true; + if (proxy['disable-sni']) parsedProxy.tls.disable_sni = true; + if (typeof proxy.alpn === 'string') { + parsedProxy.tls.alpn = [proxy.alpn]; + } else if (Array.isArray(proxy.alpn)) parsedProxy.tls.alpn = proxy.alpn; + if (proxy.ca) parsedProxy.tls.certificate_path = `${proxy.ca}`; + if (proxy.ca_str) parsedProxy.tls.certificate = proxy.ca_sStr; + if (proxy['ca-str']) parsedProxy.tls.certificate = proxy['ca-str']; + if (proxy['client-fingerprint'] && proxy['client-fingerprint'] !== '') + parsedProxy.tls.utls = { + enabled: true, + fingerprint: proxy['client-fingerprint'], + }; + if (proxy['reality-opts']) { + parsedProxy.tls.reality = { enabled: true }; + if (proxy['reality-opts']['public-key']) + parsedProxy.tls.reality.public_key = + proxy['reality-opts']['public-key']; + if (proxy['reality-opts']['short-id']) + parsedProxy.tls.reality.short_id = + proxy['reality-opts']['short-id']; + } + if (!parsedProxy.tls.enabled) delete parsedProxy.tls; +}; + +const httpParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'http', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + tls: { enabled: false, server_name: proxy.server, insecure: false }, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy.username) parsedProxy.username = proxy.username; + if (proxy.password) parsedProxy.password = proxy.password; + if (proxy.headers) { + parsedProxy.headers = {}; + for (const k of Object.keys(proxy.headers)) { + parsedProxy.headers[k] = `${proxy.headers[k]}`; + } + if (Object.keys(parsedProxy.headers).length === 0) + delete parsedProxy.headers; + } + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + tfoParser(proxy, parsedProxy); + tlsParser(proxy, parsedProxy); + return parsedProxy; +}; + +const socks5Parser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'socks', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + password: proxy.password, + version: '5', + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy.username) parsedProxy.username = proxy.username; + if (proxy.password) parsedProxy.password = proxy.password; + if (proxy.uot) parsedProxy.udp_over_tcp = true; + if (proxy['udp-over-tcp']) parsedProxy.udp_over_tcp = true; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + tfoParser(proxy, parsedProxy); + return parsedProxy; +}; + +const ssParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'shadowsocks', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + method: proxy.cipher, + password: proxy.password, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy.uot) parsedProxy.udp_over_tcp = true; + if (proxy['udp-over-tcp']) parsedProxy.udp_over_tcp = true; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + tfoParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + if (proxy.plugin) { + const optArr = []; + if (proxy.plugin === 'obfs') { + parsedProxy.plugin = 'obfs-local'; + parsedProxy.plugin_opts = ''; + if (proxy['obfs-host']) + proxy['plugin-opts'].host = proxy['obfs-host']; + Object.keys(proxy['plugin-opts']).forEach((k) => { + switch (k) { + case 'mode': + optArr.push(`obfs=${proxy['plugin-opts'].mode}`); + break; + case 'host': + optArr.push(`obfs-host=${proxy['plugin-opts'].host}`); + break; + default: + optArr.push(`${k}=${proxy['plugin-opts'][k]}`); + break; + } + }); + } + if (proxy.plugin === 'v2ray-plugin') { + parsedProxy.plugin = 'v2ray-plugin'; + if (proxy['ws-host']) proxy['plugin-opts'].host = proxy['ws-host']; + if (proxy['ws-path']) proxy['plugin-opts'].path = proxy['ws-path']; + Object.keys(proxy['plugin-opts']).forEach((k) => { + switch (k) { + case 'tls': + if (proxy['plugin-opts'].tls) optArr.push('tls'); + break; + case 'host': + optArr.push(`host=${proxy['plugin-opts'].host}`); + break; + case 'path': + optArr.push(`path=${proxy['plugin-opts'].path}`); + break; + case 'headers': + optArr.push( + `headers=${JSON.stringify( + proxy['plugin-opts'].headers, + )}`, + ); + break; + case 'mux': + if (proxy['plugin-opts'].mux) + parsedProxy.multiplex = { enabled: true }; + break; + default: + optArr.push(`${k}=${proxy['plugin-opts'][k]}`); + } + }); + } + parsedProxy.plugin_opts = optArr.join(';'); + } + + return parsedProxy; +}; +// eslint-disable-next-line no-unused-vars +const ssrParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'shadowsocksr', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + method: proxy.cipher, + password: proxy.password, + obfs: proxy.obfs, + protocol: proxy.protocol, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy['obfs-param']) parsedProxy.obfs_param = proxy['obfs-param']; + if (proxy['protocol-param'] && proxy['protocol-param'] !== '') + parsedProxy.protocol_param = proxy['protocol-param']; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + tfoParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; + +const vmessParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'vmess', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + uuid: proxy.uuid, + security: proxy.cipher, + alter_id: parseInt(`${proxy.alterId}`, 10), + tls: { enabled: false, server_name: proxy.server, insecure: false }, + }; + if ( + [ + 'auto', + 'none', + 'zero', + 'aes-128-gcm', + 'chacha20-poly1305', + 'aes-128-ctr', + ].indexOf(parsedProxy.security) === -1 + ) + parsedProxy.security = 'auto'; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy.xudp) parsedProxy.packet_encoding = 'xudp'; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + if (proxy.network === 'ws') wsParser(proxy, parsedProxy); + if (proxy.network === 'h2') h2Parser(proxy, parsedProxy); + if (proxy.network === 'http') h1Parser(proxy, parsedProxy); + if (proxy.network === 'grpc') grpcParser(proxy, parsedProxy); + + tfoParser(proxy, parsedProxy); + tlsParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; + +const vlessParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'vless', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + uuid: proxy.uuid, + tls: { enabled: false, server_name: proxy.server, insecure: false }, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + if (proxy.flow === 'xtls-rprx-vision') parsedProxy.flow = proxy.flow; + if (proxy.network === 'ws') wsParser(proxy, parsedProxy); + if (proxy.network === 'grpc') grpcParser(proxy, parsedProxy); + + tfoParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + tlsParser(proxy, parsedProxy); + return parsedProxy; +}; +const trojanParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'trojan', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + password: proxy.password, + tls: { enabled: true, server_name: proxy.server, insecure: false }, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + if (proxy.network === 'grpc') grpcParser(proxy, parsedProxy); + if (proxy.network === 'ws') wsParser(proxy, parsedProxy); + + tfoParser(proxy, parsedProxy); + tlsParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; +const hysteriaParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'hysteria', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + disable_mtu_discovery: false, + tls: { enabled: true, server_name: proxy.server, insecure: false }, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy.auth_str) parsedProxy.auth_str = `${proxy.auth_str}`; + if (proxy['auth-str']) parsedProxy.auth_str = `${proxy['auth-str']}`; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + // eslint-disable-next-line no-control-regex + const reg = new RegExp('^[0-9]+[ \t]*[KMGT]*[Bb]ps$'); + if (reg.test(`${proxy.up}`)) { + parsedProxy.up = `${proxy.up}`; + } else { + parsedProxy.up_mbps = parseInt(`${proxy.up}`, 10); + } + if (reg.test(`${proxy.down}`)) { + parsedProxy.down = `${proxy.down}`; + } else { + parsedProxy.down_mbps = parseInt(`${proxy.down}`, 10); + } + if (proxy.obfs) parsedProxy.obfs = proxy.obfs; + if (proxy.recv_window_conn) + parsedProxy.recv_window_conn = proxy.recv_window_conn; + if (proxy['recv-window-conn']) + parsedProxy.recv_window_conn = proxy['recv-window-conn']; + if (proxy.recv_window) parsedProxy.recv_window = proxy.recv_window; + if (proxy['recv-window']) parsedProxy.recv_window = proxy['recv-window']; + if (proxy.disable_mtu_discovery) { + if (typeof proxy.disable_mtu_discovery === 'boolean') { + parsedProxy.disable_mtu_discovery = proxy.disable_mtu_discovery; + } else { + if (proxy.disable_mtu_discovery === 1) + parsedProxy.disable_mtu_discovery = true; + } + } + tlsParser(proxy, parsedProxy); + tfoParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; +const hysteria2Parser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'hysteria2', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + password: proxy.password, + obfs: {}, + tls: { enabled: true, server_name: proxy.server, insecure: false }, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy.up) parsedProxy.up_mbps = parseInt(`${proxy.up}`, 10); + if (proxy.down) parsedProxy.down_mbps = parseInt(`${proxy.down}`, 10); + if (proxy.obfs === 'salamander') parsedProxy.obfs.type = 'salamander'; + if (proxy['obfs-password']) + parsedProxy.obfs.password = proxy['obfs-password']; + if (!parsedProxy.obfs.type) delete parsedProxy.obfs; + tlsParser(proxy, parsedProxy); + tfoParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; +const tuic5Parser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'tuic', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + uuid: proxy.uuid, + password: proxy.password, + tls: { enabled: true, server_name: proxy.server, insecure: false }, + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + if ( + proxy['congestion-controller'] && + proxy['congestion-controller'] !== 'cubic' + ) + parsedProxy.congestion_control = proxy['congestion-controller']; + if (proxy['udp-relay-mode'] && proxy['udp-relay-mode'] !== 'native') + parsedProxy.udp_relay_mode = proxy['udp-relay-mode']; + if (proxy['reduce-rtt']) parsedProxy.zero_rtt_handshake = true; + if (proxy['udp-over-stream']) parsedProxy.udp_over_stream = true; + if (proxy['heartbeat-interval']) + parsedProxy.heartbeat = `${proxy['heartbeat-interval']}ms`; + tfoParser(proxy, parsedProxy); + tlsParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; + +const wireguardParser = (proxy = {}) => { + const parsedProxy = { + tag: proxy.name, + type: 'wireguard', + server: proxy.server, + server_port: parseInt(`${proxy.port}`, 10), + local_address: [proxy.ip, proxy.ipv6], + private_key: proxy['private-key'], + peer_public_key: proxy['public-key'], + pre_shared_key: proxy['pre-shared-key'], + reserved: [], + }; + if (parsedProxy.server_port < 1 || parsedProxy.server_port > 65535) + throw 'invalid port'; + if (proxy['fast-open']) parsedProxy.udp_fragment = true; + if (typeof proxy.reserved === 'string') { + parsedProxy.reserved.push(proxy.reserved); + } else { + for (const r of proxy.reserved) parsedProxy.reserved.push(r); + } + if (proxy.peers && proxy.peers.length > 0) { + parsedProxy.peers = []; + for (const p of proxy.peers) { + const peer = { + server: p.server, + server_port: parseInt(`${p.port}`, 10), + public_key: p['public-key'], + allowed_ips: p.allowed_ips, + reserved: [], + }; + if (typeof p.reserved === 'string') { + peer.reserved.push(p.reserved); + } else { + for (const r of p.reserved) peer.reserved.push(r); + } + if (p['pre-shared-key']) peer.pre_shared_key = p['pre-shared-key']; + parsedProxy.peers.push(peer); + } + } + tfoParser(proxy, parsedProxy); + smuxParser(proxy.smux, parsedProxy); + return parsedProxy; +}; + +export default function singbox_Producer() { + const type = 'ALL'; + const produce = (proxies, type, opts = {}) => { + const list = []; + ClashMeta_Producer() + .produce(proxies, 'internal', { 'include-unsupported-proxy': true }) + .map((proxy) => { + try { + switch (proxy.type) { + case 'http': + list.push(httpParser(proxy)); + break; + case 'socks5': + if (proxy.tls) { + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type} with tls`, + ); + } else { + list.push(socks5Parser(proxy)); + } + break; + case 'ss': + if (proxy.plugin === 'shadow-tls') { + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type} with shadow-tls`, + ); + } else { + list.push(ssParser(proxy)); + } + break; + case 'ssr': + if (opts['include-unsupported-proxy']) { + list.push(ssrParser(proxy)); + } else { + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type}`, + ); + } + break; + case 'vmess': + if ( + !proxy.network || + ['ws', 'grpc', 'h2', 'http'].includes( + proxy.network, + ) + ) { + list.push(vmessParser(proxy)); + } else { + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type} with network ${proxy.network}`, + ); + } + break; + case 'vless': + if ( + !proxy.flow || + ['xtls-rprx-vision'].includes(proxy.flow) + ) { + list.push(vlessParser(proxy)); + } else { + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type} with flow ${proxy.flow}`, + ); + } + break; + case 'trojan': + if (!proxy.flow) { + list.push(trojanParser(proxy)); + } else { + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type} with flow ${proxy.flow}`, + ); + } + break; + case 'hysteria': + list.push(hysteriaParser(proxy)); + break; + case 'hysteria2': + list.push(hysteria2Parser(proxy)); + break; + case 'tuic': + if (!proxy.token || proxy.token.length === 0) { + list.push(tuic5Parser(proxy)); + } else { + throw new Error( + `Platform sing-box does not support proxy type: TUIC v4`, + ); + } + break; + case 'wireguard': + list.push(wireguardParser(proxy)); + break; + default: + throw new Error( + `Platform sing-box does not support proxy type: ${proxy.type}`, + ); + } + } catch (e) { + // console.log(e); + $.error(e.message ?? e); + } + }); + return type === 'internal' ? list : JSON.stringify(list, null, 2); + }; + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/producers/stash.js b/backend/src/core/proxy-utils/producers/stash.js new file mode 100644 index 000000000..25cab3da6 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/stash.js @@ -0,0 +1,242 @@ +import { isPresent } from '@/core/proxy-utils/producers/utils'; + +export default function Stash_Producer() { + const type = 'ALL'; + const produce = (proxies) => { + // https://stash.wiki/proxy-protocols/proxy-types#shadowsocks + return ( + 'proxies:\n' + + proxies + .filter((proxy) => { + if ( + ![ + 'ss', + 'ssr', + 'vmess', + 'socks5', + 'http', + 'snell', + 'trojan', + 'tuic', + 'vless', + 'wireguard', + 'hysteria', + 'hysteria2', + ].includes(proxy.type) || + (proxy.type === 'ss' && + ![ + 'aes-128-gcm', + 'aes-192-gcm', + 'aes-256-gcm', + 'aes-128-cfb', + 'aes-192-cfb', + 'aes-256-cfb', + 'aes-128-ctr', + 'aes-192-ctr', + 'aes-256-ctr', + 'rc4-md5', + 'chacha20-ietf', + 'xchacha20', + 'chacha20-ietf-poly1305', + 'xchacha20-ietf-poly1305', + ].includes(proxy.cipher)) || + (proxy.type === 'snell' && + String(proxy.version) === '4') || + (proxy.type === 'vless' && proxy['reality-opts']) + ) { + return false; + } + return true; + }) + .map((proxy) => { + if (proxy.type === 'vmess') { + // handle vmess aead + if (isPresent(proxy, 'aead')) { + if (proxy.aead) { + proxy.alterId = 0; + } + delete proxy.aead; + } + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/docs/config.yaml#L400 + // https://stash.wiki/proxy-protocols/proxy-types#vmess + if ( + isPresent(proxy, 'cipher') && + ![ + 'auto', + 'aes-128-gcm', + 'chacha20-poly1305', + 'none', + ].includes(proxy.cipher) + ) { + proxy.cipher = 'auto'; + } + } else if (proxy.type === 'tuic') { + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } else { + proxy.alpn = ['h3']; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + delete proxy.tfo; + } + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/adapter/outbound/tuic.go#L197 + if ( + (!proxy.token || proxy.token.length === 0) && + !isPresent(proxy, 'version') + ) { + proxy.version = 5; + } + } else if (proxy.type === 'hysteria') { + // auth_str 将会在未来某个时候删除 但是有的机场不规范 + if ( + isPresent(proxy, 'auth_str') && + !isPresent(proxy, 'auth-str') + ) { + proxy['auth-str'] = proxy['auth_str']; + } + if (isPresent(proxy, 'alpn')) { + proxy.alpn = Array.isArray(proxy.alpn) + ? proxy.alpn + : [proxy.alpn]; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + delete proxy.tfo; + } + if ( + isPresent(proxy, 'down') && + !isPresent(proxy, 'down-speed') + ) { + proxy['down-speed'] = proxy.down; + delete proxy.down; + } + if ( + isPresent(proxy, 'up') && + !isPresent(proxy, 'up-speed') + ) { + proxy['up-speed'] = proxy.up; + delete proxy.up; + } + if (isPresent(proxy, 'down-speed')) { + proxy['down-speed'] = + `${proxy['down-speed']}`.match(/\d+/)?.[0] || 0; + } + if (isPresent(proxy, 'up-speed')) { + proxy['up-speed'] = + `${proxy['up-speed']}`.match(/\d+/)?.[0] || 0; + } + } else if (proxy.type === 'hysteria2') { + if ( + isPresent(proxy, 'password') && + !isPresent(proxy, 'auth') + ) { + proxy.auth = proxy.password; + delete proxy.password; + } + if ( + isPresent(proxy, 'tfo') && + !isPresent(proxy, 'fast-open') + ) { + proxy['fast-open'] = proxy.tfo; + delete proxy.tfo; + } + if ( + isPresent(proxy, 'down') && + !isPresent(proxy, 'down-speed') + ) { + proxy['down-speed'] = proxy.down; + delete proxy.down; + } + if ( + isPresent(proxy, 'up') && + !isPresent(proxy, 'up-speed') + ) { + proxy['up-speed'] = proxy.up; + delete proxy.up; + } + if (isPresent(proxy, 'down-speed')) { + proxy['down-speed'] = + `${proxy['down-speed']}`.match(/\d+/)?.[0] || 0; + } + if (isPresent(proxy, 'up-speed')) { + proxy['up-speed'] = + `${proxy['up-speed']}`.match(/\d+/)?.[0] || 0; + } + } else if (proxy.type === 'wireguard') { + proxy.keepalive = + proxy.keepalive ?? proxy['persistent-keepalive']; + proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; + } else if (proxy.type === 'vless') { + if (isPresent(proxy, 'sni')) { + proxy.servername = proxy.sni; + delete proxy.sni; + } + } + + if ( + ['vmess', 'vless'].includes(proxy.type) && + proxy.network === 'http' + ) { + let httpPath = proxy['http-opts']?.path; + if ( + isPresent(proxy, 'http-opts.path') && + !Array.isArray(httpPath) + ) { + proxy['http-opts'].path = [httpPath]; + } + let httpHost = proxy['http-opts']?.headers?.Host; + if ( + isPresent(proxy, 'http-opts.headers.Host') && + !Array.isArray(httpHost) + ) { + proxy['http-opts'].headers.Host = [httpHost]; + } + } + if ( + ['trojan', 'tuic', 'hysteria', 'hysteria2'].includes( + proxy.type, + ) + ) { + delete proxy.tls; + } + if (proxy['tls-fingerprint']) { + proxy.fingerprint = proxy['tls-fingerprint']; + } + delete proxy['tls-fingerprint']; + + if (proxy['test-url']) { + proxy['benchmark-url'] = proxy['test-url']; + delete proxy['test-url']; + } + + delete proxy.subName; + delete proxy.collectionName; + if ( + ['grpc'].includes(proxy.network) && + proxy[`${proxy.network}-opts`] + ) { + delete proxy[`${proxy.network}-opts`]['_grpc-type']; + } + return ' - ' + JSON.stringify(proxy) + '\n'; + }) + .join('') + ); + }; + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/producers/surfboard.js b/backend/src/core/proxy-utils/producers/surfboard.js new file mode 100644 index 000000000..5c7658e90 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/surfboard.js @@ -0,0 +1,199 @@ +import { Result, isPresent } from './utils'; +import { isNotBlank } from '@/utils'; +// import $ from '@/core/app'; + +const targetPlatform = 'Surfboard'; + +export default function Surfboard_Producer() { + const produce = (proxy) => { + switch (proxy.type) { + case 'ss': + return shadowsocks(proxy); + case 'trojan': + return trojan(proxy); + case 'vmess': + return vmess(proxy); + case 'http': + return http(proxy); + case 'socks5': + return socks5(proxy); + case 'wireguard-surge': + return wireguard(proxy); + } + throw new Error( + `Platform ${targetPlatform} does not support proxy type: ${proxy.type}`, + ); + }; + return { produce }; +} + +function shadowsocks(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.append(`,encrypt-method=${proxy.cipher}`); + result.appendIfPresent(`,password=${proxy.password}`, 'password'); + + // obfs + if (isPresent(proxy, 'plugin')) { + if (proxy.plugin === 'obfs') { + result.append(`,obfs=${proxy['plugin-opts'].mode}`); + result.appendIfPresent( + `,obfs-host=${proxy['plugin-opts'].host}`, + 'plugin-opts.host', + ); + result.appendIfPresent( + `,obfs-uri=${proxy['plugin-opts'].path}`, + 'plugin-opts.path', + ); + } else { + throw new Error(`plugin ${proxy.plugin} is not supported`); + } + } + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function trojan(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,password=${proxy.password}`, 'password'); + + // transport + handleTransport(result, proxy); + + // tls + result.appendIfPresent(`,tls=${proxy.tls}`, 'tls'); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function vmess(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,username=${proxy.uuid}`, 'uuid'); + + // transport + handleTransport(result, proxy); + + // AEAD + if (isPresent(proxy, 'aead')) { + result.append(`,vmess-aead=${proxy.aead}`); + } else { + result.append(`,vmess-aead=${proxy.alterId === 0}`); + } + + // tls + result.appendIfPresent(`,tls=${proxy.tls}`, 'tls'); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function http(proxy) { + const result = new Result(proxy); + const type = proxy.tls ? 'https' : 'http'; + result.append(`${proxy.name}=${type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,${proxy.username}`, 'username'); + result.appendIfPresent(`,${proxy.password}`, 'password'); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function socks5(proxy) { + const result = new Result(proxy); + const type = proxy.tls ? 'socks5-tls' : 'socks5'; + result.append(`${proxy.name}=${type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,${proxy.username}`, 'username'); + result.appendIfPresent(`,${proxy.password}`, 'password'); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + return result.toString(); +} + +function wireguard(proxy) { + const result = new Result(proxy); + + result.append(`${proxy.name}=wireguard`); + + result.appendIfPresent( + `,section-name=${proxy['section-name']}`, + 'section-name', + ); + + return result.toString(); +} + +function handleTransport(result, proxy) { + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + result.append(`,ws=true`); + if (isPresent(proxy, 'ws-opts')) { + result.appendIfPresent( + `,ws-path=${proxy['ws-opts'].path}`, + 'ws-opts.path', + ); + if (isPresent(proxy, 'ws-opts.headers')) { + const headers = proxy['ws-opts'].headers; + const value = Object.keys(headers) + .map((k) => { + let v = headers[k]; + if (['Host'].includes(k)) { + v = `"${v}"`; + } + return `${k}:${v}`; + }) + .join('|'); + if (isNotBlank(value)) { + result.append(`,ws-headers=${value}`); + } + } + } + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + } +} diff --git a/backend/src/core/proxy-utils/producers/surge.js b/backend/src/core/proxy-utils/producers/surge.js new file mode 100644 index 000000000..2754b8031 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/surge.js @@ -0,0 +1,687 @@ +import { Result, isPresent } from './utils'; +import { isNotBlank } from '@/utils'; +import $ from '@/core/app'; + +const targetPlatform = 'Surge'; + +const ipVersions = { + dual: 'dual', + ipv4: 'v4-only', + ipv6: 'v6-only', + 'ipv4-prefer': 'prefer-v4', + 'ipv6-prefer': 'prefer-v6', +}; + +export default function Surge_Producer() { + const produce = (proxy) => { + switch (proxy.type) { + case 'ss': + return shadowsocks(proxy); + case 'trojan': + return trojan(proxy); + case 'vmess': + return vmess(proxy); + case 'http': + return http(proxy); + case 'socks5': + return socks5(proxy); + case 'snell': + return snell(proxy); + case 'tuic': + return tuic(proxy); + case 'wireguard-surge': + return wireguard(proxy); + case 'hysteria2': + return hysteria2(proxy); + } + throw new Error( + `Platform ${targetPlatform} does not support proxy type: ${proxy.type}`, + ); + }; + return { produce }; +} + +function shadowsocks(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.append(`,encrypt-method=${proxy.cipher}`); + result.appendIfPresent(`,password=${proxy.password}`, 'password'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // obfs + if (isPresent(proxy, 'plugin')) { + if (proxy.plugin === 'obfs') { + result.append(`,obfs=${proxy['plugin-opts'].mode}`); + result.appendIfPresent( + `,obfs-host=${proxy['plugin-opts'].host}`, + 'plugin-opts.host', + ); + result.appendIfPresent( + `,obfs-uri=${proxy['plugin-opts'].path}`, + 'plugin-opts.path', + ); + } else { + throw new Error(`plugin ${proxy.plugin} is not supported`); + } + } + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + return result.toString(); +} + +function trojan(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,password=${proxy.password}`, 'password'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // transport + handleTransport(result, proxy); + + // tls + result.appendIfPresent(`,tls=${proxy.tls}`, 'tls'); + + // tls fingerprint + result.appendIfPresent( + `,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + return result.toString(); +} + +function vmess(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,username=${proxy.uuid}`, 'uuid'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // transport + handleTransport(result, proxy); + + // AEAD + if (isPresent(proxy, 'aead')) { + result.append(`,vmess-aead=${proxy.aead}`); + } else { + result.append(`,vmess-aead=${proxy.alterId === 0}`); + } + + // tls fingerprint + result.appendIfPresent( + `,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls + result.appendIfPresent(`,tls=${proxy.tls}`, 'tls'); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + return result.toString(); +} + +function http(proxy) { + const result = new Result(proxy); + const type = proxy.tls ? 'https' : 'http'; + result.append(`${proxy.name}=${type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,${proxy.username}`, 'username'); + result.appendIfPresent(`,${proxy.password}`, 'password'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // tls fingerprint + result.appendIfPresent( + `,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + return result.toString(); +} + +function socks5(proxy) { + const result = new Result(proxy); + const type = proxy.tls ? 'socks5-tls' : 'socks5'; + result.append(`${proxy.name}=${type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,${proxy.username}`, 'username'); + result.appendIfPresent(`,${proxy.password}`, 'password'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // tls fingerprint + result.appendIfPresent( + `,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + if (proxy.tfo) { + $.info(`Option tfo is not supported by Surge, thus omitted`); + } + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + return result.toString(); +} + +function snell(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=${proxy.type},${proxy.server},${proxy.port}`); + result.appendIfPresent(`,version=${proxy.version}`, 'version'); + result.appendIfPresent(`,psk=${proxy.psk}`, 'psk'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // obfs + result.appendIfPresent( + `,obfs=${proxy['obfs-opts']?.mode}`, + 'obfs-opts.mode', + ); + result.appendIfPresent( + `,obfs-host=${proxy['obfs-opts']?.host}`, + 'obfs-opts.host', + ); + result.appendIfPresent( + `,obfs-uri=${proxy['obfs-opts']?.path}`, + 'obfs-opts.path', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + // udp + result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + // reuse + result.appendIfPresent(`,reuse=${proxy['reuse']}`, 'reuse'); + + return result.toString(); +} + +function tuic(proxy) { + const result = new Result(proxy); + // https://github.com/MetaCubeX/Clash.Meta/blob/Alpha/adapter/outbound/tuic.go#L197 + let type = proxy.type; + if (!proxy.token || proxy.token.length === 0) { + type = 'tuic-v5'; + } + result.append(`${proxy.name}=${type},${proxy.server},${proxy.port}`); + + result.appendIfPresent(`,uuid=${proxy.uuid}`, 'uuid'); + result.appendIfPresent(`,password=${proxy.password}`, 'password'); + result.appendIfPresent(`,token=${proxy.token}`, 'token'); + + result.appendIfPresent( + `,alpn=${Array.isArray(proxy.alpn) ? proxy.alpn[0] : proxy.alpn}`, + 'alpn', + ); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tls fingerprint + result.appendIfPresent( + `,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tfo + if (isPresent(proxy, 'tfo')) { + result.append(`,tfo=${proxy['tfo']}`); + } else if (isPresent(proxy, 'fast-open')) { + result.append(`,tfo=${proxy['fast-open']}`); + } + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + result.appendIfPresent(`,ecn=${proxy.ecn}`, 'ecn'); + + return result.toString(); +} + +function wireguard(proxy) { + const result = new Result(proxy); + + result.append(`${proxy.name}=wireguard`); + + result.appendIfPresent( + `,section-name=${proxy['section-name']}`, + 'section-name', + ); + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + return result.toString(); +} + +function hysteria2(proxy) { + if (proxy.obfs || proxy['obfs-password']) { + throw new Error(`obfs is unsupported`); + } + const result = new Result(proxy); + result.append(`${proxy.name}=hysteria2,${proxy.server},${proxy.port}`); + + result.appendIfPresent(`,password=${proxy.password}`, 'password'); + + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + + // tls verification + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + result.appendIfPresent( + `,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + + // tfo + if (isPresent(proxy, 'tfo')) { + result.append(`,tfo=${proxy['tfo']}`); + } else if (isPresent(proxy, 'fast-open')) { + result.append(`,tfo=${proxy['fast-open']}`); + } + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + } + + // block-quic + result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic'); + + // underlying-proxy + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + + // download-bandwidth + result.appendIfPresent( + `,download-bandwidth=${`${proxy['down']}`.match(/\d+/)?.[0] || 0}`, + 'down', + ); + + result.appendIfPresent(`,ecn=${proxy.ecn}`, 'ecn'); + + return result.toString(); +} + +function handleTransport(result, proxy) { + if (isPresent(proxy, 'network')) { + if (proxy.network === 'ws') { + result.append(`,ws=true`); + if (isPresent(proxy, 'ws-opts')) { + result.appendIfPresent( + `,ws-path=${proxy['ws-opts'].path}`, + 'ws-opts.path', + ); + if (isPresent(proxy, 'ws-opts.headers')) { + const headers = proxy['ws-opts'].headers; + const value = Object.keys(headers) + .map((k) => { + let v = headers[k]; + if (['Host'].includes(k)) { + v = `"${v}"`; + } + return `${k}:${v}`; + }) + .join('|'); + if (isNotBlank(value)) { + result.append(`,ws-headers=${value}`); + } + } + } + } else { + throw new Error(`network ${proxy.network} is unsupported`); + } + } +} diff --git a/backend/src/core/proxy-utils/producers/surgemac.js b/backend/src/core/proxy-utils/producers/surgemac.js new file mode 100644 index 000000000..ca8a3bb52 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/surgemac.js @@ -0,0 +1,50 @@ +import { Result } from './utils'; +import Surge_Producer from './surge'; + +// const targetPlatform = 'SurgeMac'; + +const surge_Producer = Surge_Producer(); + +export default function SurgeMac_Producer() { + const produce = (proxy) => { + switch (proxy.type) { + case 'ssr': + return shadowsocksr(proxy); + default: + return surge_Producer.produce(proxy); + } + }; + return { produce }; +} + +function shadowsocksr(proxy) { + const result = new Result(proxy); + + proxy.local_port = '__SubStoreLocalPort__'; + proxy.local_address = proxy.local_address ?? '127.0.0.1'; + + result.append( + `${proxy.name} = external, exec = "${ + proxy.exec || '/usr/local/bin/ssr-local' + }", address = "${proxy.server}", local-port = ${proxy.local_port}`, + ); + + for (const [key, value] of Object.entries({ + cipher: '-m', + obfs: '-o', + password: '-k', + port: '-p', + protocol: '-O', + 'protocol-param': '-G', + server: '-s', + local_port: '-l', + local_address: '-b', + })) { + result.appendIfPresent( + `, args = "${value}", args = "${proxy[key]}"`, + key, + ); + } + + return result.toString(); +} diff --git a/backend/src/core/proxy-utils/producers/uri.js b/backend/src/core/proxy-utils/producers/uri.js new file mode 100644 index 000000000..179173543 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/uri.js @@ -0,0 +1,286 @@ +/* eslint-disable no-case-declarations */ +import { Base64 } from 'js-base64'; +import { isIPv6 } from '@/utils'; + +export default function URI_Producer() { + const type = 'SINGLE'; + const produce = (proxy) => { + let result = ''; + if (proxy.server && isIPv6(proxy.server)) { + proxy.server = `[${proxy.server}]`; + } + switch (proxy.type) { + case 'ss': + const userinfo = `${proxy.cipher}:${proxy.password}`; + result = `ss://${Base64.encode(userinfo)}@${proxy.server}:${ + proxy.port + }/`; + if (proxy.plugin) { + result += '?plugin='; + const opts = proxy['plugin-opts']; + switch (proxy.plugin) { + case 'obfs': + result += encodeURIComponent( + `simple-obfs;obfs=${opts.mode}${ + opts.host ? ';obfs-host=' + opts.host : '' + }`, + ); + break; + case 'v2ray-plugin': + result += encodeURIComponent( + `v2ray-plugin;obfs=${opts.mode}${ + opts.host ? ';obfs-host' + opts.host : '' + }${opts.tls ? ';tls' : ''}`, + ); + break; + default: + throw new Error( + `Unsupported plugin option: ${proxy.plugin}`, + ); + } + } + result += `#${encodeURIComponent(proxy.name)}`; + break; + case 'ssr': + result = `${proxy.server}:${proxy.port}:${proxy.protocol}:${ + proxy.cipher + }:${proxy.obfs}:${Base64.encode(proxy.password)}/`; + result += `?remarks=${Base64.encode(proxy.name)}${ + proxy['obfs-param'] + ? '&obfsparam=' + Base64.encode(proxy['obfs-param']) + : '' + }${ + proxy['protocol-param'] + ? '&protocolparam=' + + Base64.encode(proxy['protocol-param']) + : '' + }`; + result = 'ssr://' + Base64.encode(result); + break; + case 'vmess': + // V2RayN URI format + let type = ''; + let net = proxy.network || 'tcp'; + if (proxy.network === 'http') { + net = 'tcp'; + type = 'http'; + } + result = { + v: '2', + ps: proxy.name, + add: proxy.server, + port: proxy.port, + id: proxy.uuid, + type, + aid: 0, + net, + tls: proxy.tls ? 'tls' : '', + }; + if (proxy.tls && proxy.sni) { + result.sni = proxy.sni; + } + // obfs + if (proxy.network) { + let vmessTransportPath = + proxy[`${proxy.network}-opts`]?.path; + let vmessTransportHost = + proxy[`${proxy.network}-opts`]?.headers?.Host; + if (vmessTransportPath) { + result.path = Array.isArray(vmessTransportPath) + ? vmessTransportPath[0] + : vmessTransportPath; + } + if (vmessTransportHost) { + result.host = Array.isArray(vmessTransportHost) + ? vmessTransportHost[0] + : vmessTransportHost; + } + if (['grpc'].includes(proxy.network)) { + result.path = + proxy[`${proxy.network}-opts`]?.[ + 'grpc-service-name' + ]; + // https://github.com/XTLS/Xray-core/issues/91 + result.type = + proxy[`${proxy.network}-opts`]?.['_grpc-type'] || + 'gun'; + } + } + result = 'vmess://' + Base64.encode(JSON.stringify(result)); + break; + case 'vless': + let security = 'none'; + const isReality = proxy['reality-opts']; + let sid = ''; + let pbk = ''; + if (isReality) { + security = 'reality'; + const publicKey = proxy['reality-opts']?.['public-key']; + if (publicKey) { + pbk = `&pbk=${encodeURIComponent(publicKey)}`; + } + const shortId = proxy['reality-opts']?.['short-id']; + if (shortId) { + sid = `&sid=${encodeURIComponent(shortId)}`; + } + } else if (proxy.tls) { + security = 'tls'; + } + let alpn = ''; + if (proxy.alpn) { + alpn = `&alpn=${encodeURIComponent( + Array.isArray(proxy.alpn) + ? proxy.alpn + : proxy.alpn.join(','), + )}`; + } + let allowInsecure = ''; + if (proxy['skip-cert-verify']) { + allowInsecure = `&allowInsecure=1`; + } + let sni = ''; + if (proxy.sni) { + sni = `&sni=${encodeURIComponent(proxy.sni)}`; + } + let fp = ''; + if (proxy['client-fingerprint']) { + fp = `&fp=${encodeURIComponent( + proxy['client-fingerprint'], + )}`; + } + let flow = ''; + if (proxy.flow) { + flow = `&flow=${encodeURIComponent(proxy.flow)}`; + } + let vlessTransport = `&type=${encodeURIComponent( + proxy.network, + )}`; + if (['grpc'].includes(proxy.network)) { + // https://github.com/XTLS/Xray-core/issues/91 + vlessTransport += `&mode=${encodeURIComponent( + proxy[`${proxy.network}-opts`]?.['_grpc-type'] || 'gun', + )}`; + } + + let vlessTransportServiceName = + proxy[`${proxy.network}-opts`]?.[ + `${proxy.network}-service-name` + ]; + let vlessTransportPath = proxy[`${proxy.network}-opts`]?.path; + let vlessTransportHost = + proxy[`${proxy.network}-opts`]?.headers?.Host; + if (vlessTransportPath) { + vlessTransport += `&path=${encodeURIComponent( + Array.isArray(vlessTransportPath) + ? vlessTransportPath[0] + : vlessTransportPath, + )}`; + } + if (vlessTransportHost) { + vlessTransport += `&host=${encodeURIComponent( + Array.isArray(vlessTransportHost) + ? vlessTransportHost[0] + : vlessTransportHost, + )}`; + } + if (vlessTransportServiceName) { + vlessTransport += `&serviceName=${encodeURIComponent( + vlessTransportServiceName, + )}`; + } + + result = `vless://${proxy.uuid}@${proxy.server}:${ + proxy.port + }?${vlessTransport}&security=${encodeURIComponent( + security, + )}${alpn}${allowInsecure}${sni}${fp}${flow}${sid}${pbk}#${encodeURIComponent( + proxy.name, + )}`; + break; + case 'trojan': + let trojanTransport = ''; + if (proxy.network) { + trojanTransport = `&type=${proxy.network}`; + if (['grpc'].includes(proxy.network)) { + let trojanTransportServiceName = + proxy[`${proxy.network}-opts`]?.[ + `${proxy.network}-service-name` + ]; + if (trojanTransportServiceName) { + trojanTransport += `&serviceName=${encodeURIComponent( + trojanTransportServiceName, + )}`; + } + trojanTransport += `&mode=${encodeURIComponent( + proxy[`${proxy.network}-opts`]?.['_grpc-type'] || + 'gun', + )}`; + } + let trojanTransportPath = + proxy[`${proxy.network}-opts`]?.path; + let trojanTransportHost = + proxy[`${proxy.network}-opts`]?.headers?.Host; + if (trojanTransportPath) { + trojanTransport += `&path=${encodeURIComponent( + Array.isArray(trojanTransportPath) + ? trojanTransportPath[0] + : trojanTransportPath, + )}`; + } + if (trojanTransportHost) { + trojanTransport += `&host=${encodeURIComponent( + Array.isArray(trojanTransportHost) + ? trojanTransportHost[0] + : trojanTransportHost, + )}`; + } + } + result = `trojan://${proxy.password}@${proxy.server}:${ + proxy.port + }?sni=${encodeURIComponent(proxy.sni || proxy.server)}${ + proxy['skip-cert-verify'] ? '&allowInsecure=1' : '' + }${trojanTransport}#${encodeURIComponent(proxy.name)}`; + break; + case 'hysteria2': + let hysteria2params = []; + if (proxy['skip-cert-verify']) { + hysteria2params.push(`insecure=1`); + } + if (proxy.obfs) { + hysteria2params.push( + `obfs=${encodeURIComponent(proxy.obfs)}`, + ); + if (proxy['obfs-password']) { + hysteria2params.push( + `obfs-password=${encodeURIComponent( + proxy['obfs-password'], + )}`, + ); + } + } + if (proxy.sni) { + hysteria2params.push( + `sni=${encodeURIComponent(proxy.sni)}`, + ); + } + if (proxy['tls-fingerprint']) { + hysteria2params.push( + `pinSHA256=${encodeURIComponent( + proxy['tls-fingerprint'], + )}`, + ); + } + if (proxy.tfo) { + hysteria2params.push(`fastopen=1`); + } + result = `hysteria2://${encodeURIComponent(proxy.password)}@${ + proxy.server + }:${proxy.port}?${hysteria2params.join( + '&', + )}#${encodeURIComponent(proxy.name)}`; + break; + } + return result; + }; + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/producers/utils.js b/backend/src/core/proxy-utils/producers/utils.js new file mode 100644 index 000000000..e8dc964d0 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/utils.js @@ -0,0 +1,30 @@ +import _ from 'lodash'; + +export class Result { + constructor(proxy) { + this.proxy = proxy; + this.output = []; + } + + append(data) { + if (typeof data === 'undefined') { + throw new Error('required field is missing'); + } + this.output.push(data); + } + + appendIfPresent(data, attr) { + if (isPresent(this.proxy, attr)) { + this.append(data); + } + } + + toString() { + return this.output.join(''); + } +} + +export function isPresent(obj, attr) { + const data = _.get(obj, attr); + return typeof data !== 'undefined' && data !== null; +} diff --git a/backend/src/core/proxy-utils/producers/v2ray.js b/backend/src/core/proxy-utils/producers/v2ray.js new file mode 100644 index 000000000..be3370ae8 --- /dev/null +++ b/backend/src/core/proxy-utils/producers/v2ray.js @@ -0,0 +1,12 @@ +/* eslint-disable no-case-declarations */ +import { Base64 } from 'js-base64'; +import URI_Producer from './uri'; + +const URI = URI_Producer(); + +export default function V2Ray_Producer() { + const type = 'ALL'; + const produce = (proxies) => + Base64.encode(proxies.map((proxy) => URI.produce(proxy)).join('\n')); + return { type, produce }; +} diff --git a/backend/src/core/proxy-utils/validators/index.js b/backend/src/core/proxy-utils/validators/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/backend/src/core/rule-utils/index.js b/backend/src/core/rule-utils/index.js new file mode 100644 index 000000000..0152d71ed --- /dev/null +++ b/backend/src/core/rule-utils/index.js @@ -0,0 +1,69 @@ +import RULE_PREPROCESSORS from './preprocessors'; +import RULE_PRODUCERS from './producers'; +import RULE_PARSERS from './parsers'; +import $ from '@/core/app'; + +export const RuleUtils = (function () { + function preprocess(raw) { + for (const processor of RULE_PREPROCESSORS) { + try { + if (processor.test(raw)) { + $.info(`Pre-processor [${processor.name}] activated`); + return processor.parse(raw); + } + } catch (e) { + $.error(`Parser [${processor.name}] failed\n Reason: ${e}`); + } + } + return raw; + } + + function parse(raw) { + raw = preprocess(raw); + for (const parser of RULE_PARSERS) { + let matched; + try { + matched = parser.test(raw); + } catch (err) { + matched = false; + } + if (matched) { + $.info(`Rule parser [${parser.name}] is activated!`); + return parser.parse(raw); + } + } + } + + function produce(rules, targetPlatform) { + const producer = RULE_PRODUCERS[targetPlatform]; + if (!producer) { + throw new Error( + `Target platform: ${targetPlatform} is not supported!`, + ); + } + if ( + typeof producer.type === 'undefined' || + producer.type === 'SINGLE' + ) { + return rules + .map((rule) => { + try { + return producer.func(rule); + } catch (err) { + console.log( + `ERROR: cannot produce rule: ${JSON.stringify( + rule, + )}\nReason: ${err}`, + ); + return ''; + } + }) + .filter((line) => line.length > 0) + .join('\n'); + } else if (producer.type === 'ALL') { + return producer.func(rules); + } + } + + return { parse, produce }; +})(); diff --git a/backend/src/core/rule-utils/parsers.js b/backend/src/core/rule-utils/parsers.js new file mode 100644 index 000000000..7ec48a4e6 --- /dev/null +++ b/backend/src/core/rule-utils/parsers.js @@ -0,0 +1,58 @@ +const RULE_TYPES_MAPPING = [ + [/^(DOMAIN|host|HOST)$/, 'DOMAIN'], + [/^(DOMAIN-KEYWORD|host-keyword|HOST-KEYWORD)$/, 'DOMAIN-KEYWORD'], + [/^(DOMAIN-SUFFIX|host-suffix|HOST-SUFFIX)$/, 'DOMAIN-SUFFIX'], + [/^USER-AGENT$/i, 'USER-AGENT'], + [/^PROCESS-NAME$/, 'PROCESS-NAME'], + [/^(DEST-PORT|DST-PORT)$/, 'DST-PORT'], + [/^SRC-IP(-CIDR)?$/, 'SRC-IP'], + [/^(IN|SRC)-PORT$/, 'IN-PORT'], + [/^PROTOCOL$/, 'PROTOCOL'], + [/^IP-CIDR$/i, 'IP-CIDR'], + [/^(IP-CIDR6|ip6-cidr|IP6-CIDR)$/], +]; + +function AllRuleParser() { + const name = 'Universal Rule Parser'; + const test = () => true; + const parse = (raw) => { + const lines = raw.split('\n'); + const result = []; + for (let line of lines) { + line = line.trim(); + // skip empty line + if (line.length === 0) continue; + // skip comments + if (/\s*#/.test(line)) continue; + try { + const params = line.split(',').map((w) => w.trim()); + let rawType = params[0]; + let matched = false; + for (const item of RULE_TYPES_MAPPING) { + const regex = item[0]; + if (regex.test(rawType)) { + matched = true; + const rule = { + type: item[1], + content: params[1], + }; + if ( + rule.type === 'IP-CIDR' || + rule.type === 'IP-CIDR6' + ) { + rule.options = params.slice(2); + } + result.push(rule); + } + } + if (!matched) throw new Error('Invalid rule type: ' + rawType); + } catch (e) { + console.log(`Failed to parse line: ${line}\n Reason: ${e}`); + } + } + return result; + }; + return { name, test, parse }; +} + +export default [AllRuleParser()]; diff --git a/backend/src/core/rule-utils/preprocessors.js b/backend/src/core/rule-utils/preprocessors.js new file mode 100644 index 000000000..dbb981cb4 --- /dev/null +++ b/backend/src/core/rule-utils/preprocessors.js @@ -0,0 +1,18 @@ +function HTML() { + const name = 'HTML'; + const test = (raw) => /^/.test(raw); + // simply discard HTML + const parse = () => ''; + return { name, test, parse }; +} + +function ClashProvider() { + const name = 'Clash Provider'; + const test = (raw) => raw.indexOf('payload:') === 0; + const parse = (raw) => { + return raw.replace('payload:', '').replace(/^\s*-\s*/gm, ''); + }; + return { name, test, parse }; +} + +export default [HTML(), ClashProvider()]; diff --git a/backend/src/core/rule-utils/producers.js b/backend/src/core/rule-utils/producers.js new file mode 100644 index 000000000..9a7efcc5c --- /dev/null +++ b/backend/src/core/rule-utils/producers.js @@ -0,0 +1,81 @@ +import YAML from 'static-js-yaml'; + +function QXFilter() { + const type = 'SINGLE'; + const func = (rule) => { + // skip unsupported rules + const UNSUPPORTED = [ + 'URL-REGEX', + 'DEST-PORT', + 'SRC-IP', + 'IN-PORT', + 'PROTOCOL', + ]; + if (UNSUPPORTED.indexOf(rule.type) !== -1) return null; + + const TRANSFORM = { + 'DOMAIN-KEYWORD': 'HOST-KEYWORD', + 'DOMAIN-SUFFIX': 'HOST-SUFFIX', + DOMAIN: 'HOST', + 'IP-CIDR6': 'IP6-CIDR', + }; + + // QX does not support the no-resolve option + return `${TRANSFORM[rule.type] || rule.type},${rule.content},SUB-STORE`; + }; + return { type, func }; +} + +function SurgeRuleSet() { + const type = 'SINGLE'; + const func = (rule) => { + let output = `${rule.type},${rule.content}`; + if (rule.type === 'IP-CIDR' || rule.type === 'IP-CIDR6') { + output += rule.options ? `,${rule.options[0]}` : ''; + } + return output; + }; + return { type, func }; +} + +function LoonRules() { + const type = 'SINGLE'; + const func = (rule) => { + // skip unsupported rules + const UNSUPPORTED = ['DEST-PORT', 'SRC-IP', 'IN-PORT', 'PROTOCOL']; + if (UNSUPPORTED.indexOf(rule.type) !== -1) return null; + return SurgeRuleSet().func(rule); + }; + return { type, func }; +} + +function ClashRuleProvider() { + const type = 'ALL'; + const func = (rules) => { + const TRANSFORM = { + 'DEST-PORT': 'DST-PORT', + 'SRC-IP': 'SRC-IP-CIDR', + 'IN-PORT': 'SRC-PORT', + }; + const conf = { + payload: rules.map((rule) => { + let output = `${TRANSFORM[rule.type] || rule.type},${ + rule.content + }`; + if (rule.type === 'IP-CIDR' || rule.type === 'IP-CIDR6') { + output += rule.options ? `,${rule.options[0]}` : ''; + } + return output; + }), + }; + return YAML.dump(conf); + }; + return { type, func }; +} + +export default { + QX: QXFilter(), + Surge: SurgeRuleSet(), + Loon: LoonRules(), + Clash: ClashRuleProvider(), +}; diff --git a/backend/src/main.js b/backend/src/main.js new file mode 100644 index 000000000..03737d8d7 --- /dev/null +++ b/backend/src/main.js @@ -0,0 +1,26 @@ +/** + * ███████╗██╗ ██╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗ + * ██╔════╝██║ ██║██╔══██╗ ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔════╝ + * ███████╗██║ ██║██████╔╝█████╗███████╗ ██║ ██║ ██║██████╔╝█████╗ + * ╚════██║██║ ██║██╔══██╗╚════╝╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ + * ███████║╚██████╔╝██████╔╝ ███████║ ██║ ╚██████╔╝██║ ██║███████╗ + * ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + * Advanced Subscription Manager for QX, Loon, Surge and Clash. + * @author: Peng-YM + * @github: https://github.com/sub-store-org/Sub-Store + * @documentation: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 + */ +import { version } from '../package.json'; +console.log( + ` +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ + Sub-Store -- v${version} +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ +`, +); + +import migrate from '@/utils/migration'; +import serve from '@/restful'; + +migrate(); +serve(); diff --git a/backend/src/products/cron-sync-artifacts.js b/backend/src/products/cron-sync-artifacts.js new file mode 100644 index 000000000..b598b771b --- /dev/null +++ b/backend/src/products/cron-sync-artifacts.js @@ -0,0 +1,70 @@ +import { version } from '../../package.json'; +import { SETTINGS_KEY, ARTIFACTS_KEY } from '@/constants'; +import $ from '@/core/app'; +import { produceArtifact } from '@/restful/sync'; +import { syncToGist } from '@/restful/artifacts'; + +!(async function () { + const settings = $.read(SETTINGS_KEY); + // if GitHub token is not configured + if (!settings.githubUser || !settings.gistToken) return; + + const artifacts = $.read(ARTIFACTS_KEY); + if (!artifacts || artifacts.length === 0) return; + + const shouldSync = artifacts.some((artifact) => artifact.sync); + if (shouldSync) await doSync(); +})().finally(() => $.done()); + +async function doSync() { + console.log( + ` +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ + Sub-Store Sync -- v${version} +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ +`, + ); + + $.info('开始同步所有远程配置...'); + const allArtifacts = $.read(ARTIFACTS_KEY); + const files = {}; + + try { + await Promise.all( + allArtifacts.map(async (artifact) => { + if (artifact.sync) { + $.info(`正在同步云配置:${artifact.name}...`); + const output = await produceArtifact({ + type: artifact.type, + name: artifact.source, + platform: artifact.platform, + }); + + files[artifact.name] = { + content: output, + }; + } + }), + ); + + const resp = await syncToGist(files); + const body = JSON.parse(resp.body); + + for (const artifact of allArtifacts) { + if (artifact.sync) { + artifact.updated = new Date().getTime(); + // extract real url from gist + artifact.url = body.files[artifact.name].raw_url.replace( + /\/raw\/[^/]*\/(.*)/, + '/raw/$1', + ); + } + } + + $.write(allArtifacts, ARTIFACTS_KEY); + $.notify('🌍 Sub-Store', '全部订阅同步成功!'); + } catch (err) { + $.notify('🌍 Sub-Store', '同步订阅失败', `原因:${err}`); + $.error(`无法同步订阅配置到 Gist,原因:${err}`); + } +} diff --git a/backend/src/products/resource-parser.loon.js b/backend/src/products/resource-parser.loon.js new file mode 100644 index 000000000..b5537141d --- /dev/null +++ b/backend/src/products/resource-parser.loon.js @@ -0,0 +1,29 @@ +/* eslint-disable no-undef */ +import { ProxyUtils } from '@/core/proxy-utils'; +import { RuleUtils } from '@/core/rule-utils'; +import { version } from '../../package.json'; + +console.log( + ` +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ + Sub-Store -- v${version} +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ +`, +); + +const RESOURCE_TYPE = { + PROXY: 1, + RULE: 2, +}; + +let result = $resource; + +if ($resourceType === RESOURCE_TYPE.PROXY) { + const proxies = ProxyUtils.parse($resource); + result = ProxyUtils.produce(proxies, 'Loon'); +} else if ($resourceType === RESOURCE_TYPE.RULE) { + const rules = RuleUtils.parse($resource); + result = RuleUtils.produce(rules, 'Loon'); +} + +$done(result); diff --git a/backend/src/products/sub-store-0.js b/backend/src/products/sub-store-0.js new file mode 100644 index 000000000..19f495e8c --- /dev/null +++ b/backend/src/products/sub-store-0.js @@ -0,0 +1,43 @@ +/** + * 路由拆分 - 本文件只包含不涉及到解析器的 RESTFul API + */ + +import { version } from '../../package.json'; +console.log( + ` +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ + Sub-Store -- v${version} +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ +`, +); + +import migrate from '@/utils/migration'; +import express from '@/vendor/express'; +import $ from '@/core/app'; +import registerCollectionRoutes from '@/restful/collections'; +import registerSubscriptionRoutes from '@/restful/subscriptions'; +import registerArtifactRoutes from '@/restful/artifacts'; +import registerSettingRoutes from '@/restful/settings'; +import registerMiscRoutes from '@/restful/miscs'; +import registerSortRoutes from '@/restful/sort'; +import registerFileRoutes from '@/restful/file'; +import registerModuleRoutes from '@/restful/module'; + +migrate(); +serve(); + +function serve() { + const $app = express({ substore: $ }); + + // register routes + registerCollectionRoutes($app); + registerSubscriptionRoutes($app); + registerFileRoutes($app); + registerModuleRoutes($app); + registerArtifactRoutes($app); + registerSettingRoutes($app); + registerSortRoutes($app); + registerMiscRoutes($app); + + $app.start(); +} diff --git a/backend/src/products/sub-store-1.js b/backend/src/products/sub-store-1.js new file mode 100644 index 000000000..1a17b8ec8 --- /dev/null +++ b/backend/src/products/sub-store-1.js @@ -0,0 +1,39 @@ +/** + * 路由拆分 - 本文件仅包含使用到解析器的 RESTFul API + */ + +import { version } from '../../package.json'; +import migrate from '@/utils/migration'; +import express from '@/vendor/express'; +import $ from '@/core/app'; +import registerDownloadRoutes from '@/restful/download'; +import registerPreviewRoutes from '@/restful/preview'; +import registerSyncRoutes from '@/restful/sync'; +import registerNodeInfoRoutes from '@/restful/node-info'; + +console.log( + ` +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ + Sub-Store -- v${version} +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ +`, +); + +migrate(); +serve(); + +function serve() { + const $app = express({ substore: $ }); + + // register routes + registerDownloadRoutes($app); + registerPreviewRoutes($app); + registerSyncRoutes($app); + registerNodeInfoRoutes($app); + + $app.options('/', (req, res) => { + res.status(200).end(); + }); + + $app.start(); +} diff --git a/backend/src/restful/artifacts.js b/backend/src/restful/artifacts.js new file mode 100644 index 000000000..f6f11a352 --- /dev/null +++ b/backend/src/restful/artifacts.js @@ -0,0 +1,183 @@ +import $ from '@/core/app'; + +import { + ARTIFACT_REPOSITORY_KEY, + ARTIFACTS_KEY, + SETTINGS_KEY, +} from '@/constants'; +import { deleteByName, findByName, updateByName } from '@/utils/database'; +import { failed, success } from '@/restful/response'; +import { + InternalServerError, + RequestInvalidError, + ResourceNotFoundError, +} from '@/restful/errors'; +import Gist from '@/utils/gist'; + +export default function register($app) { + // Initialization + if (!$.read(ARTIFACTS_KEY)) $.write({}, ARTIFACTS_KEY); + + // RESTful APIs + $app.route('/api/artifacts') + .get(getAllArtifacts) + .post(createArtifact) + .put(replaceArtifact); + + $app.route('/api/artifact/:name') + .get(getArtifact) + .patch(updateArtifact) + .delete(deleteArtifact); +} + +function getAllArtifacts(req, res) { + const allArtifacts = $.read(ARTIFACTS_KEY); + success(res, allArtifacts); +} + +function replaceArtifact(req, res) { + const allArtifacts = req.body; + $.write(allArtifacts, ARTIFACTS_KEY); + success(res); +} + +async function getArtifact(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allArtifacts = $.read(ARTIFACTS_KEY); + const artifact = findByName(allArtifacts, name); + + if (artifact) { + success(res, artifact); + } else { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Artifact ${name} does not exist!`, + ), + 404, + ); + } +} + +function createArtifact(req, res) { + const artifact = req.body; + if (!validateArtifactName(artifact.name)) { + failed( + res, + new RequestInvalidError( + 'INVALID_ARTIFACT_NAME', + `Artifact name ${artifact.name} is invalid.`, + ), + ); + return; + } + + $.info(`正在创建远程配置:${artifact.name}`); + const allArtifacts = $.read(ARTIFACTS_KEY); + if (findByName(allArtifacts, artifact.name)) { + failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + `Artifact ${artifact.name} already exists.`, + ), + ); + } else { + allArtifacts.push(artifact); + $.write(allArtifacts, ARTIFACTS_KEY); + success(res, artifact, 201); + } +} + +function updateArtifact(req, res) { + const allArtifacts = $.read(ARTIFACTS_KEY); + let oldName = req.params.name; + oldName = decodeURIComponent(oldName); + const artifact = findByName(allArtifacts, oldName); + if (artifact) { + $.info(`正在更新远程配置:${artifact.name}`); + const newArtifact = { + ...artifact, + ...req.body, + }; + if (!validateArtifactName(newArtifact.name)) { + failed( + res, + new RequestInvalidError( + 'INVALID_ARTIFACT_NAME', + `Artifact name ${newArtifact.name} is invalid.`, + ), + ); + return; + } + updateByName(allArtifacts, oldName, newArtifact); + $.write(allArtifacts, ARTIFACTS_KEY); + success(res, newArtifact); + } else { + failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + `Artifact ${oldName} already exists.`, + ), + ); + } +} + +async function deleteArtifact(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`正在删除远程配置:${name}`); + const allArtifacts = $.read(ARTIFACTS_KEY); + try { + const artifact = findByName(allArtifacts, name); + if (!artifact) throw new Error(`远程配置:${name}不存在!`); + if (artifact.updated) { + // delete gist + const files = {}; + files[encodeURIComponent(artifact.name)] = { + content: '', + }; + // 当别的Sub 删了同步订阅 或 gist里面删了 当前设备没有删除 时 无法删除的bug + try { + await syncToGist(files); + } catch (i) { + $.error(`Function syncToGist: ${name} : ${i}`); + } + } + // delete local cache + deleteByName(allArtifacts, name); + $.write(allArtifacts, ARTIFACTS_KEY); + success(res); + } catch (err) { + $.error(`无法删除远程配置:${name},原因:${err}`); + failed( + res, + new InternalServerError( + `FAILED_TO_DELETE_ARTIFACT`, + `Failed to delete artifact ${name}`, + `Reason: ${err}`, + ), + ); + } +} + +function validateArtifactName(name) { + return /^[a-zA-Z0-9._-]*$/.test(name); +} + +async function syncToGist(files) { + const { gistToken } = $.read(SETTINGS_KEY); + if (!gistToken) { + return Promise.reject('未设置Gist Token!'); + } + const manager = new Gist({ + token: gistToken, + key: ARTIFACT_REPOSITORY_KEY, + }); + return manager.upload(files); +} + +export { syncToGist }; diff --git a/backend/src/restful/collections.js b/backend/src/restful/collections.js new file mode 100644 index 000000000..e9298465f --- /dev/null +++ b/backend/src/restful/collections.js @@ -0,0 +1,131 @@ +import { deleteByName, findByName, updateByName } from '@/utils/database'; +import { COLLECTIONS_KEY, ARTIFACTS_KEY } from '@/constants'; +import { failed, success } from '@/restful/response'; +import $ from '@/core/app'; +import { RequestInvalidError, ResourceNotFoundError } from '@/restful/errors'; + +export default function register($app) { + if (!$.read(COLLECTIONS_KEY)) $.write({}, COLLECTIONS_KEY); + + $app.route('/api/collection/:name') + .get(getCollection) + .patch(updateCollection) + .delete(deleteCollection); + + $app.route('/api/collections') + .get(getAllCollections) + .post(createCollection) + .put(replaceCollection); +} + +// collection API +function createCollection(req, res) { + const collection = req.body; + $.info(`正在创建组合订阅:${collection.name}`); + if (/\//.test(collection.name)) { + failed( + res, + new RequestInvalidError( + 'INVALID_NAME', + `Collection ${collection.name} is invalid`, + ), + ); + return; + } + const allCols = $.read(COLLECTIONS_KEY); + if (findByName(allCols, collection.name)) { + failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + `Collection ${collection.name} already exists.`, + ), + ); + return; + } + allCols.push(collection); + $.write(allCols, COLLECTIONS_KEY); + success(res, collection, 201); +} + +function getCollection(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allCols = $.read(COLLECTIONS_KEY); + const collection = findByName(allCols, name); + if (collection) { + success(res, collection); + } else { + failed( + res, + new ResourceNotFoundError( + `SUBSCRIPTION_NOT_FOUND`, + `Collection ${name} does not exist`, + 404, + ), + ); + } +} + +function updateCollection(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + let collection = req.body; + const allCols = $.read(COLLECTIONS_KEY); + const oldCol = findByName(allCols, name); + if (oldCol) { + const newCol = { + ...oldCol, + ...collection, + }; + $.info(`正在更新组合订阅:${name}...`); + + if (name !== newCol.name) { + // update all artifacts referring this collection + const allArtifacts = $.read(ARTIFACTS_KEY) || []; + for (const artifact of allArtifacts) { + if ( + artifact.type === 'collection' && + artifact.source === oldCol.name + ) { + artifact.source = newCol.name; + } + } + $.write(allArtifacts, ARTIFACTS_KEY); + } + + updateByName(allCols, name, newCol); + $.write(allCols, COLLECTIONS_KEY); + success(res, newCol); + } else { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Collection ${name} does not exist!`, + ), + 404, + ); + } +} + +function deleteCollection(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`正在删除组合订阅:${name}`); + let allCols = $.read(COLLECTIONS_KEY); + deleteByName(allCols, name); + $.write(allCols, COLLECTIONS_KEY); + success(res); +} + +function getAllCollections(req, res) { + const allCols = $.read(COLLECTIONS_KEY); + success(res, allCols); +} + +function replaceCollection(req, res) { + const allCols = req.body; + $.write(allCols, COLLECTIONS_KEY); + success(res); +} diff --git a/backend/src/restful/download.js b/backend/src/restful/download.js new file mode 100644 index 000000000..daa028936 --- /dev/null +++ b/backend/src/restful/download.js @@ -0,0 +1,231 @@ +import { getPlatformFromHeaders } from '@/utils/platform'; +import { COLLECTIONS_KEY, SUBS_KEY } from '@/constants'; +import { findByName } from '@/utils/database'; +import { getFlowHeaders } from '@/utils/flow'; +import $ from '@/core/app'; +import { failed } from '@/restful/response'; +import { InternalServerError, ResourceNotFoundError } from '@/restful/errors'; +import { produceArtifact } from '@/restful/sync'; + +export default function register($app) { + $app.get('/download/collection/:name', downloadCollection); + $app.get('/download/:name', downloadSubscription); +} + +async function downloadSubscription(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + + const platform = + req.query.target || getPlatformFromHeaders(req.headers) || 'JSON'; + + $.info(`正在下载订阅:${name}`); + let { + url, + ua, + content, + mergeSources, + ignoreFailedRemoteSub, + produceType, + includeUnsupportedProxy, + } = req.query; + if (url) { + url = decodeURIComponent(url); + $.info(`指定远程订阅 URL: ${url}`); + } + if (ua) { + ua = decodeURIComponent(ua); + $.info(`指定远程订阅 User-Agent: ${ua}`); + } + if (content) { + content = decodeURIComponent(content); + $.info(`指定本地订阅: ${content}`); + } + if (mergeSources) { + mergeSources = decodeURIComponent(mergeSources); + $.info(`指定合并来源: ${mergeSources}`); + } + if (ignoreFailedRemoteSub != null && ignoreFailedRemoteSub !== '') { + ignoreFailedRemoteSub = decodeURIComponent(ignoreFailedRemoteSub); + $.info(`指定忽略失败的远程订阅: ${ignoreFailedRemoteSub}`); + } + if (produceType) { + produceType = decodeURIComponent(produceType); + $.info(`指定生产类型: ${produceType}`); + } + if (includeUnsupportedProxy) { + includeUnsupportedProxy = decodeURIComponent(includeUnsupportedProxy); + $.info(`包含不支持的节点: ${includeUnsupportedProxy}`); + } + + const allSubs = $.read(SUBS_KEY); + const sub = findByName(allSubs, name); + if (sub) { + try { + const output = await produceArtifact({ + type: 'subscription', + name, + platform, + url, + ua, + content, + mergeSources, + ignoreFailedRemoteSub, + produceType, + produceOpts: { + 'include-unsupported-proxy': includeUnsupportedProxy, + }, + }); + + if (sub.source !== 'local' || url) { + try { + // forward flow headers + const flowInfo = await getFlowHeaders(url || sub.url); + if (flowInfo) { + res.set('subscription-userinfo', flowInfo); + } + } catch (err) { + $.error( + `订阅 ${name} 获取流量信息时发生错误: ${JSON.stringify( + err, + )}`, + ); + } + } + + if (platform === 'JSON') { + res.set('Content-Type', 'application/json;charset=utf-8').send( + output, + ); + } else { + res.send(output); + } + } catch (err) { + $.notify( + `🌍 Sub-Store 下载订阅失败`, + `❌ 无法下载订阅:${name}!`, + `🤔 原因:${err.message ?? err}`, + ); + $.error(err.message ?? err); + failed( + res, + new InternalServerError( + 'INTERNAL_SERVER_ERROR', + `Failed to download subscription: ${name}`, + `Reason: ${err.message ?? err}`, + ), + ); + } + } else { + $.notify(`🌍 Sub-Store 下载订阅失败`, `❌ 未找到订阅:${name}!`); + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Subscription ${name} does not exist!`, + ), + 404, + ); + } +} + +async function downloadCollection(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + + const platform = + req.query.target || getPlatformFromHeaders(req.headers) || 'JSON'; + + const allCols = $.read(COLLECTIONS_KEY); + const collection = findByName(allCols, name); + + $.info(`正在下载组合订阅:${name}`); + + let { ignoreFailedRemoteSub, produceType, includeUnsupportedProxy } = + req.query; + + if (ignoreFailedRemoteSub != null && ignoreFailedRemoteSub !== '') { + ignoreFailedRemoteSub = decodeURIComponent(ignoreFailedRemoteSub); + $.info(`指定忽略失败的远程订阅: ${ignoreFailedRemoteSub}`); + } + if (produceType) { + produceType = decodeURIComponent(produceType); + $.info(`指定生产类型: ${produceType}`); + } + + if (includeUnsupportedProxy) { + includeUnsupportedProxy = decodeURIComponent(includeUnsupportedProxy); + $.info(`包含不支持的节点: ${includeUnsupportedProxy}`); + } + + if (collection) { + try { + const output = await produceArtifact({ + type: 'collection', + name, + platform, + ignoreFailedRemoteSub, + produceType, + produceOpts: { + 'include-unsupported-proxy': includeUnsupportedProxy, + }, + }); + + // forward flow header from the first subscription in this collection + const allSubs = $.read(SUBS_KEY); + const subnames = collection.subscriptions; + if (subnames.length > 0) { + const sub = findByName(allSubs, subnames[0]); + if (sub.source !== 'local') { + try { + const flowInfo = await getFlowHeaders(sub.url); + if (flowInfo) { + res.set('subscription-userinfo', flowInfo); + } + } catch (err) { + $.error( + `组合订阅 ${name} 中的子订阅 ${ + sub.name + } 获取流量信息时发生错误: ${err.message ?? err}`, + ); + } + } + } + + if (platform === 'JSON') { + res.set('Content-Type', 'application/json;charset=utf-8').send( + output, + ); + } else { + res.send(output); + } + } catch (err) { + $.notify( + `🌍 Sub-Store 下载组合订阅失败`, + `❌ 下载组合订阅错误:${name}!`, + `🤔 原因:${err}`, + ); + failed( + res, + new InternalServerError( + 'INTERNAL_SERVER_ERROR', + `Failed to download collection: ${name}`, + `Reason: ${err.message ?? err}`, + ), + ); + } + } else { + $.notify( + `🌍 Sub-Store 下载组合订阅失败`, + `❌ 未找到组合订阅:${name}!`, + ); + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Collection ${name} does not exist!`, + ), + 404, + ); + } +} diff --git a/backend/src/restful/errors/index.js b/backend/src/restful/errors/index.js new file mode 100644 index 000000000..a1946b4e2 --- /dev/null +++ b/backend/src/restful/errors/index.js @@ -0,0 +1,35 @@ +class BaseError { + constructor(code, message, details) { + this.code = code; + this.message = message; + this.details = details; + } +} + +export class InternalServerError extends BaseError { + constructor(code, message, details) { + super(code, message, details); + this.type = 'InternalServerError'; + } +} + +export class RequestInvalidError extends BaseError { + constructor(code, message, details) { + super(code, message, details); + this.type = 'RequestInvalidError'; + } +} + +export class ResourceNotFoundError extends BaseError { + constructor(code, message, details) { + super(code, message, details); + this.type = 'ResourceNotFoundError'; + } +} + +export class NetworkError extends BaseError { + constructor(code, message, details) { + super(code, message, details); + this.type = 'NetworkError'; + } +} diff --git a/backend/src/restful/file.js b/backend/src/restful/file.js new file mode 100644 index 000000000..d589a6ee8 --- /dev/null +++ b/backend/src/restful/file.js @@ -0,0 +1,194 @@ +import { deleteByName, findByName, updateByName } from '@/utils/database'; +import { FILES_KEY } from '@/constants'; +import { failed, success } from '@/restful/response'; +import $ from '@/core/app'; +import { + RequestInvalidError, + ResourceNotFoundError, + InternalServerError, +} from '@/restful/errors'; +import { produceArtifact } from '@/restful/sync'; + +export default function register($app) { + if (!$.read(FILES_KEY)) $.write([], FILES_KEY); + + $app.route('/api/file/:name') + .get(getFile) + .patch(updateFile) + .delete(deleteFile); + + $app.route('/api/wholeFile/:name').get(getWholeFile); + + $app.route('/api/files').get(getAllFiles).post(createFile).put(replaceFile); + $app.route('/api/wholeFiles').get(getAllWholeFiles); +} + +// file API +function createFile(req, res) { + const file = req.body; + file.name = `${file.name ?? Date.now()}`; + $.info(`正在创建文件:${file.name}`); + const allFiles = $.read(FILES_KEY); + if (findByName(allFiles, file.name)) { + return failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + req.body.name + ? `已存在 name 为 ${file.name} 的文件` + : `无法同时创建相同的文件 可稍后重试`, + ), + ); + } + allFiles.push(file); + $.write(allFiles, FILES_KEY); + success(res, file, 201); +} + +async function getFile(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + + $.info(`正在下载文件:${name}`); + let { url, ua, content, mergeSources, ignoreFailedRemoteFile } = req.query; + if (url) { + url = decodeURIComponent(url); + $.info(`指定远程文件 URL: ${url}`); + } + if (ua) { + ua = decodeURIComponent(ua); + $.info(`指定远程文件 User-Agent: ${ua}`); + } + if (content) { + content = decodeURIComponent(content); + $.info(`指定本地文件: ${content}`); + } + if (mergeSources) { + mergeSources = decodeURIComponent(mergeSources); + $.info(`指定合并来源: ${mergeSources}`); + } + if (ignoreFailedRemoteFile != null && ignoreFailedRemoteFile !== '') { + ignoreFailedRemoteFile = decodeURIComponent(ignoreFailedRemoteFile); + $.info(`指定忽略失败的远程文件: ${ignoreFailedRemoteFile}`); + } + + const allFiles = $.read(FILES_KEY); + const file = findByName(allFiles, name); + if (file) { + try { + const output = await produceArtifact({ + type: 'file', + name, + url, + ua, + content, + mergeSources, + ignoreFailedRemoteFile, + }); + + res.set('Content-Type', 'text/plain; charset=utf-8').send( + output ?? '', + ); + } catch (err) { + $.notify( + `🌍 Sub-Store 下载文件失败`, + `❌ 无法下载文件:${name}!`, + `🤔 原因:${err.message ?? err}`, + ); + $.error(err.message ?? err); + failed( + res, + new InternalServerError( + 'INTERNAL_SERVER_ERROR', + `Failed to download file: ${name}`, + `Reason: ${err.message ?? err}`, + ), + ); + } + } else { + $.notify(`🌍 Sub-Store 下载文件失败`, `❌ 未找到文件:${name}!`); + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `File ${name} does not exist!`, + ), + 404, + ); + } +} +function getWholeFile(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allFiles = $.read(FILES_KEY); + const file = findByName(allFiles, name); + if (file) { + success(res, file); + } else { + failed( + res, + new ResourceNotFoundError( + `FILE_NOT_FOUND`, + `File ${name} does not exist`, + 404, + ), + ); + } +} + +function updateFile(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + let file = req.body; + const allFiles = $.read(FILES_KEY); + const oldFile = findByName(allFiles, name); + if (oldFile) { + const newFile = { + ...oldFile, + ...file, + }; + $.info(`正在更新文件:${name}...`); + + updateByName(allFiles, name, newFile); + $.write(allFiles, FILES_KEY); + success(res, newFile); + } else { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `File ${name} does not exist!`, + ), + 404, + ); + } +} + +function deleteFile(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`正在删除文件:${name}`); + let allFiles = $.read(FILES_KEY); + deleteByName(allFiles, name); + $.write(allFiles, FILES_KEY); + success(res); +} + +function getAllFiles(req, res) { + const allFiles = $.read(FILES_KEY); + success( + res, // eslint-disable-next-line no-unused-vars + allFiles.map(({ content, ...rest }) => rest), + ); +} + +function getAllWholeFiles(req, res) { + const allFiles = $.read(FILES_KEY); + success(res, allFiles); +} + +function replaceFile(req, res) { + const allFiles = req.body; + $.write(allFiles, FILES_KEY); + success(res); +} diff --git a/backend/src/restful/index.js b/backend/src/restful/index.js new file mode 100644 index 000000000..940056a39 --- /dev/null +++ b/backend/src/restful/index.js @@ -0,0 +1,158 @@ +import express from '@/vendor/express'; +import $ from '@/core/app'; +import migrate from '@/utils/migration'; +import download from '@/utils/download'; + +import registerSubscriptionRoutes from './subscriptions'; +import registerCollectionRoutes from './collections'; +import registerArtifactRoutes from './artifacts'; +import registerFileRoutes from './file'; +import registerModuleRoutes from './module'; +import registerSyncRoutes from './sync'; +import registerDownloadRoutes from './download'; +import registerSettingRoutes from './settings'; +import registerPreviewRoutes from './preview'; +import registerSortingRoutes from './sort'; +import registerMiscRoutes from './miscs'; +import registerNodeInfoRoutes from './node-info'; + +export default function serve() { + let port; + let host; + if ($.env.isNode) { + port = eval('process.env.SUB_STORE_BACKEND_API_PORT') || 3000; + host = eval('process.env.SUB_STORE_BACKEND_API_HOST') || '::'; + } + const $app = express({ substore: $, port, host }); + // register routes + registerCollectionRoutes($app); + registerSubscriptionRoutes($app); + registerDownloadRoutes($app); + registerPreviewRoutes($app); + registerSortingRoutes($app); + registerSettingRoutes($app); + registerArtifactRoutes($app); + registerFileRoutes($app); + registerModuleRoutes($app); + registerSyncRoutes($app); + registerNodeInfoRoutes($app); + registerMiscRoutes($app); + + $app.start(); + + if ($.env.isNode) { + const path = eval(`require("path")`); + const fs = eval(`require("fs")`); + const data_url = eval('process.env.SUB_STORE_DATA_URL'); + const fe_be_path = eval('process.env.SUB_STORE_FRONTEND_BACKEND_PATH'); + const fe_port = eval('process.env.SUB_STORE_FRONTEND_PORT') || 3001; + const fe_host = + eval('process.env.SUB_STORE_FRONTEND_HOST') || host || '::'; + const fe_path = eval('process.env.SUB_STORE_FRONTEND_PATH'); + const fe_abs_path = path.resolve( + fe_path || path.join(__dirname, 'frontend'), + ); + if (fe_path) { + try { + fs.accessSync(path.join(fe_abs_path, 'index.html')); + } catch (e) { + throw new Error( + `[FRONTEND] index.html file not found in ${fe_abs_path}`, + ); + } + + const express_ = eval(`require("express")`); + const history = eval(`require("connect-history-api-fallback")`); + const { createProxyMiddleware } = eval( + `require("http-proxy-middleware")`, + ); + + const app = express_(); + + const staticFileMiddleware = express_.static(fe_path); + + let be_api_rewrite = ''; + let be_download_rewrite = ''; + let be_api = '/api/'; + let be_download = '/download/'; + if (fe_be_path) { + if (!fe_be_path.startsWith('/')) { + throw new Error( + 'SUB_STORE_FRONTEND_BACKEND_PATH should start with /', + ); + } + be_api_rewrite = `${ + fe_be_path === '/' ? '' : fe_be_path + }${be_api}`; + be_download_rewrite = `${ + fe_be_path === '/' ? '' : fe_be_path + }${be_download}`; + app.use( + be_api_rewrite, + createProxyMiddleware({ + target: `http://127.0.0.1:${port}`, + changeOrigin: true, + pathRewrite: (path) => { + return path.startsWith(be_api_rewrite) + ? path.replace(be_api_rewrite, be_api) + : path; + }, + }), + ); + app.use( + be_download_rewrite, + createProxyMiddleware({ + target: `http://127.0.0.1:${port}`, + changeOrigin: true, + pathRewrite: (path) => { + return path.startsWith(be_download_rewrite) + ? path.replace(be_download_rewrite, be_download) + : path; + }, + }), + ); + } + + app.use(staticFileMiddleware); + app.use( + history({ + disableDotRule: true, + verbose: false, + }), + ); + app.use(staticFileMiddleware); + + const listener = app.listen(fe_port, fe_host, () => { + const { address: fe_address, port: fe_port } = + listener.address(); + $.info(`[FRONTEND] ${fe_address}:${fe_port}`); + if (fe_be_path) { + $.info( + `[FRONTEND -> BACKEND] ${fe_address}:${fe_port}${be_api_rewrite} -> http://127.0.0.1:${port}${be_api}`, + ); + $.info( + `[FRONTEND -> BACKEND] ${fe_address}:${fe_port}${be_download_rewrite} -> http://127.0.0.1:${port}${be_download}`, + ); + } + }); + } + if (data_url) { + $.info(`[BACKEND] downloading data from ${data_url}`); + download(data_url) + .then((content) => { + $.write(content, '#sub-store'); + + $.cache = JSON.parse(content); + $.persistCache(); + + migrate(); + $.info(`[BACKEND] restored data from ${data_url}`); + }) + .catch((e) => { + $.error(`[BACKEND] restore data failed`); + console.error(e); + throw e; + }); + } + } +} diff --git a/backend/src/restful/miscs.js b/backend/src/restful/miscs.js new file mode 100644 index 000000000..6b62c4839 --- /dev/null +++ b/backend/src/restful/miscs.js @@ -0,0 +1,165 @@ +import $ from '@/core/app'; +import { ENV } from '@/vendor/open-api'; +import { failed, success } from '@/restful/response'; +import { updateArtifactStore, updateGitHubAvatar } from '@/restful/settings'; +import resourceCache from '@/utils/resource-cache'; +import { + GIST_BACKUP_FILE_NAME, + GIST_BACKUP_KEY, + SETTINGS_KEY, +} from '@/constants'; +import { InternalServerError, RequestInvalidError } from '@/restful/errors'; +import Gist from '@/utils/gist'; +import migrate from '@/utils/migration'; +import env from '@/utils/env'; + +export default function register($app) { + // utils + $app.get('/api/utils/env', getEnv); // get runtime environment + $app.get('/api/utils/backup', gistBackup); // gist backup actions + $app.get('/api/utils/refresh', refresh); + + // Storage management + $app.route('/api/storage') + .get((req, res) => { + res.set('content-type', 'application/json') + .set( + 'content-disposition', + 'attachment; filename="sub-store.json"', + ) + .send( + $.env.isNode + ? JSON.stringify($.cache) + : $.read('#sub-store'), + ); + }) + .post((req, res) => { + const { content } = req.body; + $.write(content, '#sub-store'); + if ($.env.isNode) { + $.cache = JSON.parse(content); + $.persistCache(); + } + migrate(); + success(res); + }); + + // Redirect sub.store to vercel webpage + $app.get('/', async (req, res) => { + // 302 redirect + res.set('location', 'https://sub-store.vercel.app/').status(302).end(); + }); + + // handle preflight request for QX + if (ENV().isQX) { + $app.options('/', async (req, res) => { + res.status(200).end(); + }); + } + + $app.all('/', (_, res) => { + res.send('Hello from sub-store, made with ❤️ by Peng-YM'); + }); +} + +function getEnv(req, res) { + success(res, env); +} + +async function refresh(_, res) { + // 1. get GitHub avatar and artifact store + await updateGitHubAvatar(); + await updateArtifactStore(); + + // 2. clear resource cache + resourceCache.revokeAll(); + success(res); +} + +async function gistBackup(req, res) { + const { action } = req.query; + // read token + const { gistToken } = $.read(SETTINGS_KEY); + if (!gistToken) { + failed( + res, + new RequestInvalidError( + 'GIST_TOKEN_NOT_FOUND', + `GitHub Token is required for backup!`, + ), + ); + } else { + const gist = new Gist({ + token: gistToken, + key: GIST_BACKUP_KEY, + }); + try { + let content; + const settings = $.read(SETTINGS_KEY); + const updated = settings.syncTime; + switch (action) { + case 'upload': + // update syncTime + settings.syncTime = new Date().getTime(); + $.write(settings, SETTINGS_KEY); + content = $.read('#sub-store'); + if ($.env.isNode) + content = JSON.stringify($.cache, null, ` `); + $.info(`上传备份中...`); + try { + await gist.upload({ + [GIST_BACKUP_FILE_NAME]: { content }, + }); + } catch (err) { + // restore syncTime if upload failed + settings.syncTime = updated; + $.write(settings, SETTINGS_KEY); + throw err; + } + break; + case 'download': + $.info(`还原备份中...`); + content = await gist.download(GIST_BACKUP_FILE_NAME); + try { + if ( + Object.keys(JSON.parse(content).settings).length === + 0 + ) { + throw new Error( + '备份文件应该至少包含 settings 字段', + ); + } + } catch (err) { + $.error( + `Gist 备份文件校验失败, 无法还原\nReason: ${ + err.message ?? err + }`, + ); + throw new Error('Gist 备份文件校验失败, 无法还原'); + } + // restore settings + $.write(content, '#sub-store'); + if ($.env.isNode) { + content = JSON.parse(content); + $.cache = content; + $.persistCache(); + } + $.info(`perform migration after restoring from gist...`); + migrate(); + $.info(`migration completed`); + $.info(`还原备份完成`); + break; + } + success(res); + } catch (err) { + failed( + res, + new InternalServerError( + 'BACKUP_FAILED', + `Failed to ${action} data to gist!`, + `Reason: ${err.message ?? err}`, + ), + ); + } + } +} diff --git a/backend/src/restful/module.js b/backend/src/restful/module.js new file mode 100644 index 000000000..6ef888554 --- /dev/null +++ b/backend/src/restful/module.js @@ -0,0 +1,116 @@ +import { deleteByName, findByName, updateByName } from '@/utils/database'; +import { MODULES_KEY } from '@/constants'; +import { failed, success } from '@/restful/response'; +import $ from '@/core/app'; +import { RequestInvalidError, ResourceNotFoundError } from '@/restful/errors'; +import { hex_md5 } from '@/vendor/md5'; + +export default function register($app) { + if (!$.read(MODULES_KEY)) $.write([], MODULES_KEY); + + $app.route('/api/module/:name') + .get(getModule) + .patch(updateModule) + .delete(deleteModule); + + $app.route('/api/modules') + .get(getAllModules) + .post(createModule) + .put(replaceModule); +} + +// module API +function createModule(req, res) { + const module = req.body; + module.name = `${module.name ?? hex_md5(JSON.stringify(module))}`; + $.info(`正在创建模块:${module.name}`); + const allModules = $.read(MODULES_KEY); + if (findByName(allModules, module.name)) { + return failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + req.body.name + ? `已存在 name 为 ${module.name} 的模块` + : `已存在相同的模块 请勿重复添加`, + ), + ); + } + allModules.push(module); + $.write(allModules, MODULES_KEY); + success(res, module, 201); +} + +function getModule(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allModules = $.read(MODULES_KEY); + const module = findByName(allModules, name); + if (module) { + res.set('Content-Type', 'text/plain; charset=utf-8').send( + module.content, + ); + } else { + failed( + res, + new ResourceNotFoundError( + `MODULE_NOT_FOUND`, + `Module ${name} does not exist`, + 404, + ), + ); + } +} + +function updateModule(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + let module = req.body; + const allModules = $.read(MODULES_KEY); + const oldModule = findByName(allModules, name); + if (oldModule) { + const newModule = { + ...oldModule, + ...module, + }; + $.info(`正在更新模块:${name}...`); + + updateByName(allModules, name, newModule); + $.write(allModules, MODULES_KEY); + success(res, newModule); + } else { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Module ${name} does not exist!`, + ), + 404, + ); + } +} + +function deleteModule(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`正在删除模块:${name}`); + let allModules = $.read(MODULES_KEY); + deleteByName(allModules, name); + $.write(allModules, MODULES_KEY); + success(res); +} + +function getAllModules(req, res) { + const allModules = $.read(MODULES_KEY); + success( + res, + // eslint-disable-next-line no-unused-vars + allModules.map(({ content, ...rest }) => rest), + ); +} + +function replaceModule(req, res) { + const allModules = req.body; + $.write(allModules, MODULES_KEY); + success(res); +} diff --git a/backend/src/restful/node-info.js b/backend/src/restful/node-info.js new file mode 100644 index 000000000..17ddc7744 --- /dev/null +++ b/backend/src/restful/node-info.js @@ -0,0 +1,59 @@ +import producer from '@/core/proxy-utils/producers'; +import { HTTP } from '@/vendor/open-api'; +import { failed, success } from '@/restful/response'; +import { NetworkError } from '@/restful/errors'; + +export default function register($app) { + $app.post('/api/utils/node-info', getNodeInfo); +} + +async function getNodeInfo(req, res) { + const proxy = req.body; + const lang = req.query.lang || 'zh-CN'; + let shareUrl; + try { + shareUrl = producer.URI.produce(proxy); + } catch (err) { + // do nothing + } + + try { + const $http = HTTP(); + const info = await $http + .get({ + url: `http://ip-api.com/json/${encodeURIComponent( + `${proxy.server}` + .trim() + .replace(/^\[/, '') + .replace(/\]$/, ''), + )}?lang=${lang}`, + headers: { + 'User-Agent': + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15', + }, + }) + .then((resp) => { + const data = JSON.parse(resp.body); + if (data.status !== 'success') { + throw new Error(data.message); + } + + // remove unnecessary fields + delete data.status; + return data; + }); + success(res, { + shareUrl, + info, + }); + } catch (err) { + failed( + res, + new NetworkError( + 'FAILED_TO_GET_NODE_INFO', + `Failed to get node info`, + `Reason: ${err}`, + ), + ); + } +} diff --git a/backend/src/restful/preview.js b/backend/src/restful/preview.js new file mode 100644 index 000000000..47bd07387 --- /dev/null +++ b/backend/src/restful/preview.js @@ -0,0 +1,300 @@ +import { InternalServerError } from './errors'; +import { ProxyUtils } from '@/core/proxy-utils'; +import { findByName } from '@/utils/database'; +import { success, failed } from './response'; +import download from '@/utils/download'; +import { render } from '@/utils/tpl'; +import { SUBS_KEY } from '@/constants'; +import $ from '@/core/app'; + +export default function register($app) { + $app.post('/api/preview/sub', compareSub); + $app.post('/api/preview/collection', compareCollection); + $app.post('/api/preview/file', previewFile); +} + +async function previewFile(req, res) { + try { + const file = req.body; + let content; + if ( + file.source === 'local' && + !['localFirst', 'remoteFirst'].includes(file.mergeSources) + ) { + content = file.content; + } else { + const errors = {}; + content = await Promise.all( + file.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, file.ua); + } catch (err) { + errors[url] = err; + $.error( + `文件 ${file.name} 的远程文件 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + + if ( + !file.ignoreFailedRemoteFile && + Object.keys(errors).length > 0 + ) { + throw new Error( + `文件 ${file.name} 的远程文件 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + if (file.mergeSources === 'localFirst') { + content.unshift(file.content); + } else if (file.mergeSources === 'remoteFirst') { + content.push(file.content); + } + } + // parse proxies + const files = (Array.isArray(content) ? content : [content]).flat(); + let filesContent = files + .filter((i) => i != null && i !== '') + .join('\n'); + + if (file.isTpl) { + filesContent = await render(filesContent); + } + + // apply processors + const processed = + Array.isArray(file.process) && file.process.length > 0 + ? await ProxyUtils.process( + { $files: files, $content: filesContent }, + file.process, + ) + : { $content: filesContent, $files: files }; + + // produce + success(res, { + original: filesContent, + processed: processed?.$content ?? '', + }); + } catch (err) { + $.error(err.message ?? err); + failed( + res, + new InternalServerError( + `INTERNAL_SERVER_ERROR`, + `Failed to preview file`, + `Reason: ${err.message ?? err}`, + ), + ); + } +} + +async function compareSub(req, res) { + try { + const sub = req.body; + const target = req.query.target || 'JSON'; + let content; + if ( + sub.source === 'local' && + !['localFirst', 'remoteFirst'].includes(sub.mergeSources) + ) { + content = sub.content; + } else { + const errors = {}; + content = await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, sub.ua); + } catch (err) { + errors[url] = err; + $.error( + `订阅 ${sub.name} 的远程订阅 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + + if (!sub.ignoreFailedRemoteSub && Object.keys(errors).length > 0) { + throw new Error( + `订阅 ${sub.name} 的远程订阅 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + if (sub.mergeSources === 'localFirst') { + content.unshift(sub.content); + } else if (sub.mergeSources === 'remoteFirst') { + content.push(sub.content); + } + } + // parse proxies + const original = (Array.isArray(content) ? content : [content]) + .map((i) => ProxyUtils.parse(i)) + .flat(); + + // add id + original.forEach((proxy, i) => { + proxy.id = i; + proxy.subName = sub.name; + }); + + // apply processors + const processed = await ProxyUtils.process( + original, + sub.process || [], + target, + { [sub.name]: sub }, + ); + + // produce + success(res, { original, processed }); + } catch (err) { + $.error(err.message ?? err); + failed( + res, + new InternalServerError( + `INTERNAL_SERVER_ERROR`, + `Failed to preview subscription`, + `Reason: ${err.message ?? err}`, + ), + ); + } +} + +async function compareCollection(req, res) { + try { + const allSubs = $.read(SUBS_KEY); + const collection = req.body; + const subnames = collection.subscriptions; + const results = {}; + const errors = {}; + await Promise.all( + subnames.map(async (name) => { + const sub = findByName(allSubs, name); + try { + let raw; + if ( + sub.source === 'local' && + !['localFirst', 'remoteFirst'].includes( + sub.mergeSources, + ) + ) { + raw = sub.content; + } else { + const errors = {}; + raw = await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, sub.ua); + } catch (err) { + errors[url] = err; + $.error( + `订阅 ${sub.name} 的远程订阅 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + if ( + !sub.ignoreFailedRemoteSub && + Object.keys(errors).length > 0 + ) { + throw new Error( + `订阅 ${sub.name} 的远程订阅 ${Object.keys( + errors, + ).join(', ')} 发生错误, 请查看日志`, + ); + } + if (sub.mergeSources === 'localFirst') { + raw.unshift(sub.content); + } else if (sub.mergeSources === 'remoteFirst') { + raw.push(sub.content); + } + } + // parse proxies + let currentProxies = (Array.isArray(raw) ? raw : [raw]) + .map((i) => ProxyUtils.parse(i)) + .flat(); + + currentProxies.forEach((proxy) => { + proxy.subName = sub.name; + proxy.collectionName = collection.name; + }); + + // apply processors + currentProxies = await ProxyUtils.process( + currentProxies, + sub.process || [], + 'JSON', + { [sub.name]: sub, _collection: collection }, + ); + results[name] = currentProxies; + } catch (err) { + errors[name] = err; + + $.error( + `❌ 处理组合订阅中的子订阅: ${ + sub.name + }时出现错误:${err}!进度--${ + 100 * (processed / subnames.length).toFixed(1) + }%`, + ); + } + }), + ); + if ( + !collection.ignoreFailedRemoteSub && + Object.keys(errors).length > 0 + ) { + throw new Error( + `组合订阅 ${collection.name} 中的子订阅 ${Object.keys( + errors, + ).join(', ')} 发生错误, 请查看日志`, + ); + } + // merge proxies with the original order + const original = Array.prototype.concat.apply( + [], + subnames.map((name) => results[name] || []), + ); + + original.forEach((proxy, i) => { + proxy.id = i; + proxy.collectionName = collection.name; + }); + + const processed = await ProxyUtils.process( + original, + collection.process || [], + 'JSON', + { _collection: collection }, + ); + + success(res, { original, processed }); + } catch (err) { + $.error(err.message ?? err); + failed( + res, + new InternalServerError( + `INTERNAL_SERVER_ERROR`, + `Failed to preview collection`, + `Reason: ${err.message ?? err}`, + ), + ); + } +} diff --git a/backend/src/restful/response.js b/backend/src/restful/response.js new file mode 100644 index 000000000..4ded89135 --- /dev/null +++ b/backend/src/restful/response.js @@ -0,0 +1,18 @@ +export function success(resp, data, statusCode) { + resp.status(statusCode || 200).json({ + status: 'success', + data, + }); +} + +export function failed(resp, error, statusCode) { + resp.status(statusCode || 500).json({ + status: 'failed', + error: { + code: error.code, + type: error.type, + message: error.message, + details: error.details, + }, + }); +} diff --git a/backend/src/restful/settings.js b/backend/src/restful/settings.js new file mode 100644 index 000000000..d80f48ee8 --- /dev/null +++ b/backend/src/restful/settings.js @@ -0,0 +1,86 @@ +import { SETTINGS_KEY, ARTIFACT_REPOSITORY_KEY } from '@/constants'; +import { success } from './response'; +import $ from '@/core/app'; +import Gist from '@/utils/gist'; + +export default function register($app) { + const settings = $.read(SETTINGS_KEY); + if (!settings) $.write({}, SETTINGS_KEY); + $app.route('/api/settings').get(getSettings).patch(updateSettings); +} + +async function getSettings(req, res) { + let settings = $.read(SETTINGS_KEY); + if (!settings) { + settings = {}; + $.write(settings, SETTINGS_KEY); + } + + if (!settings.avatarUrl) await updateGitHubAvatar(); + if (!settings.artifactStore) await updateArtifactStore(); + success(res, settings); +} + +async function updateSettings(req, res) { + const settings = $.read(SETTINGS_KEY); + const newSettings = { + ...settings, + ...req.body, + }; + $.write(newSettings, SETTINGS_KEY); + await updateGitHubAvatar(); + await updateArtifactStore(); + success(res, newSettings); +} + +export async function updateGitHubAvatar() { + const settings = $.read(SETTINGS_KEY); + const username = settings.githubUser; + if (username) { + try { + const data = await $.http + .get({ + url: `https://api.github.com/users/${username}`, + headers: { + 'User-Agent': + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36', + }, + }) + .then((resp) => JSON.parse(resp.body)); + settings.avatarUrl = data['avatar_url']; + $.write(settings, SETTINGS_KEY); + } catch (err) { + $.error( + `Failed to fetch GitHub avatar for User: ${username}. Reason: ${ + err.message ?? err + }`, + ); + } + } +} + +export async function updateArtifactStore() { + $.log('Updating artifact store'); + const settings = $.read(SETTINGS_KEY); + const { githubUser, gistToken } = settings; + if (githubUser && gistToken) { + const manager = new Gist({ + token: gistToken, + key: ARTIFACT_REPOSITORY_KEY, + }); + + try { + const gistId = await manager.locate(); + if (gistId !== -1) { + settings.artifactStore = `https://gist.github.com/${githubUser}/${gistId}`; + $.write(settings, SETTINGS_KEY); + } + } catch (err) { + $.error( + `Failed to fetch artifact store for User: ${githubUser}. Reason: ${ + err.message ?? err + }`, + ); + } + } +} diff --git a/backend/src/restful/sort.js b/backend/src/restful/sort.js new file mode 100644 index 000000000..03240e05f --- /dev/null +++ b/backend/src/restful/sort.js @@ -0,0 +1,49 @@ +import { + ARTIFACTS_KEY, + COLLECTIONS_KEY, + SUBS_KEY, + FILES_KEY, +} from '@/constants'; +import $ from '@/core/app'; +import { success } from '@/restful/response'; + +export default function register($app) { + $app.post('/api/sort/subs', sortSubs); + $app.post('/api/sort/collections', sortCollections); + $app.post('/api/sort/artifacts', sortArtifacts); + $app.post('/api/sort/files', sortFiles); +} + +function sortSubs(req, res) { + const orders = req.body; + const allSubs = $.read(SUBS_KEY); + allSubs.sort((a, b) => orders.indexOf(a.name) - orders.indexOf(b.name)); + $.write(allSubs, SUBS_KEY); + success(res, allSubs); +} + +function sortCollections(req, res) { + const orders = req.body; + const allCols = $.read(COLLECTIONS_KEY); + allCols.sort((a, b) => orders.indexOf(a.name) - orders.indexOf(b.name)); + $.write(allCols, COLLECTIONS_KEY); + success(res, allCols); +} + +function sortArtifacts(req, res) { + const orders = req.body; + const allArtifacts = $.read(ARTIFACTS_KEY); + allArtifacts.sort( + (a, b) => orders.indexOf(a.name) - orders.indexOf(b.name), + ); + $.write(allArtifacts, ARTIFACTS_KEY); + success(res, allArtifacts); +} + +function sortFiles(req, res) { + const orders = req.body; + const allFiles = $.read(FILES_KEY); + allFiles.sort((a, b) => orders.indexOf(a.name) - orders.indexOf(b.name)); + $.write(allFiles, FILES_KEY); + success(res, allFiles); +} diff --git a/backend/src/restful/subscriptions.js b/backend/src/restful/subscriptions.js new file mode 100644 index 000000000..17d4f538d --- /dev/null +++ b/backend/src/restful/subscriptions.js @@ -0,0 +1,211 @@ +import { + NetworkError, + InternalServerError, + ResourceNotFoundError, + RequestInvalidError, +} from './errors'; +import { deleteByName, findByName, updateByName } from '@/utils/database'; +import { SUBS_KEY, COLLECTIONS_KEY, ARTIFACTS_KEY } from '@/constants'; +import { getFlowHeaders, parseFlowHeaders } from '@/utils/flow'; +import { success, failed } from './response'; +import $ from '@/core/app'; + +if (!$.read(SUBS_KEY)) $.write({}, SUBS_KEY); + +export default function register($app) { + $app.get('/api/sub/flow/:name', getFlowInfo); + + $app.route('/api/sub/:name') + .get(getSubscription) + .patch(updateSubscription) + .delete(deleteSubscription); + + $app.route('/api/subs') + .get(getAllSubscriptions) + .post(createSubscription) + .put(replaceSubscriptions); +} + +// subscriptions API +async function getFlowInfo(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allSubs = $.read(SUBS_KEY); + const sub = findByName(allSubs, name); + if (!sub) { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Subscription ${name} does not exist!`, + ), + 404, + ); + return; + } + if (sub.source === 'local') { + failed( + res, + new RequestInvalidError( + 'NO_FLOW_INFO', + 'N/A', + `Local subscription ${name} has no flow information!`, + ), + ); + return; + } + try { + const flowHeaders = await getFlowHeaders(sub.url); + if (!flowHeaders) { + failed( + res, + new InternalServerError( + 'NO_FLOW_INFO', + 'No flow info', + `Failed to fetch flow headers`, + ), + ); + return; + } + + success(res, parseFlowHeaders(flowHeaders)); + } catch (err) { + failed( + res, + new NetworkError( + `URL_NOT_ACCESSIBLE`, + `The URL for subscription ${name} is inaccessible.`, + ), + ); + } +} + +function createSubscription(req, res) { + const sub = req.body; + $.info(`正在创建订阅: ${sub.name}`); + if (/\//.test(sub.name)) { + failed( + res, + new RequestInvalidError( + 'INVALID_NAME', + `Subscription ${sub.name} is invalid`, + ), + ); + return; + } + const allSubs = $.read(SUBS_KEY); + if (findByName(allSubs, sub.name)) { + failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + `Subscription ${sub.name} already exists.`, + ), + ); + return; + } + allSubs.push(sub); + $.write(allSubs, SUBS_KEY); + success(res, sub, 201); +} + +function getSubscription(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allSubs = $.read(SUBS_KEY); + const sub = findByName(allSubs, name); + if (sub) { + success(res, sub); + } else { + failed( + res, + new ResourceNotFoundError( + `SUBSCRIPTION_NOT_FOUND`, + `Subscription ${name} does not exist`, + 404, + ), + ); + } +} + +function updateSubscription(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); // the original name + let sub = req.body; + const allSubs = $.read(SUBS_KEY); + const oldSub = findByName(allSubs, name); + if (oldSub) { + const newSub = { + ...oldSub, + ...sub, + }; + $.info(`正在更新订阅: ${name}`); + // allow users to update the subscription name + if (name !== sub.name) { + // update all collections refer to this name + const allCols = $.read(COLLECTIONS_KEY) || []; + for (const collection of allCols) { + const idx = collection.subscriptions.indexOf(name); + if (idx !== -1) { + collection.subscriptions[idx] = sub.name; + } + } + + // update all artifacts referring this subscription + const allArtifacts = $.read(ARTIFACTS_KEY) || []; + for (const artifact of allArtifacts) { + if ( + artifact.type === 'subscription' && + artifact.source == name + ) { + artifact.source = sub.name; + } + } + + $.write(allCols, COLLECTIONS_KEY); + $.write(allArtifacts, ARTIFACTS_KEY); + } + updateByName(allSubs, name, newSub); + $.write(allSubs, SUBS_KEY); + success(res, newSub); + } else { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Subscription ${name} does not exist!`, + ), + 404, + ); + } +} + +function deleteSubscription(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`删除订阅:${name}...`); + // delete from subscriptions + let allSubs = $.read(SUBS_KEY); + deleteByName(allSubs, name); + $.write(allSubs, SUBS_KEY); + // delete from collections + const allCols = $.read(COLLECTIONS_KEY); + for (const collection of allCols) { + collection.subscriptions = collection.subscriptions.filter( + (s) => s !== name, + ); + } + $.write(allCols, COLLECTIONS_KEY); + success(res); +} + +function getAllSubscriptions(req, res) { + const allSubs = $.read(SUBS_KEY); + success(res, allSubs); +} + +function replaceSubscriptions(req, res) { + const allSubs = req.body; + $.write(allSubs, SUBS_KEY); + success(res); +} diff --git a/backend/src/restful/sync.js b/backend/src/restful/sync.js new file mode 100644 index 000000000..8bd8772b5 --- /dev/null +++ b/backend/src/restful/sync.js @@ -0,0 +1,557 @@ +import $ from '@/core/app'; +import { + ARTIFACTS_KEY, + COLLECTIONS_KEY, + RULES_KEY, + SUBS_KEY, + FILES_KEY, +} from '@/constants'; +import { failed, success } from '@/restful/response'; +import { InternalServerError, ResourceNotFoundError } from '@/restful/errors'; +import { findByName } from '@/utils/database'; +import download from '@/utils/download'; +import { ProxyUtils } from '@/core/proxy-utils'; +import { RuleUtils } from '@/core/rule-utils'; +import { syncToGist } from '@/restful/artifacts'; +import { render } from '@/utils/tpl'; + +export default function register($app) { + // Initialization + if (!$.read(ARTIFACTS_KEY)) $.write({}, ARTIFACTS_KEY); + + // sync all artifacts + $app.get('/api/sync/artifacts', syncAllArtifacts); + $app.get('/api/sync/artifact/:name', syncArtifact); +} + +async function produceArtifact({ + type, + name, + platform, + url, + ua, + content, + mergeSources, + ignoreFailedRemoteSub, + ignoreFailedRemoteFile, + produceType, + produceOpts = {}, +}) { + platform = platform || 'JSON'; + + if (type === 'subscription') { + const allSubs = $.read(SUBS_KEY); + const sub = findByName(allSubs, name); + let raw; + if (content && !['localFirst', 'remoteFirst'].includes(mergeSources)) { + raw = content; + } else if (url) { + const errors = {}; + raw = await Promise.all( + url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, ua || sub.ua); + } catch (err) { + errors[url] = err; + $.error( + `订阅 ${sub.name} 的远程订阅 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + let subIgnoreFailedRemoteSub = sub.ignoreFailedRemoteSub; + if (ignoreFailedRemoteSub != null && ignoreFailedRemoteSub !== '') { + subIgnoreFailedRemoteSub = ignoreFailedRemoteSub; + } + if (!subIgnoreFailedRemoteSub && Object.keys(errors).length > 0) { + throw new Error( + `订阅 ${sub.name} 的远程订阅 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + if (mergeSources === 'localFirst') { + raw.unshift(content); + } else if (mergeSources === 'remoteFirst') { + raw.push(content); + } + } else if ( + sub.source === 'local' && + !['localFirst', 'remoteFirst'].includes(sub.mergeSources) + ) { + raw = sub.content; + } else { + const errors = {}; + raw = await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, ua || sub.ua); + } catch (err) { + errors[url] = err; + $.error( + `订阅 ${sub.name} 的远程订阅 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + let subIgnoreFailedRemoteSub = sub.ignoreFailedRemoteSub; + if (ignoreFailedRemoteSub != null && ignoreFailedRemoteSub !== '') { + subIgnoreFailedRemoteSub = ignoreFailedRemoteSub; + } + if (!subIgnoreFailedRemoteSub && Object.keys(errors).length > 0) { + throw new Error( + `订阅 ${sub.name} 的远程订阅 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + if (sub.mergeSources === 'localFirst') { + raw.unshift(sub.content); + } else if (sub.mergeSources === 'remoteFirst') { + raw.push(sub.content); + } + } + // parse proxies + let proxies = (Array.isArray(raw) ? raw : [raw]) + .map((i) => ProxyUtils.parse(i)) + .flat(); + + proxies.forEach((proxy) => { + proxy.subName = sub.name; + }); + // apply processors + proxies = await ProxyUtils.process( + proxies, + sub.process || [], + platform, + { [sub.name]: sub }, + ); + if (proxies.length === 0) { + throw new Error(`订阅 ${name} 中不含有效节点`); + } + // check duplicate + const exist = {}; + for (const proxy of proxies) { + if (exist[proxy.name]) { + $.notify( + '🌍 Sub-Store', + `⚠️ 订阅 ${name} 包含重复节点 ${proxy.name}!`, + '请仔细检测配置!', + { + 'media-url': + 'https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png', + }, + ); + break; + } + exist[proxy.name] = true; + } + // produce + return ProxyUtils.produce(proxies, platform, produceType, produceOpts); + } else if (type === 'collection') { + const allSubs = $.read(SUBS_KEY); + const allCols = $.read(COLLECTIONS_KEY); + const collection = findByName(allCols, name); + const subnames = collection.subscriptions; + const results = {}; + const errors = {}; + let processed = 0; + + await Promise.all( + subnames.map(async (name) => { + const sub = findByName(allSubs, name); + try { + $.info(`正在处理子订阅:${sub.name}...`); + let raw; + if ( + sub.source === 'local' && + !['localFirst', 'remoteFirst'].includes( + sub.mergeSources, + ) + ) { + raw = sub.content; + } else { + const errors = {}; + raw = await await Promise.all( + sub.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, sub.ua); + } catch (err) { + errors[url] = err; + $.error( + `订阅 ${sub.name} 的远程订阅 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + if ( + !sub.ignoreFailedRemoteSub && + Object.keys(errors).length > 0 + ) { + throw new Error( + `订阅 ${sub.name} 的远程订阅 ${Object.keys( + errors, + ).join(', ')} 发生错误, 请查看日志`, + ); + } + if (sub.mergeSources === 'localFirst') { + raw.unshift(sub.content); + } else if (sub.mergeSources === 'remoteFirst') { + raw.push(sub.content); + } + } + // parse proxies + let currentProxies = (Array.isArray(raw) ? raw : [raw]) + .map((i) => ProxyUtils.parse(i)) + .flat(); + + currentProxies.forEach((proxy) => { + proxy.subName = sub.name; + proxy.collectionName = collection.name; + }); + + // apply processors + currentProxies = await ProxyUtils.process( + currentProxies, + sub.process || [], + platform, + { [sub.name]: sub, _collection: collection }, + ); + results[name] = currentProxies; + processed++; + $.info( + `✅ 子订阅:${sub.name}加载成功,进度--${ + 100 * (processed / subnames.length).toFixed(1) + }% `, + ); + } catch (err) { + processed++; + errors[name] = err; + $.error( + `❌ 处理组合订阅中的子订阅: ${ + sub.name + }时出现错误:${err}!进度--${ + 100 * (processed / subnames.length).toFixed(1) + }%`, + ); + } + }), + ); + let collectionIgnoreFailedRemoteSub = collection.ignoreFailedRemoteSub; + if (ignoreFailedRemoteSub != null && ignoreFailedRemoteSub !== '') { + collectionIgnoreFailedRemoteSub = ignoreFailedRemoteSub; + } + if ( + !collectionIgnoreFailedRemoteSub && + Object.keys(errors).length > 0 + ) { + throw new Error( + `组合订阅 ${name} 中的子订阅 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + + // merge proxies with the original order + let proxies = Array.prototype.concat.apply( + [], + subnames.map((name) => results[name] || []), + ); + + proxies.forEach((proxy) => { + proxy.collectionName = collection.name; + }); + + // apply own processors + proxies = await ProxyUtils.process( + proxies, + collection.process || [], + platform, + { _collection: collection }, + ); + if (proxies.length === 0) { + throw new Error(`组合订阅 ${name} 中不含有效节点`); + } + // check duplicate + const exist = {}; + for (const proxy of proxies) { + if (exist[proxy.name]) { + $.notify( + '🌍 Sub-Store', + `⚠️ 组合订阅 ${name} 包含重复节点 ${proxy.name}!`, + '请仔细检测配置!', + { + 'media-url': + 'https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png', + }, + ); + break; + } + exist[proxy.name] = true; + } + return ProxyUtils.produce(proxies, platform, produceType, produceOpts); + } else if (type === 'rule') { + const allRules = $.read(RULES_KEY); + const rule = findByName(allRules, name); + let rules = []; + for (let i = 0; i < rule.urls.length; i++) { + const url = rule.urls[i]; + $.info( + `正在处理URL:${url},进度--${ + 100 * ((i + 1) / rule.urls.length).toFixed(1) + }% `, + ); + try { + const { body } = await download(url); + const currentRules = RuleUtils.parse(body); + rules = rules.concat(currentRules); + } catch (err) { + $.error( + `处理分流订阅中的URL: ${url}时出现错误:${err}! 该订阅已被跳过。`, + ); + } + } + // remove duplicates + rules = await RuleUtils.process(rules, [ + { type: 'Remove Duplicate Filter' }, + ]); + // produce output + return RuleUtils.produce(rules, platform); + } else if (type === 'file') { + const allFiles = $.read(FILES_KEY); + const file = findByName(allFiles, name); + if (!file) throw new Error(`找不到文件 ${name}`); + let raw; + if (content && !['localFirst', 'remoteFirst'].includes(mergeSources)) { + raw = content; + } else if (url) { + const errors = {}; + raw = await Promise.all( + url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, ua || file.ua); + } catch (err) { + errors[url] = err; + $.error( + `文件 ${file.name} 的远程文件 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + let fileIgnoreFailedRemoteFile = file.ignoreFailedRemoteFile; + if ( + ignoreFailedRemoteFile != null && + ignoreFailedRemoteFile !== '' + ) { + fileIgnoreFailedRemoteFile = ignoreFailedRemoteFile; + } + if (!fileIgnoreFailedRemoteFile && Object.keys(errors).length > 0) { + throw new Error( + `文件 ${file.name} 的远程文件 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + if (mergeSources === 'localFirst') { + raw.unshift(content); + } else if (mergeSources === 'remoteFirst') { + raw.push(content); + } + } else if ( + file.source === 'local' && + !['localFirst', 'remoteFirst'].includes(file.mergeSources) + ) { + raw = file.content; + } else { + const errors = {}; + raw = await Promise.all( + file.url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length) + .map(async (url) => { + try { + return await download(url, ua || file.ua); + } catch (err) { + errors[url] = err; + $.error( + `文件 ${file.name} 的远程文件 ${url} 发生错误: ${err}`, + ); + return ''; + } + }), + ); + let fileIgnoreFailedRemoteFile = file.ignoreFailedRemoteFile; + if ( + ignoreFailedRemoteFile != null && + ignoreFailedRemoteFile !== '' + ) { + fileIgnoreFailedRemoteFile = ignoreFailedRemoteFile; + } + if (!fileIgnoreFailedRemoteFile && Object.keys(errors).length > 0) { + throw new Error( + `文件 ${file.name} 的远程文件 ${Object.keys(errors).join( + ', ', + )} 发生错误, 请查看日志`, + ); + } + if (file.mergeSources === 'localFirst') { + raw.unshift(file.content); + } else if (file.mergeSources === 'remoteFirst') { + raw.push(file.content); + } + } + const files = (Array.isArray(raw) ? raw : [raw]).flat(); + let filesContent = files + .filter((i) => i != null && i !== '') + .join('\n'); + + if (file.isTpl) { + filesContent = await render(filesContent); + } + // apply processors + const processed = + Array.isArray(file.process) && file.process.length > 0 + ? await ProxyUtils.process( + { $files: files, $content: filesContent }, + file.process, + ) + : { $content: filesContent, $files: files }; + + return processed?.$content ?? ''; + } +} + +async function syncAllArtifacts(_, res) { + $.info('开始同步所有远程配置...'); + const allArtifacts = $.read(ARTIFACTS_KEY); + const files = {}; + + try { + await Promise.all( + allArtifacts.map(async (artifact) => { + if (artifact.sync) { + $.info(`正在同步云配置:${artifact.name}...`); + const output = await produceArtifact({ + type: artifact.type, + name: artifact.source, + platform: artifact.platform, + }); + + files[artifact.name] = { + content: output, + }; + } + }), + ); + + const resp = await syncToGist(files); + const body = JSON.parse(resp.body); + + for (const artifact of allArtifacts) { + if (artifact.sync) { + artifact.updated = new Date().getTime(); + // extract real url from gist + artifact.url = body.files[artifact.name].raw_url.replace( + /\/raw\/[^/]*\/(.*)/, + '/raw/$1', + ); + } + } + + $.write(allArtifacts, ARTIFACTS_KEY); + $.info('全部订阅同步成功!'); + success(res); + } catch (err) { + failed( + res, + new InternalServerError( + `FAILED_TO_SYNC_ARTIFACTS`, + `Failed to sync all artifacts`, + `Reason: ${err}`, + ), + ); + $.info(`同步订阅失败,原因:${err}`); + } +} + +async function syncArtifact(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`开始同步远程配置 ${name}...`); + const allArtifacts = $.read(ARTIFACTS_KEY); + const artifact = findByName(allArtifacts, name); + + if (!artifact) { + $.error(`找不到远程配置 ${name}`); + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Artifact ${name} does not exist!`, + ), + 404, + ); + return; + } + + try { + const output = await produceArtifact({ + type: artifact.type, + name: artifact.source, + platform: artifact.platform, + }); + + $.info( + `正在上传配置:${artifact.name}\n>>>${JSON.stringify( + artifact, + null, + 2, + )}`, + ); + const resp = await syncToGist({ + [encodeURIComponent(artifact.name)]: { + content: output, + }, + }); + artifact.updated = new Date().getTime(); + const body = JSON.parse(resp.body); + artifact.url = body.files[ + encodeURIComponent(artifact.name) + ].raw_url.replace(/\/raw\/[^/]*\/(.*)/, '/raw/$1'); + $.write(allArtifacts, ARTIFACTS_KEY); + success(res, artifact); + } catch (err) { + $.error(`远程配置 ${artifact.name} 发生错误: ${err}`); + failed( + res, + new InternalServerError( + `FAILED_TO_SYNC_ARTIFACT`, + `Failed to sync artifact ${name}`, + `Reason: ${err}`, + ), + ); + } +} + +export { produceArtifact }; diff --git a/backend/src/test/proxy-parsers/loon.spec.js b/backend/src/test/proxy-parsers/loon.spec.js new file mode 100644 index 000000000..37c1ca822 --- /dev/null +++ b/backend/src/test/proxy-parsers/loon.spec.js @@ -0,0 +1,144 @@ +import getLoonParser from '@/core/proxy-utils/parsers/peggy/loon'; +import { describe, it } from 'mocha'; +import testcases from './testcases'; +import { expect } from 'chai'; + +const parser = getLoonParser(); + +describe('Loon', function () { + describe('shadowsocks', function () { + it('test shadowsocks simple', function () { + const { input, expected } = testcases.SS.SIMPLE; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + it('test shadowsocks obfs + tls', function () { + const { input, expected } = testcases.SS.OBFS_TLS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + it('test shadowsocks obfs + http', function () { + const { input, expected } = testcases.SS.OBFS_HTTP; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + }); + + describe('shadowsocksr', function () { + it('test shadowsocksr simple', function () { + const { input, expected } = testcases.SSR.SIMPLE; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + }); + + describe('trojan', function () { + it('test trojan simple', function () { + const { input, expected } = testcases.TROJAN.SIMPLE; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + + it('test trojan + ws', function () { + const { input, expected } = testcases.TROJAN.WS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + + it('test trojan + wss', function () { + const { input, expected } = testcases.TROJAN.WSS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + }); + + describe('vmess', function () { + it('test vmess simple', function () { + const { input, expected } = testcases.VMESS.SIMPLE; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vmess + aead', function () { + const { input, expected } = testcases.VMESS.AEAD; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vmess + ws', function () { + const { input, expected } = testcases.VMESS.WS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vmess + wss', function () { + const { input, expected } = testcases.VMESS.WSS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vmess + http', function () { + const { input, expected } = testcases.VMESS.HTTP; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vmess + http + tls', function () { + const { input, expected } = testcases.VMESS.HTTP_TLS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + }); + + describe('vless', function () { + it('test vless simple', function () { + const { input, expected } = testcases.VLESS.SIMPLE; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vless + ws', function () { + const { input, expected } = testcases.VLESS.WS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vless + wss', function () { + const { input, expected } = testcases.VLESS.WSS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vless + http', function () { + const { input, expected } = testcases.VLESS.HTTP; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + + it('test vless + http + tls', function () { + const { input, expected } = testcases.VLESS.HTTP_TLS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected.Loon); + }); + }); + + describe('http(s)', function () { + it('test http simple', function () { + const { input, expected } = testcases.HTTP.SIMPLE; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + + it('test http with authentication', function () { + const { input, expected } = testcases.HTTP.AUTH; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + + it('test https', function () { + const { input, expected } = testcases.HTTP.TLS; + const proxy = parser.parse(input.Loon); + expect(proxy).eql(expected); + }); + }); +}); diff --git a/backend/src/test/proxy-parsers/qx.spec.js b/backend/src/test/proxy-parsers/qx.spec.js new file mode 100644 index 000000000..a6662fa3d --- /dev/null +++ b/backend/src/test/proxy-parsers/qx.spec.js @@ -0,0 +1,142 @@ +import getQXParser from '@/core/proxy-utils/parsers/peggy/qx'; +import { describe, it } from 'mocha'; +import testcases from './testcases'; +import { expect } from 'chai'; + +const parser = getQXParser(); + +describe('QX', function () { + describe('shadowsocks', function () { + it('test shadowsocks simple', function () { + const { input, expected } = testcases.SS.SIMPLE; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + it('test shadowsocks obfs + tls', function () { + const { input, expected } = testcases.SS.OBFS_TLS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + it('test shadowsocks obfs + http', function () { + const { input, expected } = testcases.SS.OBFS_HTTP; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + it('test shadowsocks v2ray-plugin + ws', function () { + const { input, expected } = testcases.SS.V2RAY_PLUGIN_WS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + it('test shadowsocks v2ray-plugin + wss', function () { + const { input, expected } = testcases.SS.V2RAY_PLUGIN_WSS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + }); + + describe('shadowsocksr', function () { + it('test shadowsocksr simple', function () { + const { input, expected } = testcases.SSR.SIMPLE; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + }); + + describe('trojan', function () { + it('test trojan simple', function () { + const { input, expected } = testcases.TROJAN.SIMPLE; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test trojan + ws', function () { + const { input, expected } = testcases.TROJAN.WS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test trojan + wss', function () { + const { input, expected } = testcases.TROJAN.WSS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test trojan + tls fingerprint', function () { + const { input, expected } = testcases.TROJAN.TLS_FINGERPRINT; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + }); + + describe('vmess', function () { + it('test vmess simple', function () { + const { input, expected } = testcases.VMESS.SIMPLE; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected.QX); + }); + + it('test vmess aead', function () { + const { input, expected } = testcases.VMESS.AEAD; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected.QX); + }); + + it('test vmess + ws', function () { + const { input, expected } = testcases.VMESS.WS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected.QX); + }); + + it('test vmess + wss', function () { + const { input, expected } = testcases.VMESS.WSS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected.QX); + }); + + it('test vmess + http', function () { + const { input, expected } = testcases.VMESS.HTTP; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected.QX); + }); + }); + + describe('http', function () { + it('test http simple', function () { + const { input, expected } = testcases.HTTP.SIMPLE; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test http with authentication', function () { + const { input, expected } = testcases.HTTP.AUTH; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test https', function () { + const { input, expected } = testcases.HTTP.TLS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + }); + + describe('socks5', function () { + it('test socks5 simple', function () { + const { input, expected } = testcases.SOCKS5.SIMPLE; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test socks5 with authentication', function () { + const { input, expected } = testcases.SOCKS5.AUTH; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + + it('test socks5 + tls', function () { + const { input, expected } = testcases.SOCKS5.TLS; + const proxy = parser.parse(input.QX); + expect(proxy).eql(expected); + }); + }); +}); diff --git a/backend/src/test/proxy-parsers/surge.spec.js b/backend/src/test/proxy-parsers/surge.spec.js new file mode 100644 index 000000000..24819d33d --- /dev/null +++ b/backend/src/test/proxy-parsers/surge.spec.js @@ -0,0 +1,138 @@ +import getSurgeParser from '@/core/proxy-utils/parsers/peggy/surge'; +import { describe, it } from 'mocha'; +import testcases from './testcases'; +import { expect } from 'chai'; + +const parser = getSurgeParser(); + +describe('Surge', function () { + describe('shadowsocks', function () { + it('test shadowsocks simple', function () { + const { input, expected } = testcases.SS.SIMPLE; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + it('test shadowsocks obfs + tls', function () { + const { input, expected } = testcases.SS.OBFS_TLS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + it('test shadowsocks obfs + http', function () { + const { input, expected } = testcases.SS.OBFS_HTTP; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + }); + + describe('trojan', function () { + it('test trojan simple', function () { + const { input, expected } = testcases.TROJAN.SIMPLE; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test trojan + ws', function () { + const { input, expected } = testcases.TROJAN.WS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test trojan + wss', function () { + const { input, expected } = testcases.TROJAN.WSS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test trojan + tls fingerprint', function () { + const { input, expected } = testcases.TROJAN.TLS_FINGERPRINT; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + }); + + describe('vmess', function () { + it('test vmess simple', function () { + const { input, expected } = testcases.VMESS.SIMPLE; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected.Surge); + }); + + it('test vmess aead', function () { + const { input, expected } = testcases.VMESS.AEAD; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected.Surge); + }); + + it('test vmess + ws', function () { + const { input, expected } = testcases.VMESS.WS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected.Surge); + }); + + it('test vmess + wss', function () { + const { input, expected } = testcases.VMESS.WSS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected.Surge); + }); + }); + + describe('http', function () { + it('test http simple', function () { + const { input, expected } = testcases.HTTP.SIMPLE; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test http with authentication', function () { + const { input, expected } = testcases.HTTP.AUTH; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test https', function () { + const { input, expected } = testcases.HTTP.TLS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + }); + + describe('socks5', function () { + it('test socks5 simple', function () { + const { input, expected } = testcases.SOCKS5.SIMPLE; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test socks5 with authentication', function () { + const { input, expected } = testcases.SOCKS5.AUTH; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test socks5 + tls', function () { + const { input, expected } = testcases.SOCKS5.TLS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + }); + + describe('snell', function () { + it('test snell simple', function () { + const { input, expected } = testcases.SNELL.SIMPLE; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test snell obfs + http', function () { + const { input, expected } = testcases.SNELL.OBFS_HTTP; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + + it('test snell obfs + tls', function () { + const { input, expected } = testcases.SNELL.OBFS_TLS; + const proxy = parser.parse(input.Surge); + expect(proxy).eql(expected); + }); + }); +}); diff --git a/backend/src/test/proxy-parsers/testcases.js b/backend/src/test/proxy-parsers/testcases.js new file mode 100644 index 000000000..863922951 --- /dev/null +++ b/backend/src/test/proxy-parsers/testcases.js @@ -0,0 +1,749 @@ +function createTestCases() { + const name = 'name'; + const server = 'example.com'; + const port = 10086; + + const cipher = 'chacha20'; + + const username = 'username'; + const password = 'password'; + + const obfs_host = 'obfs.com'; + const obfs_path = '/resource/file'; + + const ssr_protocol = 'auth_chain_b'; + const ssr_protocol_param = 'def'; + const ssr_obfs = 'tls1.2_ticket_fastauth'; + const ssr_obfs_param = 'obfs.com'; + + const uuid = '23ad6b10-8d1a-40f7-8ad0-e3e35cd32291'; + + const sni = 'sni.com'; + + const tls_fingerprint = + '67:1B:C8:F2:D4:60:DD:A7:EE:60:DA:BB:A3:F9:A4:D7:C8:29:0F:3E:2F:75:B6:A9:46:88:48:7D:D3:97:7E:98'; + + const SS = { + SIMPLE: { + input: { + Loon: `${name}=shadowsocks,${server},${port},${cipher},"${password}"`, + QX: `shadowsocks=${server}:${port},method=${cipher},password=${password},tag=${name}`, + Surge: `${name}=ss,${server},${port},encrypt-method=${cipher},password=${password}`, + }, + expected: { + type: 'ss', + name, + server, + port, + cipher, + password, + }, + }, + OBFS_TLS: { + input: { + Loon: `${name}=shadowsocks,${server},${port},${cipher},"${password}",obfs-name=tls,obfs-uri=${obfs_path},obfs-host=${obfs_host}`, + QX: `shadowsocks=${server}:${port},method=${cipher},password=${password},obfs=tls,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + Surge: `${name}=ss,${server},${port},encrypt-method=${cipher},password=${password},obfs=tls,obfs-host=${obfs_host},obfs-uri=${obfs_path}`, + }, + expected: { + type: 'ss', + name, + server, + port, + cipher, + password, + plugin: 'obfs', + 'plugin-opts': { + mode: 'tls', + path: obfs_path, + host: obfs_host, + }, + }, + }, + OBFS_HTTP: { + input: { + Loon: `${name}=shadowsocks,${server},${port},${cipher},"${password}",obfs-name=http,obfs-uri=${obfs_path},obfs-host=${obfs_host}`, + QX: `shadowsocks=${server}:${port},method=${cipher},password=${password},obfs=http,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + Surge: `${name}=ss,${server},${port},encrypt-method=${cipher},password=${password},obfs=http,obfs-host=${obfs_host},obfs-uri=${obfs_path}`, + }, + expected: { + type: 'ss', + name, + server, + port, + cipher, + password, + plugin: 'obfs', + 'plugin-opts': { + mode: 'http', + path: obfs_path, + host: obfs_host, + }, + }, + }, + V2RAY_PLUGIN_WS: { + input: { + QX: `shadowsocks=${server}:${port},method=${cipher},password=${password},obfs=ws,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + }, + expected: { + type: 'ss', + name, + server, + port, + cipher, + password, + plugin: 'v2ray-plugin', + 'plugin-opts': { + mode: 'websocket', + path: obfs_path, + host: obfs_host, + }, + }, + }, + V2RAY_PLUGIN_WSS: { + input: { + QX: `shadowsocks=${server}:${port},method=${cipher},password=${password},obfs=wss,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + }, + expected: { + type: 'ss', + name, + server, + port, + cipher, + password, + plugin: 'v2ray-plugin', + 'plugin-opts': { + mode: 'websocket', + path: obfs_path, + host: obfs_host, + tls: true, + }, + }, + }, + }; + const SSR = { + SIMPLE: { + input: { + QX: `shadowsocks=${server}:${port},method=${cipher},password=${password},ssr-protocol=${ssr_protocol},ssr-protocol-param=${ssr_protocol_param},obfs=${ssr_obfs},obfs-host=${ssr_obfs_param},tag=${name}`, + Loon: `${name}=shadowsocksr,${server},${port},${cipher},"${password}",protocol=${ssr_protocol},protocol-param=${ssr_protocol_param},obfs=${ssr_obfs},obfs-param=${ssr_obfs_param}`, + }, + expected: { + type: 'ssr', + name, + server, + port, + cipher, + password, + obfs: ssr_obfs, + protocol: ssr_protocol, + 'obfs-param': ssr_obfs_param, + 'protocol-param': ssr_protocol_param, + }, + }, + }; + const TROJAN = { + SIMPLE: { + input: { + QX: `trojan=${server}:${port},password=${password},tag=${name}`, + Loon: `${name}=trojan,${server},${port},"${password}"`, + Surge: `${name}=trojan,${server},${port},password=${password}`, + }, + expected: { + type: 'trojan', + name, + server, + port, + password, + }, + }, + WS: { + input: { + QX: `trojan=${server}:${port},password=${password},obfs=ws,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + Loon: `${name}=trojan,${server},${port},"${password}",transport=ws,path=${obfs_path},host=${obfs_host}`, + Surge: `${name}=trojan,${server},${port},password=${password},ws=true,ws-path=${obfs_path},ws-headers=Host:${obfs_host}`, + }, + expected: { + type: 'trojan', + name, + server, + port, + password, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + }, + }, + WSS: { + input: { + QX: `trojan=${server}:${port},password=${password},obfs=wss,obfs-host=${obfs_host},obfs-uri=${obfs_path},tls-verification=false,tls-host=${sni},tag=${name}`, + Loon: `${name}=trojan,${server},${port},"${password}",transport=ws,path=${obfs_path},host=${obfs_host},over-tls=true,tls-name=${sni},skip-cert-verify=true`, + Surge: `${name}=trojan,${server},${port},password=${password},ws=true,ws-path=${obfs_path},ws-headers=Host:${obfs_host},skip-cert-verify=true,sni=${sni},tls=true`, + }, + expected: { + type: 'trojan', + name, + server, + port, + password, + network: 'ws', + tls: true, + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + 'skip-cert-verify': true, + sni, + }, + }, + TLS_FINGERPRINT: { + input: { + QX: `trojan=${server}:${port},password=${password},tls-verification=false,tls-host=${sni},tls-cert-sha256=${tls_fingerprint},tag=${name},over-tls=true`, + Surge: `${name}=trojan,${server},${port},password=${password},skip-cert-verify=true,sni=${sni},tls=true,server-cert-fingerprint-sha256=${tls_fingerprint}`, + }, + expected: { + type: 'trojan', + name, + server, + port, + password, + tls: true, + 'skip-cert-verify': true, + sni, + 'tls-fingerprint': tls_fingerprint, + }, + }, + }; + const VMESS = { + SIMPLE: { + input: { + QX: `vmess=${server}:${port},method=${cipher},password=${uuid},tag=${name}`, + Loon: `${name}=vmess,${server},${port},${cipher},"${uuid}"`, + Surge: `${name}=vmess,${server},${port},username=${uuid}`, + }, + expected: { + QX: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + alterId: 0, + }, + Loon: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + alterId: 0, + }, + Surge: { + type: 'vmess', + name, + server, + port, + uuid, + cipher: 'none', // Surge lacks support for specifying cipher for vmess protocol! + alterId: 0, + }, + }, + }, + AEAD: { + input: { + QX: `vmess=${server}:${port},method=${cipher},password=${uuid},aead=true,tag=${name}`, + Loon: `${name}=vmess,${server},${port},${cipher},"${uuid}",alterId=0`, + Surge: `${name}=vmess,${server},${port},username=${uuid},vmess-aead=true`, + }, + expected: { + QX: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + aead: true, + alterId: 0, + }, + Loon: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + alterId: 0, + }, + Surge: { + type: 'vmess', + name, + server, + port, + uuid, + cipher: 'none', // Surge lacks support for specifying cipher for vmess protocol! + alterId: 0, + aead: true, + }, + }, + }, + WS: { + input: { + QX: `vmess=${server}:${port},method=${cipher},password=${uuid},obfs=ws,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + Loon: `${name}=vmess,${server},${port},${cipher},"${uuid}",transport=ws,host=${obfs_host},path=${obfs_path}`, + Surge: `${name}=vmess,${server},${port},username=${uuid},ws=true,ws-path=${obfs_path},ws-headers=Host:${obfs_host}`, + }, + expected: { + QX: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + alterId: 0, + }, + Loon: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + alterId: 0, + }, + Surge: { + type: 'vmess', + name, + server, + port, + uuid, + cipher: 'none', // Surge lacks support for specifying cipher for vmess protocol! + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + alterId: 0, + }, + }, + }, + WSS: { + input: { + QX: `vmess=${server}:${port},method=${cipher},password=${uuid},obfs=wss,obfs-host=${obfs_host},obfs-uri=${obfs_path},tls-verification=false,tls-host=${sni},tag=${name}`, + Loon: `${name}=vmess,${server},${port},${cipher},"${uuid}",transport=ws,host=${obfs_host},path=${obfs_path},over-tls=true,tls-name=${sni},skip-cert-verify=true`, + Surge: `${name}=vmess,${server},${port},username=${uuid},ws=true,ws-path=${obfs_path},ws-headers=Host:${obfs_host},skip-cert-verify=true,sni=${sni},tls=true`, + }, + expected: { + QX: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + tls: true, + 'skip-cert-verify': true, + sni, + alterId: 0, + }, + Loon: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + tls: true, + 'skip-cert-verify': true, + sni, + alterId: 0, + }, + Surge: { + type: 'vmess', + name, + server, + port, + uuid, + cipher: 'none', // Surge lacks support for specifying cipher for vmess protocol! + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + tls: true, + 'skip-cert-verify': true, + sni, + alterId: 0, + }, + }, + }, + HTTP: { + input: { + QX: `vmess=${server}:${port},method=${cipher},password=${uuid},obfs=http,obfs-host=${obfs_host},obfs-uri=${obfs_path},tag=${name}`, + Loon: `${name}=vmess,${server},${port},${cipher},"${uuid}",transport=http,host=${obfs_host},path=${obfs_path}`, + }, + expected: { + QX: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'http', + 'http-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + alterId: 0, + }, + Loon: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'http', + 'http-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + alterId: 0, + }, + }, + }, + HTTP_TLS: { + input: { + Loon: `${name}=vmess,${server},${port},${cipher},"${uuid}",transport=http,host=${obfs_host},path=${obfs_path},over-tls=true,tls-name=${sni},skip-cert-verify=true`, + }, + expected: { + Loon: { + type: 'vmess', + name, + server, + port, + uuid, + cipher, + network: 'http', + 'http-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + tls: true, + 'skip-cert-verify': true, + sni, + alterId: 0, + }, + }, + }, + }; + const VLESS = { + SIMPLE: { + input: { + Loon: `${name}=vless,${server},${port},"${uuid}"`, + }, + expected: { + Loon: { + type: 'vless', + name, + server, + port, + uuid, + }, + }, + }, + WS: { + input: { + Loon: `${name}=vless,${server},${port},"${uuid}",transport=ws,host=${obfs_host},path=${obfs_path}`, + }, + expected: { + Loon: { + type: 'vless', + name, + server, + port, + uuid, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + }, + }, + }, + WSS: { + input: { + Loon: `${name}=vless,${server},${port},"${uuid}",transport=ws,host=${obfs_host},path=${obfs_path},over-tls=true,tls-name=${sni},skip-cert-verify=true`, + }, + expected: { + Loon: { + type: 'vless', + name, + server, + port, + uuid, + network: 'ws', + 'ws-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + tls: true, + 'skip-cert-verify': true, + sni, + }, + }, + }, + HTTP: { + input: { + Loon: `${name}=vless,${server},${port},"${uuid}",transport=http,host=${obfs_host},path=${obfs_path}`, + }, + expected: { + Loon: { + type: 'vless', + name, + server, + port, + uuid, + network: 'http', + 'http-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + }, + }, + }, + HTTP_TLS: { + input: { + Loon: `${name}=vless,${server},${port},"${uuid}",transport=http,host=${obfs_host},path=${obfs_path},over-tls=true,tls-name=${sni},skip-cert-verify=true`, + }, + expected: { + Loon: { + type: 'vless', + name, + server, + port, + uuid, + network: 'http', + 'http-opts': { + path: obfs_path, + headers: { + Host: obfs_host, + }, + }, + tls: true, + 'skip-cert-verify': true, + sni, + }, + }, + }, + }; + const HTTP = { + SIMPLE: { + input: { + Loon: `${name}=http,${server},${port}`, + QX: `http=${server}:${port},tag=${name}`, + Surge: `${name}=http,${server},${port}`, + }, + expected: { + type: 'http', + name, + server, + port, + }, + }, + AUTH: { + input: { + Loon: `${name}=http,${server},${port},${username},"${password}"`, + QX: `http=${server}:${port},tag=${name},username=${username},password=${password}`, + Surge: `${name}=http,${server},${port},${username},${password}`, + }, + expected: { + type: 'http', + name, + server, + port, + username, + password, + }, + }, + TLS: { + input: { + Loon: `${name}=https,${server},${port},${username},"${password}",tls-name=${sni},skip-cert-verify=true`, + QX: `http=${server}:${port},username=${username},password=${password},over-tls=true,tls-host=${sni},tls-verification=false,tag=${name}`, + Surge: `${name}=https,${server},${port},${username},${password},sni=${sni},skip-cert-verify=true`, + }, + expected: { + type: 'http', + name, + server, + port, + username, + password, + sni, + 'skip-cert-verify': true, + tls: true, + }, + }, + }; + const SOCKS5 = { + SIMPLE: { + input: { + QX: `socks5=${server}:${port},tag=${name}`, + Surge: `${name}=socks5,${server},${port}`, + }, + expected: { + type: 'socks5', + name, + server, + port, + }, + }, + AUTH: { + input: { + QX: `socks5=${server}:${port},tag=${name},username=${username},password=${password}`, + Surge: `${name}=socks5,${server},${port},${username},${password}`, + }, + expected: { + type: 'socks5', + name, + server, + port, + username, + password, + }, + }, + TLS: { + input: { + QX: `socks5=${server}:${port},username=${username},password=${password},over-tls=true,tls-host=${sni},tls-verification=false,tag=${name}`, + Surge: `${name}=socks5-tls,${server},${port},${username},${password},sni=${sni},skip-cert-verify=true`, + }, + expected: { + type: 'socks5', + name, + server, + port, + username, + password, + sni, + 'skip-cert-verify': true, + tls: true, + }, + }, + }; + const SNELL = { + SIMPLE: { + input: { + Surge: `${name}=snell,${server},${port},psk=${password},version=3`, + }, + expected: { + type: 'snell', + name, + server, + port, + psk: password, + version: 3, + }, + }, + OBFS_HTTP: { + input: { + Surge: `${name}=snell,${server},${port},psk=${password},version=3,obfs=http,obfs-host=${obfs_host},obfs-uri=${obfs_path}`, + }, + expected: { + type: 'snell', + name, + server, + port, + psk: password, + version: 3, + 'obfs-opts': { + mode: 'http', + host: obfs_host, + path: obfs_path, + }, + }, + }, + OBFS_TLS: { + input: { + Surge: `${name}=snell,${server},${port},psk=${password},version=3,obfs=tls,obfs-host=${obfs_host},obfs-uri=${obfs_path}`, + }, + expected: { + type: 'snell', + name, + server, + port, + psk: password, + version: 3, + 'obfs-opts': { + mode: 'tls', + host: obfs_host, + path: obfs_path, + }, + }, + }, + }; + return { + SS, + SSR, + VMESS, + VLESS, + TROJAN, + HTTP, + SOCKS5, + SNELL, + }; +} + +export default createTestCases(); diff --git a/backend/src/utils/database.js b/backend/src/utils/database.js new file mode 100644 index 000000000..58f04c395 --- /dev/null +++ b/backend/src/utils/database.js @@ -0,0 +1,17 @@ +export function findByName(list, name) { + return list.find((item) => item.name === name); +} + +export function findIndexByName(list, name) { + return list.findIndex((item) => item.name === name); +} + +export function deleteByName(list, name) { + const idx = findIndexByName(list, name); + list.splice(idx, 1); +} + +export function updateByName(list, name, newItem) { + const idx = findIndexByName(list, name); + list[idx] = newItem; +} diff --git a/backend/src/utils/download.js b/backend/src/utils/download.js new file mode 100644 index 000000000..5548385ab --- /dev/null +++ b/backend/src/utils/download.js @@ -0,0 +1,92 @@ +import { FILES_KEY, MODULES_KEY, SETTINGS_KEY } from '@/constants'; +import { findByName } from '@/utils/database'; +import { HTTP, ENV } from '@/vendor/open-api'; +import { hex_md5 } from '@/vendor/md5'; +import resourceCache from '@/utils/resource-cache'; +import $ from '@/core/app'; + +const tasks = new Map(); + +export default async function download(url, ua, timeout) { + let $arguments = {}; + const rawArgs = url.split('#'); + if (rawArgs.length > 1) { + try { + // 支持 `#${encodeURIComponent(JSON.stringify({arg1: "1"}))}` + $arguments = JSON.parse(decodeURIComponent(rawArgs[1])); + } catch (e) { + for (const pair of rawArgs[1].split('&')) { + const key = pair.split('=')[0]; + const value = pair.split('=')[1]; + // 部分兼容之前的逻辑 const value = pair.split('=')[1] || true; + $arguments[key] = + value == null || value === '' + ? true + : decodeURIComponent(value); + } + } + } + + const downloadUrlMatch = url.match(/^\/api\/(file|module)\/(.+)/); + if (downloadUrlMatch) { + let type = downloadUrlMatch?.[1]; + let name = downloadUrlMatch?.[2]; + if (name == null) { + throw new Error(`本地 ${type} URL 无效: ${url}`); + } + name = decodeURIComponent(name); + const key = type === 'module' ? MODULES_KEY : FILES_KEY; + const item = findByName($.read(key), name); + if (!item) { + throw new Error(`找不到本地 ${type}: ${name}`); + } + + return item.content; + } + + const { isNode } = ENV(); + const { defaultUserAgent, defaultTimeout } = $.read(SETTINGS_KEY); + const userAgent = ua || defaultUserAgent || 'clash.meta'; + const requestTimeout = timeout || defaultTimeout; + const id = hex_md5(userAgent + url); + if (!isNode && tasks.has(id)) { + return tasks.get(id); + } + + const http = HTTP({ + headers: { + 'User-Agent': userAgent, + }, + timeout: requestTimeout, + }); + + const result = new Promise((resolve, reject) => { + // try to find in app cache + const cached = resourceCache.get(id); + if (!$arguments?.noCache && cached) { + resolve(cached); + } else { + $.info( + `Downloading...\nUser-Agent: ${userAgent}\nTimeout: ${requestTimeout}\nURL: ${url}`, + ); + http.get(url) + .then((resp) => { + const body = resp.body; + if (body.replace(/\s/g, '').length === 0) + reject(new Error('远程资源内容为空!')); + else { + resourceCache.set(id, body); + resolve(body); + } + }) + .catch(() => { + reject(new Error(`无法下载 URL:${url}`)); + }); + } + }); + + if (!isNode) { + tasks.set(id, result); + } + return result; +} diff --git a/backend/src/utils/env.js b/backend/src/utils/env.js new file mode 100644 index 000000000..f99068a7b --- /dev/null +++ b/backend/src/utils/env.js @@ -0,0 +1,16 @@ +import { version as substoreVersion } from '../../package.json'; +import { ENV } from '@/vendor/open-api'; + +const { isNode, isQX, isLoon, isSurge, isStash, isShadowRocket } = ENV(); +let backend = 'Node'; +if (isNode) backend = 'Node'; +if (isQX) backend = 'QX'; +if (isLoon) backend = 'Loon'; +if (isSurge) backend = 'Surge'; +if (isStash) backend = 'Stash'; +if (isShadowRocket) backend = 'ShadowRocket'; + +export default { + backend, + version: substoreVersion, +}; diff --git a/backend/src/utils/flow.js b/backend/src/utils/flow.js new file mode 100644 index 000000000..cdf2bfc72 --- /dev/null +++ b/backend/src/utils/flow.js @@ -0,0 +1,52 @@ +import { SETTINGS_KEY } from '@/constants'; +import { HTTP } from '@/vendor/open-api'; +import $ from '@/core/app'; + +export async function getFlowHeaders(url, ua, timeout) { + const { defaultFlowUserAgent, defaultTimeout } = $.read(SETTINGS_KEY); + const userAgent = + ua || + defaultFlowUserAgent || + 'Quantumult%20X/1.0.30 (iPhone14,2; iOS 15.6)'; + const requestTimeout = timeout || defaultTimeout; + const http = HTTP(); + const { headers } = await http.get({ + url: url + .split(/[\r\n]+/) + .map((i) => i.trim()) + .filter((i) => i.length)[0], + headers: { + 'User-Agent': userAgent, + }, + timeout: requestTimeout, + }); + const subkey = Object.keys(headers).filter((k) => + /SUBSCRIPTION-USERINFO/i.test(k), + )[0]; + return headers[subkey]; +} +export function parseFlowHeaders(flowHeaders) { + if (!flowHeaders) return; + // unit is KB + const uploadMatch = flowHeaders.match(/upload=(-?)(\d+)/); + const upload = Number(uploadMatch[1] + uploadMatch[2]); + + const downloadMatch = flowHeaders.match(/download=(-?)(\d+)/); + const download = Number(downloadMatch[1] + downloadMatch[2]); + + const total = Number(flowHeaders.match(/total=(\d+)/)[1]); + + // optional expire timestamp + const match = flowHeaders.match(/expire=(\d+)/); + const expires = match ? Number(match[1]) : undefined; + + return { expires, total, usage: { upload, download } }; +} +export function flowTransfer(flow, unit = 'B') { + const unitList = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']; + let unitIndex = unitList.indexOf(unit); + + return flow < 1024 + ? { value: flow.toFixed(1), unit: unit } + : flowTransfer(flow / 1024, unitList[++unitIndex]); +} diff --git a/backend/src/utils/geo.js b/backend/src/utils/geo.js new file mode 100644 index 000000000..86efcbcec --- /dev/null +++ b/backend/src/utils/geo.js @@ -0,0 +1,416 @@ +// get proxy flag according to its name +export function getFlag(name) { + // flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js + // flags from @surgioproject: https://github.com/surgioproject/surgio/blob/master/lib/misc/flag_cn.ts + + // refer: https://zh.wikipedia.org/wiki/ISO_3166-1二位字母代码 + // refer: https://zh.wikipedia.org/wiki/ISO_3166-1三位字母代码 + const Flags = { + '🏳️🌈': ['流量', '时间', '过期', 'Bandwidth', 'Expire'], + '🇸🇱': ['应急', '测试节点'], + '🇦🇩': ['Andorra', '安道尔'], + '🇦🇪': ['United Arab Emirates', '阿联酋', '迪拜'], + '🇦🇫': ['Afghanistan', '阿富汗'], + '🇦🇱': ['Albania', '阿尔巴尼亚', '阿爾巴尼亞'], + '🇦🇲': ['Armenia', '亚美尼亚'], + '🇦🇷': ['Argentina', '阿根廷'], + '🇦🇹': ['Austria', '奥地利', '奧地利', '维也纳'], + '🇦🇺': [ + 'Australia', + '澳大利亚', + '澳洲', + '墨尔本', + '悉尼', + '土澳', + '京澳', + '廣澳', + '滬澳', + '沪澳', + '广澳', + 'Sydney', + ], + '🇦🇿': ['Azerbaijan', '阿塞拜疆'], + '🇧🇦': ['Bosnia and Herzegovina', '波黑共和国', '波黑'], + '🇧🇩': ['Bangladesh', '孟加拉国', '孟加拉'], + '🇧🇪': ['Belgium', '比利时', '比利時'], + '🇧🇬': ['Bulgaria', '保加利亚', '保加利亞'], + '🇧🇭': ['Bahrain', '巴林'], + '🇧🇷': ['Brazil', '巴西', '圣保罗'], + '🇧🇾': ['Belarus', '白俄罗斯', '白俄'], + '🇨🇦': [ + 'Canada', + '加拿大', + '蒙特利尔', + '温哥华', + '楓葉', + '枫叶', + '滑铁卢', + '多伦多', + 'Waterloo', + ], + '🇨🇭': ['Switzerland', '瑞士', '苏黎世', 'Zurich'], + '🇨🇱': ['Chile', '智利'], + '🇨🇴': ['Colombia', '哥伦比亚'], + '🇨🇷': ['Costa Rica', '哥斯达黎加'], + '🇨🇾': ['Cyprus', '塞浦路斯'], + '🇨🇿': ['Czechia', '捷克'], + '🇩🇪': [ + 'German', + '德国', + '德國', + '京德', + '滬德', + '廣德', + '沪德', + '广德', + '法兰克福', + 'Frankfurt', + ], + '🇩🇰': ['Denmark', '丹麦', '丹麥'], + '🇪🇨': ['Ecuador', '厄瓜多尔'], + '🇪🇪': ['Estonia', '爱沙尼亚'], + '🇪🇬': ['Egypt', '埃及'], + '🇪🇸': ['Spain', '西班牙'], + '🇪🇺': ['European Union', '欧盟', '欧罗巴'], + '🇫🇮': ['Finland', '芬兰', '芬蘭', '赫尔辛基'], + '🇫🇷': ['France', '法国', '法國', '巴黎'], + '🇬🇧': [ + 'Great Britain', + '英国', + 'England', + 'United Kingdom', + '伦敦', + '英', + 'London', + ], + '🇬🇪': ['Georgia', '格鲁吉亚', '格魯吉亞'], + '🇬🇷': ['Greece', '希腊', '希臘'], + '🇭🇰': [ + 'Hongkong', + '香港', + 'Hong Kong', + 'HongKong', + 'HONG KONG', + '深港', + '沪港', + '呼港', + '穗港', + '京港', + '港', + ], + '🇭🇷': ['Croatia', '克罗地亚', '克羅地亞'], + '🇭🇺': ['Hungary', '匈牙利'], + '🇯🇴': ['Jordan', '约旦'], + '🇯🇵': [ + 'Japan', + '日本', + '东京', + '大阪', + '埼玉', + '沪日', + '穗日', + '川日', + '中日', + '泉日', + '杭日', + '深日', + '辽日', + '广日', + '大坂', + 'Osaka', + 'Tokyo', + ], + '🇰🇪': ['Kenya', '肯尼亚'], + '🇰🇬': ['Kyrgyzstan', '吉尔吉斯斯坦'], + '🇰🇭': ['Cambodia', '柬埔寨'], + '🇰🇵': ['North Korea', '朝鲜'], + '🇰🇷': [ + 'Korea', + '韩国', + '韓國', + '韩', + '韓', + '首尔', + '春川', + 'Chuncheon', + 'Seoul', + ], + '🇰🇿': ['Kazakhstan', '哈萨克斯坦', '哈萨克'], + '🇮🇩': ['Indonesia', '印尼', '印度尼西亚', '雅加达'], + '🇮🇪': ['Ireland', '爱尔兰', '愛爾蘭', '都柏林'], + '🇮🇱': ['Israel', '以色列'], + '🇮🇲': ['Isle of Man', '马恩岛', '馬恩島'], + '🇮🇳': ['India', '印度', '孟买', 'MFumbai'], + '🇮🇷': ['Iran', '伊朗'], + '🇮🇸': ['Iceland', '冰岛', '冰島'], + '🇮🇹': ['Italy', '意大利', '義大利', '米兰', 'Nachash'], + '🇱🇹': ['Lithuania', '立陶宛'], + '🇱🇺': ['Luxembourg', '卢森堡'], + '🇱🇻': ['Latvia', '拉脱维亚', 'Latvija'], + '🇲🇦': ['Morocco', '摩洛哥'], + '🇲🇩': ['Moldova', '摩尔多瓦', '摩爾多瓦'], + '🇳🇬': ['Nigeria', '尼日利亚', '尼日利亞'], + '🇲🇰': ['Macedonia', '马其顿', '馬其頓'], + '🇲🇳': ['Mongolia', '蒙古'], + '🇲🇴': ['Macao', '澳门', '澳門', 'CTM'], + '🇲🇹': ['Malta', '马耳他'], + '🇲🇽': ['Mexico', '墨西哥'], + '🇲🇾': ['Malaysia', '马来', '馬來', '吉隆坡', '大馬'], + '🇳🇱': ['Netherlands', '荷兰', '荷蘭', '尼德蘭', '阿姆斯特丹'], + '🇳🇴': ['Norway', '挪威'], + '🇳🇵': ['Nepal', '尼泊尔'], + '🇳🇿': ['New Zealand', '新西兰', '新西蘭'], + '🇵🇦': ['Panama', '巴拿马'], + '🇵🇪': ['Peru', '秘鲁', '祕魯'], + '🇵🇭': ['Philippines', '菲律宾', '菲律賓'], + '🇵🇰': ['Pakistan', '巴基斯坦'], + '🇵🇱': ['Poland', '波兰', '波蘭'], + '🇵🇷': ['Puerto Rico', '波多黎各'], + '🇵🇹': ['Portugal', '葡萄牙'], + '🇵🇾': ['Paraguay', '巴拉圭'], + '🇷🇴': ['Romania', '罗马尼亚'], + '🇷🇸': ['Serbia', '塞尔维亚'], + '🇷🇪': ['Réunion', '留尼汪', '法属留尼汪'], + '🇷🇺': [ + 'Russia', + '俄罗斯', + '俄国', + '俄羅斯', + '伯力', + '莫斯科', + '圣彼得堡', + '西伯利亚', + '京俄', + '杭俄', + '廣俄', + '滬俄', + '广俄', + '沪俄', + 'Moscow', + ], + '🇸🇦': ['Saudi', '沙特阿拉伯', '沙特'], + '🇸🇪': ['Sweden', '瑞典'], + '🇸🇬': [ + 'Singapore', + '新加坡', + '狮城', + '沪新', + '京新', + '中新', + '泉新', + '穗新', + '深新', + '杭新', + '广新', + '廣新', + '滬新', + ], + '🇸🇮': ['Slovenia', '斯洛文尼亚'], + '🇸🇰': ['Slovakia', '斯洛伐克'], + '🇹🇭': ['Thailand', '泰国', '泰國', '曼谷'], + '🇹🇳': ['Tunisia', '突尼斯'], + '🇹🇷': ['Turkey', '土耳其', '伊斯坦布尔'], + '🇹🇼': [ + 'Taiwan', + '台湾', + '台北', + '台中', + '新北', + '彰化', + '台', + 'Taipei', + ], + '🇺🇦': ['Ukraine', '乌克兰', '烏克蘭'], + '🇺🇸': [ + 'United States', + '美国', + 'America', + '美', + '京美', + '波特兰', + '达拉斯', + '俄勒冈', + '凤凰城', + '费利蒙', + '硅谷', + '矽谷', + '拉斯维加斯', + '洛杉矶', + '圣何塞', + '圣克拉拉', + '西雅图', + '芝加哥', + '沪美', + '哥伦布', + '纽约', + 'Los Angeles', + 'San Jose', + 'Sillicon Valley', + 'Michigan', + ], + '🇺🇾': ['Uruguay', '乌拉圭'], + '🇻🇪': ['Venezuela', '委内瑞拉'], + '🇻🇳': ['Vietnam', '越南', '胡志明'], + '🇿🇦': ['South Africa', '南非'], + '🇨🇳': [ + 'China', + '中国', + '中國', + '回国', + '回國', + '国内', + '國內', + '华东', + '华西', + '华南', + '华北', + '华中', + '江苏', + '北京', + '上海', + '广州', + '深圳', + '杭州', + '徐州', + '青岛', + '宁波', + '镇江', + ], + }; + + const ISOFlags = { + '🏳️🌈': ['EXP', 'BAND'], + '🇸🇱': ['TEST', 'SOS'], + '🇦🇩': ['AD', 'AND'], + '🇦🇪': ['AE', 'ARE'], + '🇦🇫': ['AF', 'AFG'], + '🇦🇱': ['AL', 'ALB'], + '🇦🇲': ['AM', 'ARM'], + '🇦🇷': ['AR', 'ARG'], + '🇦🇹': ['AT', 'AUT'], + '🇦🇺': ['AU', 'AUS'], + '🇦🇿': ['AZ', 'AZE'], + '🇧🇦': ['BA', 'BIH'], + '🇧🇩': ['BD', 'BGD'], + '🇧🇪': ['BE', 'BEL'], + '🇧🇬': ['BG', 'BGR'], + '🇧🇭': ['BH', 'BHR'], + '🇧🇷': ['BR', 'BRA'], + '🇧🇾': ['BY', 'BLR'], + '🇨🇦': ['CA', 'CAN'], + '🇨🇭': ['CH', 'CHE'], + '🇨🇱': ['CL', 'CHL'], + '🇨🇴': ['CO', 'COL'], + '🇨🇷': ['CR', 'CRI'], + '🇨🇾': ['CY', 'CYP'], + '🇨🇿': ['CZ', 'CZE'], + '🇩🇪': ['DE', 'DEU'], + '🇩🇰': ['DK', 'DNK'], + '🇪🇨': ['EC', 'ECU'], + '🇪🇪': ['EE', 'EST'], + '🇪🇬': ['EG', 'EGY'], + '🇪🇸': ['ES', 'ESP'], + '🇪🇺': ['EU'], + '🇫🇮': ['FI', 'FIN'], + '🇫🇷': ['FR', 'FRA'], + '🇬🇧': ['GB', 'GBR', 'UK'], + '🇬🇪': ['GE', 'GEO'], + '🇬🇷': ['GR', 'GRC'], + '🇭🇰': ['HK', 'HKG', 'HKT', 'HKBN', 'HGC', 'WTT', 'CMI'], + '🇭🇷': ['HR', 'HRV'], + '🇭🇺': ['HU', 'HUN'], + '🇯🇴': ['JO', 'JOR'], + '🇯🇵': ['JP', 'JPN'], + '🇰🇪': ['KE', 'KEN'], + '🇰🇬': ['KG', 'KGZ'], + '🇰🇭': ['KH', 'KGZ'], + '🇰🇵': ['KP', 'PRK'], + '🇰🇷': ['KR', 'KOR'], + '🇰🇿': ['KZ', 'KAZ'], + '🇮🇩': ['ID', 'IDN'], + '🇮🇪': ['IE', 'IRL'], + '🇮🇱': ['IL', 'ISR'], + '🇮🇲': ['IM', 'IMN'], + '🇮🇳': ['IN', 'IND'], + '🇮🇷': ['IR', 'IRN'], + '🇮🇸': ['IS', 'ISL'], + '🇮🇹': ['IT', 'ITA'], + '🇱🇹': ['LT', 'LTU'], + '🇱🇺': ['LU', 'LUX'], + '🇱🇻': ['LV', 'LVA'], + '🇲🇦': ['MA', 'MAR'], + '🇲🇩': ['MD', 'MDA'], + '🇳🇬': ['NG', 'NGA'], + '🇲🇰': ['MK', 'MKD'], + '🇲🇳': ['MN', 'MNG'], + '🇲🇴': ['MO', 'MAC', 'CTM'], + '🇲🇹': ['MT', 'MLT'], + '🇲🇽': ['MX', 'MEX'], + '🇲🇾': ['MY', 'MYS'], + '🇳🇱': ['NL', 'NLD'], + '🇳🇴': ['NO', 'NOR'], + '🇳🇵': ['NP', 'NPL'], + '🇳🇿': ['NZ', 'NZL'], + '🇵🇦': ['PA', 'PAN'], + '🇵🇪': ['PE', 'PER'], + '🇵🇭': ['PH', 'PHL'], + '🇵🇰': ['PK', 'PAK'], + '🇵🇱': ['PL', 'POL'], + '🇵🇷': ['PR', 'PRI'], + '🇵🇹': ['PT', 'PRT'], + '🇵🇾': ['PY', 'PRY'], + '🇷🇴': ['RO', 'ROU'], + '🇷🇸': ['RS', 'SRB'], + '🇷🇪': ['RE', 'REU'], + '🇷🇺': ['RU', 'RUS'], + '🇸🇦': ['SA', 'SAU'], + '🇸🇪': ['SE', 'SWE'], + '🇸🇬': ['SG', 'SGP'], + '🇸🇮': ['SI', 'SVN'], + '🇸🇰': ['SK', 'SVK'], + '🇹🇭': ['TH', 'THA'], + '🇹🇳': ['TN', 'TUN'], + '🇹🇷': ['TR', 'TUR'], + '🇹🇼': ['TW', 'TWN', 'CHT', 'HINET'], + '🇺🇦': ['UA', 'UKR'], + '🇺🇸': ['US', 'USA', 'LAX', 'SFO'], + '🇺🇾': ['UY', 'URY'], + '🇻🇪': ['VE', 'VEN'], + '🇻🇳': ['VN', 'VNM'], + '🇿🇦': ['ZA', 'ZAF'], + '🇨🇳': ['CN', 'CHN', 'BACK'], + }; + // 原旗帜或空 + let Flag = + name.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/)?.[0] || + '🏴☠️'; + //console.log(`oldFlag = ${Flag}`) + // 旗帜匹配 + for (let flag of Object.keys(Flags)) { + const keywords = Flags[flag]; + //console.log(`keywords = ${keywords}`) + if ( + // 不精确匹配(只要包含就算,忽略大小写) + keywords.some((keyword) => RegExp(`${keyword}`, 'i').test(name)) + ) { + //console.log(`newFlag = ${flag}`) + return (Flag = flag); + } + } + // ISO旗帜匹配 + for (let flag of Object.keys(ISOFlags)) { + const keywords = ISOFlags[flag]; + //console.log(`keywords = ${keywords}`) + if ( + // 精确匹配(两侧均有分割) + keywords.some((keyword) => + RegExp(`(^|[^a-zA-Z])${keyword}([^a-zA-Z]|$)`).test(name), + ) + ) { + //console.log(`ISOFlag = ${flag}`) + return (Flag = flag); + } + } + //console.log(`Final Flag = ${Flag}`) + return Flag; +} diff --git a/backend/src/utils/gist.js b/backend/src/utils/gist.js new file mode 100644 index 000000000..8504e78c1 --- /dev/null +++ b/backend/src/utils/gist.js @@ -0,0 +1,84 @@ +import { HTTP } from '@/vendor/open-api'; + +/** + * Gist backup + */ +export default class Gist { + constructor({ token, key }) { + this.http = HTTP({ + baseURL: 'https://api.github.com', + headers: { + Authorization: `token ${token}`, + 'User-Agent': + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36', + }, + events: { + onResponse: (resp) => { + if (/^[45]/.test(String(resp.statusCode))) { + return Promise.reject( + `ERROR: ${JSON.parse(resp.body).message}`, + ); + } else { + return resp; + } + }, + }, + }); + this.key = key; + } + + async locate() { + return this.http.get('/gists').then((response) => { + const gists = JSON.parse(response.body); + for (let g of gists) { + if (g.description === this.key) { + return g.id; + } + } + return -1; + }); + } + + async upload(files) { + if (Object.keys(files).length === 0) { + return Promise.reject('未提供需上传的文件'); + } + + const id = await this.locate(); + + if (id === -1) { + // create a new gist for backup + return this.http.post({ + url: '/gists', + body: JSON.stringify({ + description: this.key, + public: false, + files, + }), + }); + } else { + // update an existing gist + return this.http.patch({ + url: `/gists/${id}`, + body: JSON.stringify({ files }), + }); + } + } + + async download(filename) { + const id = await this.locate(); + if (id === -1) { + return Promise.reject('未找到Gist备份!'); + } else { + try { + const { files } = await this.http + .get(`/gists/${id}`) + .then((resp) => JSON.parse(resp.body)); + const url = files[filename].raw_url; + return await this.http.get(url).then((resp) => resp.body); + } catch (err) { + return Promise.reject(err); + } + } + } +} diff --git a/backend/src/utils/index.js b/backend/src/utils/index.js new file mode 100644 index 000000000..0502b9225 --- /dev/null +++ b/backend/src/utils/index.js @@ -0,0 +1,46 @@ +// source: https://stackoverflow.com/a/36760050 +const IPV4_REGEX = /^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)){4}$/; + +// source: https://ihateregex.io/expr/ipv6/ +const IPV6_REGEX = + /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; + +function isIPv4(ip) { + return IPV4_REGEX.test(ip); +} + +function isIPv6(ip) { + return IPV6_REGEX.test(ip); +} + +function isValidPortNumber(port) { + return /^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$/.test( + port, + ); +} + +function isNotBlank(str) { + return typeof str === 'string' && str.trim().length > 0; +} + +function getIfNotBlank(str, defaultValue) { + return isNotBlank(str) ? str : defaultValue; +} + +function isPresent(obj) { + return typeof obj !== 'undefined' && obj !== null; +} + +function getIfPresent(obj, defaultValue) { + return isPresent(obj) ? obj : defaultValue; +} + +export { + isIPv4, + isIPv6, + isValidPortNumber, + isNotBlank, + getIfNotBlank, + isPresent, + getIfPresent, +}; diff --git a/backend/src/utils/logical.js b/backend/src/utils/logical.js new file mode 100644 index 000000000..c58cc5771 --- /dev/null +++ b/backend/src/utils/logical.js @@ -0,0 +1,17 @@ +function AND(...args) { + return args.reduce((a, b) => a.map((c, i) => b[i] && c)); +} + +function OR(...args) { + return args.reduce((a, b) => a.map((c, i) => b[i] || c)); +} + +function NOT(array) { + return array.map((c) => !c); +} + +function FULL(length, bool) { + return [...Array(length).keys()].map(() => bool); +} + +export { AND, OR, NOT, FULL }; diff --git a/backend/src/utils/migration.js b/backend/src/utils/migration.js new file mode 100644 index 000000000..80a8a956f --- /dev/null +++ b/backend/src/utils/migration.js @@ -0,0 +1,128 @@ +import { + SUBS_KEY, + COLLECTIONS_KEY, + SCHEMA_VERSION_KEY, + ARTIFACTS_KEY, + RULES_KEY, +} from '@/constants'; +import $ from '@/core/app'; + +export default function migrate() { + migrateV2(); +} + +function migrateV2() { + const version = $.read(SCHEMA_VERSION_KEY); + if (!version) doMigrationV2(); + + // write the current version + if (version !== '2.0') { + $.write('2.0', SCHEMA_VERSION_KEY); + } +} + +function doMigrationV2() { + $.info('Start migrating...'); + // 1. migrate subscriptions + const subs = $.read(SUBS_KEY) || {}; + const newSubs = Object.values(subs).map((sub) => { + // set default source to remote + sub.source = sub.source || 'remote'; + + migrateDisplayName(sub); + migrateProcesses(sub); + return sub; + }); + $.write(newSubs, SUBS_KEY); + + // 2. migrate collections + const collections = $.read(COLLECTIONS_KEY) || {}; + const newCollections = Object.values(collections).map((collection) => { + delete collection.ua; + migrateDisplayName(collection); + migrateProcesses(collection); + return collection; + }); + $.write(newCollections, COLLECTIONS_KEY); + + // 3. migrate artifacts + const artifacts = $.read(ARTIFACTS_KEY) || {}; + const newArtifacts = Object.values(artifacts); + $.write(newArtifacts, ARTIFACTS_KEY); + + // 4. migrate rules + const rules = $.read(RULES_KEY) || {}; + const newRules = Object.values(rules); + $.write(newRules, RULES_KEY); + + // 5. delete builtin rules + delete $.cache.builtin; + $.info('Migration complete!'); + + function migrateDisplayName(item) { + const displayName = item['display-name']; + if (displayName) { + item.displayName = displayName; + delete item['display-name']; + } + } + + function migrateProcesses(item) { + const processes = item.process; + if (!processes || processes.length === 0) return; + const newProcesses = []; + const quickSettingOperator = { + type: 'Quick Setting Operator', + args: { + udp: 'DEFAULT', + tfo: 'DEFAULT', + scert: 'DEFAULT', + 'vmess aead': 'DEFAULT', + useless: 'DEFAULT', + }, + }; + for (const p of processes) { + if (!p.type) continue; + if (p.type === 'Useless Filter') { + quickSettingOperator.args.useless = 'ENABLED'; + } else if (p.type === 'Set Property Operator') { + const { key, value } = p.args; + switch (key) { + case 'udp': + quickSettingOperator.args.udp = value + ? 'ENABLED' + : 'DISABLED'; + break; + case 'tfo': + quickSettingOperator.args.tfo = value + ? 'ENABLED' + : 'DISABLED'; + break; + case 'skip-cert-verify': + quickSettingOperator.args.scert = value + ? 'ENABLED' + : 'DISABLED'; + break; + case 'aead': + quickSettingOperator.args['vmess aead'] = value + ? 'ENABLED' + : 'DISABLED'; + break; + } + } else if (p.type.indexOf('Keyword') !== -1) { + // drop keyword operators and keyword filters + } else if (p.type === 'Flag Operator') { + // set default args + const add = typeof p.args === 'undefined' ? true : p.args; + p.args = { + mode: add ? 'add' : 'remove', + }; + newProcesses.push(p); + } else { + newProcesses.push(p); + } + } + newProcesses.unshift(quickSettingOperator); + item.process = newProcesses; + } +} diff --git a/backend/src/utils/platform.js b/backend/src/utils/platform.js new file mode 100644 index 000000000..7f8fefd3d --- /dev/null +++ b/backend/src/utils/platform.js @@ -0,0 +1,40 @@ +export function getPlatformFromHeaders(headers) { + const keys = Object.keys(headers); + let UA = ''; + let ua = ''; + for (let k of keys) { + if (/USER-AGENT/i.test(k)) { + UA = headers[k]; + ua = UA.toLowerCase(); + break; + } + } + if (UA.indexOf('Quantumult%20X') !== -1) { + return 'QX'; + } else if (UA.indexOf('Surfboard') !== -1) { + return 'Surfboard'; + } else if (UA.indexOf('Surge Mac') !== -1) { + return 'SurgeMac'; + } else if (UA.indexOf('Surge') !== -1) { + return 'Surge'; + } else if (UA.indexOf('Decar') !== -1 || UA.indexOf('Loon') !== -1) { + return 'Loon'; + } else if (UA.indexOf('Shadowrocket') !== -1) { + return 'Shadowrocket'; + } else if (UA.indexOf('Stash') !== -1) { + return 'Stash'; + } else if ( + ua === 'meta' || + (ua.indexOf('clash') !== -1 && ua.indexOf('meta') !== -1) + ) { + return 'ClashMeta'; + } else if (ua.indexOf('clash') !== -1) { + return 'Clash'; + } else if (ua.indexOf('v2ray') !== -1) { + return 'V2Ray'; + } else if (ua.indexOf('sing-box') !== -1) { + return 'sing-box'; + } else { + return 'JSON'; + } +} diff --git a/backend/src/utils/resource-cache.js b/backend/src/utils/resource-cache.js new file mode 100644 index 000000000..6bb30928e --- /dev/null +++ b/backend/src/utils/resource-cache.js @@ -0,0 +1,56 @@ +import $ from '@/core/app'; +import { CACHE_EXPIRATION_TIME_MS, RESOURCE_CACHE_KEY } from '@/constants'; + +class ResourceCache { + constructor(expires) { + this.expires = expires; + if (!$.read(RESOURCE_CACHE_KEY)) { + $.write('{}', RESOURCE_CACHE_KEY); + } + this.resourceCache = JSON.parse($.read(RESOURCE_CACHE_KEY)); + this._cleanup(); + } + + _cleanup() { + // clear obsolete cached resource + let clear = false; + Object.entries(this.resourceCache).forEach((entry) => { + const [id, updated] = entry; + if (!updated.time) { + // clear old version cache + delete this.resourceCache[id]; + $.delete(`#${id}`); + clear = true; + } + if (new Date().getTime() - updated.time > this.expires) { + delete this.resourceCache[id]; + clear = true; + } + }); + if (clear) this._persist(); + } + + revokeAll() { + this.resourceCache = {}; + this._persist(); + } + + _persist() { + $.write(JSON.stringify(this.resourceCache), RESOURCE_CACHE_KEY); + } + + get(id) { + const updated = this.resourceCache[id] && this.resourceCache[id].time; + if (updated && new Date().getTime() - updated <= this.expires) { + return this.resourceCache[id].data; + } + return null; + } + + set(id, value) { + this.resourceCache[id] = { time: new Date().getTime(), data: value }; + this._persist(); + } +} + +export default new ResourceCache(CACHE_EXPIRATION_TIME_MS); diff --git a/backend/src/utils/script-resource-cache.js b/backend/src/utils/script-resource-cache.js new file mode 100644 index 000000000..d4d1adaa4 --- /dev/null +++ b/backend/src/utils/script-resource-cache.js @@ -0,0 +1,105 @@ +import $ from '@/core/app'; +import { + SCRIPT_RESOURCE_CACHE_KEY, + CSR_EXPIRATION_TIME_KEY, +} from '@/constants'; + +class ResourceCache { + constructor() { + this.expires = getExpiredTime(); + if (!$.read(SCRIPT_RESOURCE_CACHE_KEY)) { + $.write('{}', SCRIPT_RESOURCE_CACHE_KEY); + } + this.resourceCache = JSON.parse($.read(SCRIPT_RESOURCE_CACHE_KEY)); + this._cleanup(); + } + + _cleanup() { + // clear obsolete cached resource + let clear = false; + Object.entries(this.resourceCache).forEach((entry) => { + const [id, updated] = entry; + if (!updated.time) { + // clear old version cache + delete this.resourceCache[id]; + $.delete(`#${id}`); + clear = true; + } + if (new Date().getTime() - updated.time > this.expires) { + delete this.resourceCache[id]; + clear = true; + } + }); + if (clear) this._persist(); + } + + revokeAll() { + this.resourceCache = {}; + this._persist(); + } + + _persist() { + $.write(JSON.stringify(this.resourceCache), SCRIPT_RESOURCE_CACHE_KEY); + } + + get(id) { + const updated = this.resourceCache[id] && this.resourceCache[id].time; + if (updated && new Date().getTime() - updated <= this.expires) { + return this.resourceCache[id].data; + } + return null; + } + + gettime(id) { + const updated = this.resourceCache[id] && this.resourceCache[id].time; + if (updated && new Date().getTime() - updated <= this.expires) { + return this.resourceCache[id].time; + } + return null; + } + + set(id, value) { + this.resourceCache[id] = { time: new Date().getTime(), data: value }; + this._persist(); + } +} + +function getExpiredTime() { + // console.log($.read(CSR_EXPIRATION_TIME_KEY)); + if (!$.read(CSR_EXPIRATION_TIME_KEY)) { + $.write('1728e5', CSR_EXPIRATION_TIME_KEY); // 48 * 3600 * 1000 + } + let expiration = 1728e5; + if ($.env.isLoon) { + const loont = { + // Loon 插件自义定 + '1\u5206\u949f': 6e4, + '5\u5206\u949f': 3e5, + '10\u5206\u949f': 6e5, + '30\u5206\u949f': 18e5, // "30分钟" + '1\u5c0f\u65f6': 36e5, + '2\u5c0f\u65f6': 72e5, + '3\u5c0f\u65f6': 108e5, + '6\u5c0f\u65f6': 216e5, + '12\u5c0f\u65f6': 432e5, + '24\u5c0f\u65f6': 864e5, + '48\u5c0f\u65f6': 1728e5, + '72\u5c0f\u65f6': 2592e5, // "72小时" + '\u53c2\u6570\u4f20\u5165': 'readcachets', // "参数输入" + }; + let intimed = $.read('#\u8282\u70b9\u7f13\u5b58\u6709\u6548\u671f'); // Loon #节点缓存有效期 + // console.log(intimed); + if (intimed in loont) { + expiration = loont[intimed]; + if (expiration === 'readcachets') { + expiration = intimed; + } + } + return expiration; + } else { + expiration = $.read(CSR_EXPIRATION_TIME_KEY); + return expiration; + } +} + +export default new ResourceCache(); diff --git a/backend/src/utils/tpl.js b/backend/src/utils/tpl.js new file mode 100644 index 000000000..3d552543e --- /dev/null +++ b/backend/src/utils/tpl.js @@ -0,0 +1,210 @@ +import nunjucks from 'nunjucks'; +import { ProxyUtils } from '@/core/proxy-utils'; +import { produceArtifact } from '@/restful/sync'; +import lodash from 'lodash'; +import $ from '@/core/app'; +import scriptResourceCache from '@/utils/script-resource-cache'; +import { getFlowHeaders, parseFlowHeaders, flowTransfer } from '@/utils/flow'; +const flowUtils = { getFlowHeaders, parseFlowHeaders, flowTransfer }; +const n = nunjucks.configure({ autoescape: false }); + +n.addFilter( + 'produceArtifact', + (...args) => { + const callback = args.pop(); + const name = args[0]; + const type = args[1]; + const platform = args[2]; + const produceType = args[3]; + const nameRegex = args[4]; + const nameRegexFlags = args[5]; + produceArtifact({ + type, + name, + platform, + produceType, + }) + .then((artifact) => { + callback( + null, + artifact.filter(({ tag }) => + nameRegex + ? new RegExp(nameRegex, nameRegexFlags).test(tag) + : true, + ), + ); + }) + .catch((e) => { + $.error(`produceArtifact filter error: ${e.message ?? e}`); + callback(e); + }); + }, + true, +); +n.addFilter( + 'subNode', + (...args) => { + const callback = args.pop(); + const name = args[0]; + const nameRegex = args[1]; + const nameRegexFlags = args[2]; + produceArtifact({ + type: 'subscription', + name, + platform: 'sing-box', + produceType: 'internal', + }) + .then((artifact) => { + callback( + null, + JSON.stringify( + artifact.filter(({ tag }) => + nameRegex + ? new RegExp(nameRegex, nameRegexFlags).test( + tag, + ) + : true, + ), + ).replace(/(^\[|\]$)/g, ''), + ); + }) + .catch((e) => { + $.error(`subNode filter error: ${e.message ?? e}`); + callback(e); + }); + }, + true, +); +n.addFilter( + 'colNode', + (...args) => { + const callback = args.pop(); + const name = args[0]; + const nameRegex = args[1]; + const nameRegexFlags = args[2]; + produceArtifact({ + type: 'collection', + name, + platform: 'sing-box', + produceType: 'internal', + }) + .then((artifact) => { + callback( + null, + JSON.stringify( + artifact.filter(({ tag }) => + nameRegex + ? new RegExp(nameRegex, nameRegexFlags).test( + tag, + ) + : true, + ), + ).replace(/(^\[|\]$)/g, ''), + ); + }) + .catch((e) => { + $.error(`colNode filter error: ${e.message ?? e}`); + callback(e); + }); + }, + true, +); +n.addFilter( + 'sub', + (...args) => { + const callback = args.pop(); + const name = args[0]; + const nameRegex = args[1]; + const nameRegexFlags = args[2]; + produceArtifact({ + type: 'subscription', + name, + platform: 'sing-box', + produceType: 'internal', + }) + .then((artifact) => { + callback( + null, + JSON.stringify( + artifact + .filter(({ tag }) => + nameRegex + ? new RegExp( + nameRegex, + nameRegexFlags, + ).test(tag) + : true, + ) + .map((p) => p.tag), + ).replace(/(^\[|\]$)/g, ''), + ); + }) + .catch((e) => { + $.error(`sub filter error: ${e.message ?? e}`); + callback(e); + }); + }, + true, +); +n.addFilter( + 'col', + (...args) => { + const callback = args.pop(); + const name = args[0]; + const nameRegex = args[1]; + const nameRegexFlags = args[2]; + produceArtifact({ + type: 'collection', + name, + platform: 'sing-box', + produceType: 'internal', + }) + .then((artifact) => { + callback( + null, + JSON.stringify( + artifact + .filter(({ tag }) => + nameRegex + ? new RegExp( + nameRegex, + nameRegexFlags, + ).test(tag) + : true, + ) + .map((p) => p.tag), + ).replace(/(^\[|\]$)/g, ''), + ); + }) + .catch((e) => { + $.error(`col filter error: ${e.message ?? e}`); + callback(e); + }); + }, + true, +); + +export const render = async (tpl = '', data = {}) => { + return new Promise((resolve) => { + n.renderString( + tpl, + { + $substore: $, + lodash: lodash, + ProxyUtils: ProxyUtils, + scriptResourceCache: scriptResourceCache, + flowUtils: flowUtils, + // produceArtifact: produceArtifact, + ...data, + }, + (e, result) => { + if (e) { + $.error(`rendering error: ${e.message ?? e}`); + resolve(''); + } else { + resolve(result); + } + }, + ); + }); +}; diff --git a/backend/src/vendor/express.js b/backend/src/vendor/express.js new file mode 100644 index 000000000..58d056e9e --- /dev/null +++ b/backend/src/vendor/express.js @@ -0,0 +1,295 @@ +/* eslint-disable no-undef */ +import { ENV } from './open-api'; + +export default function express({ substore: $, port, host }) { + const { isNode } = ENV(); + const DEFAULT_HEADERS = { + 'Content-Type': 'text/plain;charset=UTF-8', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST,GET,OPTIONS,PATCH,PUT,DELETE', + 'Access-Control-Allow-Headers': + 'Origin, X-Requested-With, Content-Type, Accept', + }; + + // node support + if (isNode) { + const express_ = eval(`require("express")`); + const bodyParser = eval(`require("body-parser")`); + const app = express_(); + app.use(bodyParser.json({ verify: rawBodySaver, limit: '1mb' })); + app.use( + bodyParser.urlencoded({ verify: rawBodySaver, extended: true }), + ); + app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' })); + app.use((_, res, next) => { + res.set(DEFAULT_HEADERS); + next(); + }); + + // adapter + app.start = () => { + const listener = app.listen(port, host, () => { + const { address, port } = listener.address(); + $.info(`[BACKEND] ${address}:${port}`); + }); + }; + return app; + } + + // route handlers + const handlers = []; + + // http methods + const METHODS_NAMES = [ + 'GET', + 'POST', + 'PUT', + 'DELETE', + 'PATCH', + 'OPTIONS', + "HEAD'", + 'ALL', + ]; + + // dispatch url to route + const dispatch = (request, start = 0) => { + let { method, url, headers, body } = request; + headers = formatHeaders(headers); + if (/json/i.test(headers['content-type'])) { + body = JSON.parse(body); + } + + method = method.toUpperCase(); + const { path, query } = extractURL(url); + + // pattern match + let handler = null; + let i; + let longestMatchedPattern = 0; + for (i = start; i < handlers.length; i++) { + if (handlers[i].method === 'ALL' || method === handlers[i].method) { + const { pattern } = handlers[i]; + if (patternMatched(pattern, path)) { + if (pattern.split('/').length > longestMatchedPattern) { + handler = handlers[i]; + longestMatchedPattern = pattern.split('/').length; + } + } + } + } + if (handler) { + // dispatch to next handler + const next = () => { + dispatch(method, url, i); + }; + const req = { + method, + url, + path, + query, + params: extractPathParams(handler.pattern, path), + headers, + body, + }; + const res = Response(); + const cb = handler.callback; + + const errFunc = (err) => { + res.status(500).json({ + status: 'failed', + message: `Internal Server Error: ${err}`, + }); + }; + + if (cb.constructor.name === 'AsyncFunction') { + cb(req, res, next).catch(errFunc); + } else { + try { + cb(req, res, next); + } catch (err) { + errFunc(err); + } + } + } else { + // no route, return 404 + const res = Response(); + res.status(404).json({ + status: 'failed', + message: 'ERROR: 404 not found', + }); + } + }; + + const app = {}; + + // attach http methods + METHODS_NAMES.forEach((method) => { + app[method.toLowerCase()] = (pattern, callback) => { + // add handler + handlers.push({ method, pattern, callback }); + }; + }); + + // chainable route + app.route = (pattern) => { + const chainApp = {}; + METHODS_NAMES.forEach((method) => { + chainApp[method.toLowerCase()] = (callback) => { + // add handler + handlers.push({ method, pattern, callback }); + return chainApp; + }; + }); + return chainApp; + }; + + // start service + app.start = () => { + dispatch($request); + }; + + return app; + + /************************************************ + Utility Functions + *************************************************/ + function rawBodySaver(req, res, buf, encoding) { + if (buf && buf.length) { + req.rawBody = buf.toString(encoding || 'utf8'); + } + } + + function Response() { + let statusCode = 200; + const { isQX, isLoon, isSurge } = ENV(); + const headers = DEFAULT_HEADERS; + const STATUS_CODE_MAP = { + 200: 'HTTP/1.1 200 OK', + 201: 'HTTP/1.1 201 Created', + 302: 'HTTP/1.1 302 Found', + 307: 'HTTP/1.1 307 Temporary Redirect', + 308: 'HTTP/1.1 308 Permanent Redirect', + 404: 'HTTP/1.1 404 Not Found', + 500: 'HTTP/1.1 500 Internal Server Error', + }; + return new (class { + status(code) { + statusCode = code; + return this; + } + + send(body = '') { + const response = { + status: isQX ? STATUS_CODE_MAP[statusCode] : statusCode, + body, + headers, + }; + if (isQX) { + $done(response); + } else if (isLoon || isSurge) { + $done({ + response, + }); + } + } + + end() { + this.send(); + } + + html(data) { + this.set('Content-Type', 'text/html;charset=UTF-8'); + this.send(data); + } + + json(data) { + this.set('Content-Type', 'application/json;charset=UTF-8'); + this.send(JSON.stringify(data)); + } + + set(key, val) { + headers[key] = val; + return this; + } + })(); + } +} + +function formatHeaders(headers) { + const result = {}; + for (const k of Object.keys(headers)) { + result[k.toLowerCase()] = headers[k]; + } + return result; +} + +function patternMatched(pattern, path) { + if (pattern instanceof RegExp && pattern.test(path)) { + return true; + } else { + // root pattern, match all + if (pattern === '/') return true; + // normal string pattern + if (pattern.indexOf(':') === -1) { + const spath = path.split('/'); + const spattern = pattern.split('/'); + for (let i = 0; i < spattern.length; i++) { + if (spath[i] !== spattern[i]) { + return false; + } + } + return true; + } else if (extractPathParams(pattern, path)) { + // string pattern with path parameters + return true; + } + } + return false; +} + +function extractURL(url) { + // extract path + const match = url.match(/https?:\/\/[^/]+(\/[^?]*)/) || []; + const path = match[1] || '/'; + + // extract query string + const split = url.indexOf('?'); + const query = {}; + if (split !== -1) { + let hashes = url.slice(url.indexOf('?') + 1).split('&'); + for (let i = 0; i < hashes.length; i++) { + const hash = hashes[i].split('='); + query[hash[0]] = hash[1]; + } + } + return { + path, + query, + }; +} + +function extractPathParams(pattern, path) { + if (pattern.indexOf(':') === -1) { + return null; + } else { + const params = {}; + for (let i = 0, j = 0; i < pattern.length; i++, j++) { + if (pattern[i] === ':') { + let key = []; + let val = []; + while (pattern[++i] !== '/' && i < pattern.length) { + key.push(pattern[i]); + } + while (path[j] !== '/' && j < path.length) { + val.push(path[j++]); + } + params[key.join('')] = val.join(''); + } else { + if (pattern[i] !== path[j]) { + return null; + } + } + } + return params; + } +} diff --git a/backend/src/vendor/md5.js b/backend/src/vendor/md5.js new file mode 100644 index 000000000..9bbcd0817 --- /dev/null +++ b/backend/src/vendor/md5.js @@ -0,0 +1,387 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ''; /* base-64 pad character. "=" for strict RFC compliance */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +export function hex_md5(s) { + return rstr2hex(rstr_md5(str2rstr_utf8(s))); +} + +export function b64_md5(s) { + return rstr2b64(rstr_md5(str2rstr_utf8(s))); +} + +export function any_md5(s, e) { + return rstr2any(rstr_md5(str2rstr_utf8(s)), e); +} + +export function hex_hmac_md5(k, d) { + return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); +} + +export function b64_hmac_md5(k, d) { + return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); +} + +export function any_hmac_md5(k, d, e) { + return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); +} + +/* + * Perform a simple self-test to see if the VM is working + */ +function md5_vm_test() { + return hex_md5('abc').toLowerCase() == '900150983cd24fb0d6963f7d28e17f72'; +} + +/* + * Calculate the MD5 of a raw string + */ +function rstr_md5(s) { + return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); +} + +/* + * Calculate the HMAC-MD5, of a key and some data (raw strings) + */ +function rstr_hmac_md5(key, data) { + var bkey = rstr2binl(key); + if (bkey.length > 16) bkey = binl_md5(bkey, key.length * 8); + + var ipad = Array(16), + opad = Array(16); + for (var i = 0; i < 16; i++) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5c5c5c5c; + } + + var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); + return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); +} + +/* + * Convert a raw string to a hex string + */ +function rstr2hex(input) { + try { + hexcase; + } catch (e) { + hexcase = 0; + } + var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'; + var output = ''; + var x; + for (var i = 0; i < input.length; i++) { + x = input.charCodeAt(i); + output += hex_tab.charAt((x >>> 4) & 0x0f) + hex_tab.charAt(x & 0x0f); + } + return output; +} + +/* + * Convert a raw string to a base-64 string + */ +function rstr2b64(input) { + try { + b64pad; + } catch (e) { + b64pad = ''; + } + var tab = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var output = ''; + var len = input.length; + for (var i = 0; i < len; i += 3) { + var triplet = + (input.charCodeAt(i) << 16) | + (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | + (i + 2 < len ? input.charCodeAt(i + 2) : 0); + for (var j = 0; j < 4; j++) { + if (i * 8 + j * 6 > input.length * 8) output += b64pad; + else output += tab.charAt((triplet >>> (6 * (3 - j))) & 0x3f); + } + } + return output; +} + +/* + * Convert a raw string to an arbitrary string encoding + */ +function rstr2any(input, encoding) { + var divisor = encoding.length; + var i, j, q, x, quotient; + + /* Convert to an array of 16-bit big-endian values, forming the dividend */ + var dividend = Array(Math.ceil(input.length / 2)); + for (i = 0; i < dividend.length; i++) { + dividend[i] = + (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); + } + + /* + * Repeatedly perform a long division. The binary array forms the dividend, + * the length of the encoding is the divisor. Once computed, the quotient + * forms the dividend for the next step. All remainders are stored for later + * use. + */ + var full_length = Math.ceil( + (input.length * 8) / (Math.log(encoding.length) / Math.log(2)), + ); + var remainders = Array(full_length); + for (j = 0; j < full_length; j++) { + quotient = Array(); + x = 0; + for (i = 0; i < dividend.length; i++) { + x = (x << 16) + dividend[i]; + q = Math.floor(x / divisor); + x -= q * divisor; + if (quotient.length > 0 || q > 0) quotient[quotient.length] = q; + } + remainders[j] = x; + dividend = quotient; + } + + /* Convert the remainders to the output string */ + var output = ''; + for (i = remainders.length - 1; i >= 0; i--) + output += encoding.charAt(remainders[i]); + + return output; +} + +/* + * Encode a string as utf-8. + * For efficiency, this assumes the input is valid utf-16. + */ +function str2rstr_utf8(input) { + var output = ''; + var i = -1; + var x, y; + + while (++i < input.length) { + /* Decode utf-16 surrogate pairs */ + x = input.charCodeAt(i); + y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; + if (0xd800 <= x && x <= 0xdbff && 0xdc00 <= y && y <= 0xdfff) { + x = 0x10000 + ((x & 0x03ff) << 10) + (y & 0x03ff); + i++; + } + + /* Encode output as utf-8 */ + if (x <= 0x7f) output += String.fromCharCode(x); + else if (x <= 0x7ff) + output += String.fromCharCode( + 0xc0 | ((x >>> 6) & 0x1f), + 0x80 | (x & 0x3f), + ); + else if (x <= 0xffff) + output += String.fromCharCode( + 0xe0 | ((x >>> 12) & 0x0f), + 0x80 | ((x >>> 6) & 0x3f), + 0x80 | (x & 0x3f), + ); + else if (x <= 0x1fffff) + output += String.fromCharCode( + 0xf0 | ((x >>> 18) & 0x07), + 0x80 | ((x >>> 12) & 0x3f), + 0x80 | ((x >>> 6) & 0x3f), + 0x80 | (x & 0x3f), + ); + } + return output; +} + +/* + * Encode a string as utf-16 + */ +function str2rstr_utf16le(input) { + var output = ''; + for (var i = 0; i < input.length; i++) + output += String.fromCharCode( + input.charCodeAt(i) & 0xff, + (input.charCodeAt(i) >>> 8) & 0xff, + ); + return output; +} + +function str2rstr_utf16be(input) { + var output = ''; + for (var i = 0; i < input.length; i++) + output += String.fromCharCode( + (input.charCodeAt(i) >>> 8) & 0xff, + input.charCodeAt(i) & 0xff, + ); + return output; +} + +/* + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ +function rstr2binl(input) { + var output = Array(input.length >> 2); + for (var i = 0; i < output.length; i++) output[i] = 0; + for (var i = 0; i < input.length * 8; i += 8) + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32; + return output; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2rstr(input) { + var output = ''; + for (var i = 0; i < input.length * 32; i += 8) + output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff); + return output; +} + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ +function binl_md5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32; + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); + d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); + d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) { + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); +} + +function md5_ff(a, b, c, d, x, s, t) { + return md5_cmn((b & c) | (~b & d), a, b, x, s, t); +} + +function md5_gg(a, b, c, d, x, s, t) { + return md5_cmn((b & d) | (c & ~d), a, b, x, s, t); +} + +function md5_hh(a, b, c, d, x, s, t) { + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} + +function md5_ii(a, b, c, d, x, s, t) { + return md5_cmn(c ^ (b | ~d), a, b, x, s, t); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); +} diff --git a/backend/src/vendor/open-api.js b/backend/src/vendor/open-api.js new file mode 100644 index 000000000..6f3085868 --- /dev/null +++ b/backend/src/vendor/open-api.js @@ -0,0 +1,360 @@ +/* eslint-disable no-undef */ +const isQX = typeof $task !== 'undefined'; +const isLoon = typeof $loon !== 'undefined'; +const isSurge = typeof $httpClient !== 'undefined' && !isLoon; +const isNode = eval(`typeof process !== "undefined"`); // eval is needed in order to avoid browserify processing +const isStash = + 'undefined' !== typeof $environment && $environment['stash-version']; +const isShadowRocket = 'undefined' !== typeof $rocket; + +export class OpenAPI { + constructor(name = 'untitled', debug = false) { + this.name = name; + this.debug = debug; + + this.http = HTTP(); + this.env = ENV(); + + this.node = (() => { + if (isNode) { + const fs = eval("require('fs')"); + + return { + fs, + }; + } else { + return null; + } + })(); + this.initCache(); + + const delay = (t, v) => + new Promise(function (resolve) { + setTimeout(resolve.bind(null, v), t); + }); + + Promise.prototype.delay = async function (t) { + const v = await this; + return await delay(t, v); + }; + } + + // persistence + // initialize cache + initCache() { + if (isQX) + this.cache = JSON.parse($prefs.valueForKey(this.name) || '{}'); + if (isLoon || isSurge) + this.cache = JSON.parse($persistentStore.read(this.name) || '{}'); + + if (isNode) { + // create a json for root cache + const basePath = + eval('process.env.SUB_STORE_DATA_BASE_PATH') || '.'; + let rootPath = `${basePath}/root.json`; + + this.log(`Root path: ${rootPath}`); + if (!this.node.fs.existsSync(rootPath)) { + this.node.fs.writeFileSync(rootPath, JSON.stringify({}), { + flag: 'wx', + }); + this.root = {}; + } else { + this.root = JSON.parse( + this.node.fs.readFileSync(`${rootPath}`), + ); + } + + // create a json file with the given name if not exists + let fpath = `${basePath}/${this.name}.json`; + this.log(`Data path: ${fpath}`); + if (!this.node.fs.existsSync(fpath)) { + this.node.fs.writeFileSync(fpath, JSON.stringify({}), { + flag: 'wx', + }); + this.cache = {}; + } else { + this.cache = JSON.parse(this.node.fs.readFileSync(`${fpath}`)); + } + } + } + + // store cache + persistCache() { + const data = JSON.stringify(this.cache, null, 2); + if (isQX) $prefs.setValueForKey(data, this.name); + if (isLoon || isSurge) $persistentStore.write(data, this.name); + if (isNode) { + const basePath = + eval('process.env.SUB_STORE_DATA_BASE_PATH') || '.'; + + this.node.fs.writeFileSync( + `${basePath}/${this.name}.json`, + data, + { flag: 'w' }, + (err) => console.log(err), + ); + this.node.fs.writeFileSync( + `${basePath}/root.json`, + JSON.stringify(this.root, null, 2), + { flag: 'w' }, + (err) => console.log(err), + ); + } + } + + write(data, key) { + this.log(`SET ${key}`); + if (key.indexOf('#') !== -1) { + key = key.substr(1); + if (isSurge || isLoon) { + return $persistentStore.write(data, key); + } + if (isQX) { + return $prefs.setValueForKey(data, key); + } + if (isNode) { + this.root[key] = data; + } + } else { + this.cache[key] = data; + } + this.persistCache(); + } + + read(key) { + this.log(`READ ${key}`); + if (key.indexOf('#') !== -1) { + key = key.substr(1); + if (isSurge || isLoon) { + return $persistentStore.read(key); + } + if (isQX) { + return $prefs.valueForKey(key); + } + if (isNode) { + return this.root[key]; + } + } else { + return this.cache[key]; + } + } + + delete(key) { + this.log(`DELETE ${key}`); + if (key.indexOf('#') !== -1) { + key = key.substr(1); + if (isSurge || isLoon) { + return $persistentStore.write(null, key); + } + if (isQX) { + return $prefs.removeValueForKey(key); + } + if (isNode) { + delete this.root[key]; + } + } else { + delete this.cache[key]; + } + this.persistCache(); + } + + // notification + notify(title, subtitle = '', content = '', options = {}) { + const openURL = options['open-url']; + const mediaURL = options['media-url']; + + if (isQX) $notify(title, subtitle, content, options); + if (isSurge) { + $notification.post( + title, + subtitle, + content + `${mediaURL ? '\n多媒体:' + mediaURL : ''}`, + { + url: openURL, + }, + ); + } + if (isLoon) { + let opts = {}; + if (openURL) opts['openUrl'] = openURL; + if (mediaURL) opts['mediaUrl'] = mediaURL; + if (JSON.stringify(opts) === '{}') { + $notification.post(title, subtitle, content); + } else { + $notification.post(title, subtitle, content, opts); + } + } + if (isNode) { + const content_ = + content + + (openURL ? `\n点击跳转: ${openURL}` : '') + + (mediaURL ? `\n多媒体: ${mediaURL}` : ''); + console.log(`${title}\n${subtitle}\n${content_}\n\n`); + + let push = eval('process.env.SUB_STORE_PUSH_SERVICE'); + if (push) { + const url = push + .replace( + '[推送标题]', + encodeURIComponent(title || 'Sub-Store'), + ) + .replace( + '[推送内容]', + encodeURIComponent( + [subtitle, content_].map((i) => i).join('\n'), + ), + ); + const $http = HTTP(); + $http + .get({ url }) + .then((resp) => { + console.log( + `[Push Service] URL: ${url}\nRES: ${resp.statusCode} ${resp.body}`, + ); + }) + .catch((e) => { + console.log(`[Push Service] URL: ${url}\nERROR: ${e}`); + }); + } + } + } + + // other helper functions + log(msg) { + if (this.debug) console.log(`[${this.name}] LOG: ${msg}`); + } + + info(msg) { + console.log(`[${this.name}] INFO: ${msg}`); + } + + error(msg) { + console.log(`[${this.name}] ERROR: ${msg}`); + } + + wait(millisec) { + return new Promise((resolve) => setTimeout(resolve, millisec)); + } + + done(value = {}) { + if (isQX || isLoon || isSurge) { + $done(value); + } else if (isNode) { + if (typeof $context !== 'undefined') { + $context.headers = value.headers; + $context.statusCode = value.statusCode; + $context.body = value.body; + } + } + } +} + +export function ENV() { + return { isQX, isLoon, isSurge, isNode, isStash, isShadowRocket }; +} + +export function HTTP(defaultOptions = { baseURL: '' }) { + const { isQX, isLoon, isSurge, isNode } = ENV(); + const methods = [ + 'GET', + 'POST', + 'PUT', + 'DELETE', + 'HEAD', + 'OPTIONS', + 'PATCH', + ]; + const URL_REGEX = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/; + + function send(method, options) { + options = typeof options === 'string' ? { url: options } : options; + const baseURL = defaultOptions.baseURL; + if (baseURL && !URL_REGEX.test(options.url || '')) { + options.url = baseURL ? baseURL + options.url : options.url; + } + options = { ...defaultOptions, ...options }; + const timeout = options.timeout; + const events = { + ...{ + onRequest: () => {}, + onResponse: (resp) => resp, + onTimeout: () => {}, + }, + ...options.events, + }; + + events.onRequest(method, options); + + if (options.node) { + // Surge & Loon allow connecting to a server using a specified proxy node + if (isSurge) { + const build = $environment['surge-build']; + if (build && parseInt(build) >= 2407) { + options['policy-descriptor'] = options.node; + delete options.node; + } + } + } + + let worker; + if (isQX) { + worker = $task.fetch({ + method, + url: options.url, + headers: options.headers, + body: options.body, + }); + } else if (isLoon || isSurge || isNode) { + worker = new Promise((resolve, reject) => { + const request = isNode + ? eval("require('request')") + : $httpClient; + request[method.toLowerCase()]( + options, + (err, response, body) => { + if (err) reject(err); + else + resolve({ + statusCode: + response.status || response.statusCode, + headers: response.headers, + body, + }); + }, + ); + }); + } + + let timeoutid; + const timer = timeout + ? new Promise((_, reject) => { + timeoutid = setTimeout(() => { + events.onTimeout(); + return reject( + `${method} URL: ${options.url} exceeds the timeout ${timeout} ms`, + ); + }, timeout); + }) + : null; + + return ( + timer + ? Promise.race([timer, worker]).then((res) => { + if (typeof clearTimeout !== 'undefined') { + clearTimeout(timeoutid); + } + return res; + }) + : worker + ).then((resp) => events.onResponse(resp)); + } + + const http = {}; + methods.forEach( + (method) => + (http[method.toLowerCase()] = (options) => send(method, options)), + ); + return http; +} diff --git a/backend/sub-store.js b/backend/sub-store.js deleted file mode 100644 index cbd9691b9..000000000 --- a/backend/sub-store.js +++ /dev/null @@ -1,2420 +0,0 @@ -/** - * Sub-Store v0.1 (Backend only) - * @Author: Peng-YM - * @Description: - * 适用于QX,Loon,Surge的订阅管理工具。 - * - 功能 - * 1. 订阅转换,支持SS, SSR, V2RayN, QX, Loon, Surge格式的互相转换。 - * 2. 节点过滤,重命名,排序等。 - * 3. 订阅拆分,组合。 - */ - -const $ = API("sub-store"); - -// Constants -const SUBS_KEY = "subs"; -const COLLECTIONS_KEY = "collections"; - -// SOME INITIALIZATIONS -if (!$.read(SUBS_KEY)) $.write({}, SUBS_KEY); -if (!$.read(COLLECTIONS_KEY)) $.write({}, COLLECTIONS_KEY); - -// BACKEND API -const $app = express(); - -// subscriptions -$app.get("/download/:name", downloadSub) - -$app.route("/sub/:name") - .get(getSub) - .patch(updateSub) - .delete(deleteSub); - -$app.route("/sub") - .get(getAllSubs) - .post(newSub) - .delete(deleteAllSubs); - -// collections -$app.get("/download/collection/:name", downloadCollection); -$app.route("/collection/:name") - .get(getCollection) - .patch(updateCollection) - .delete(deleteCollection); -$app.route("/collection") - .get(getAllCollections) - .post(newCollection) - .delete(deleteAllCollections); - -$app.all("/", (req, res) => { - res.send("Hello from Sub-Store! Made with ❤️ by Peng-YM.") -}); - -$app.start(); - -// SOME CONSTANTS -const FALL_BACK_TARGET = "Raw"; -const DEFAULT_SUPPORTED_PLATFORMS = { - QX: true, - Loon: true, - Surge: true, - Raw: true -} -const AVAILABLE_FILTERS = { - "Keyword Filter": KeywordFilter, - "Discard Keyword Filter": DiscardKeywordFilter, - "Useless Filter": UselessFilter, - "Region Filter": RegionFilter, - "Regex Filter": RegexFilter, - "Discard Regex Filter": DiscardRegexFilter, - "Type Filter": TypeFilter, - "Script Filter": ScriptFilter -} - -const AVAILABLE_OPERATORS = { - "Set Property Operator": SetPropertyOperator, - "Flag Operator": FlagOperator, - "Sort Operator": SortOperator, - "Keyword Sort Operator": KeywordSortOperator, - "Keyword Rename Operator": KeywordRenameOperator, - "Keyword Delete Operator": KeywordDeleteOperator, - "Regex Rename Operator": RegexRenameOperator, - "Regex Delete Operator": RegexDeleteOperator, - "Script Operator": ScriptOperator -} - -/**************************** API -- Subscriptions ***************************************/ -// download subscription, for APP only -async function downloadSub(req, res) { - const {name} = req.params; - const platform = getPlatformFromHeaders(req.headers); - const allSubs = $.read(SUBS_KEY); - if (allSubs[name]) { - const sub = allSubs[name]; - try { - const output = await parseSub(sub, platform); - res.send(output); - } catch (err) { - $.notify('[Sub-Store]', '❌ 无法获取订阅!', `错误信息:${err}`) - res.status(500).json({ - status: "failed", - message: err - }); - } - } else { - res.status(404).json({ - status: "failed", - message: `订阅${name}不存在!` - }); - } -} - -async function parseSub(sub, platform) { - // download from url - const raw = await $.http.get(sub.url).then(resp => resp.body).catch(err => { - throw new Error(err); - }); - console.log("======================================================================="); - console.log(`Processing subscription: ${sub.name}, target platform ==> ${platform}.`); - const $parser = ProxyParser(platform); - let proxies = $parser.parse(raw); - - // filters - const $filter = ProxyFilter(); - // operators - const $operator = ProxyOperator(); - - for (const item of sub.process || []) { - if (item.type.indexOf("Script") !== -1) { - if (item.args && item.args[0].indexOf("http") !== -1) { - // if this is remote script - item.args[0] = await $.http.get(item.args[0]).then(resp => resp.body).catch(err => { - throw new Error(`Error when downloading remote script: ${item.args[0]}.\n Reason: ${err}`); - }); - } - } - if (item.type.indexOf("Filter") !== -1) { - const filter = AVAILABLE_FILTERS[item.type]; - if (filter) { - $filter.addFilters(filter(...(item.args || []))); - proxies = $filter.process(proxies); - console.log(`Applying filter "${item.type}" with arguments:\n >>> ${item.args || "None"}`); - } - } else if (item.type.indexOf("Operator") !== -1) { - const operator = AVAILABLE_OPERATORS[item.type]; - if (operator) { - $operator.addOperators(operator(...(item.args || []))); - proxies = $operator.process(proxies); - console.log(`Applying operator "${item.type}" with arguments: \n >>> ${item.args || "None"}`); - } - } - } - return $parser.produce(proxies); -} - -// Subscriptions -async function getSub(req, res) { - const {name} = req.params; - const sub = $.read(SUBS_KEY)[name]; - if (sub) { - res.json({ - status: "success", - data: sub - }); - } else { - res.status(404).json({ - status: "failed", - message: `未找到订阅:${name}!` - }); - } -} - -async function newSub(req, res) { - const sub = req.body; - const allSubs = $.read(SUBS_KEY); - if (allSubs[sub.name]) { - res.status(500).json({ - status: "failed", - message: `订阅${sub.name}已存在!` - }); - } - // validate name - if (/^[\w-_]*$/.test(sub.name)) { - allSubs[sub.name] = sub; - $.write(allSubs, SUBS_KEY); - res.status(201).json({ - status: "success", - data: sub - }); - } else { - res.status(500).json({ - status: "failed", - message: `订阅名称 ${sub.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。` - }) - } -} - -async function updateSub(req, res) { - const {name} = req.params; - let sub = req.body; - const allSubs = $.read(SUBS_KEY); - if (allSubs[name]) { - const newSub = { - ...allSubs[name], - ...sub - }; - allSubs[name] = newSub; - $.write(allSubs, SUBS_KEY); - res.json({ - status: "success", - data: newSub - }) - } else { - res.status(500).json({ - status: "failed", - message: `订阅${name}不存在,无法更新!` - }); - } -} - -async function deleteSub(req, res) { - const {name} = req.params; - let allSubs = $.read(SUBS_KEY); - delete allSubs[name]; - $.write(allSubs, SUBS_KEY); - res.json({ - status: "success" - }); -} - -async function getAllSubs(req, res) { - const allSubs = $.read(SUBS_KEY); - res.json({ - status: "success", - data: Object.keys(allSubs) - }); -} - -async function deleteAllSubs(req, res) { - $.write({}, SUBS_KEY); - res.json({ - status: "success" - }); -} - -// Collections -async function downloadCollection(req, res) { - const {name} = req.params; - const collection = $.read(COLLECTIONS_KEY)[name]; - const platform = getPlatformFromHeaders(req.headers); - if (collection) { - const subs = collection.subscriptions || []; - const output = await Promise.all(subs.map(async id => { - const sub = $.read(SUBS_KEY)[id]; - try { - return parseSub(sub, platform); - } catch (err) { - console.log(`ERROR when process subscription: ${id}`); - return ""; - } - })); - res.send(output.join("\n")); - } else { - $.notify('[Sub-Store]', `❌ 未找到订阅集:${name}!`) - res.status(404).json({ - status: "failed", - message: `❌ 未找到订阅集:${name}!` - }); - } -} - -async function getCollection(req, res) { - const {name} = req.params; - const collection = $.read(COLLECTIONS_KEY)[name]; - if (collection) { - res.json({ - status: "success", - data: collection - }); - } else { - res.status(404).json({ - status: "failed", - message: `未找到订阅集:${name}!` - }); - } -} - -async function newCollection(req, res) { - const collection = req.body; - const allCol = $.read(COLLECTIONS_KEY); - if (allCol[collection.name]) { - res.status(500).json({ - status: "failed", - message: `订阅集${collection.name}已存在!` - }); - } - // validate name - if (/^[\w-_]*$/.test(collection.name)) { - allCol[collection.name] = collection; - $.write(allCol, COLLECTIONS_KEY); - res.status(201).json({ - status: "success", - data: collection - }); - } else { - res.status(500).json({ - status: "failed", - message: `订阅集名称 ${collection.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。` - }) - } -} - -async function updateCollection(req, res) { - const {name} = req.params; - let collection = req.body; - const allCol = $.read(COLLECTIONS_KEY); - if (allCol[name]) { - const newCol = { - ...allCol[name], - ...collection - }; - allCol[name] = newCol; - $.write(allCol, COLLECTIONS_KEY); - res.json({ - status: "success", - data: newCol - }) - } else { - res.status(500).json({ - status: "failed", - message: `订阅集${name}不存在,无法更新!` - }); - } -} - -async function deleteCollection(req, res) { - const {name} = req.params; - let allCol = $.read(COLLECTIONS_KEY); - delete allCol[name]; - $.write(allCol, COLLECTIONS_KEY); - res.json({ - status: "success" - }); -} - -async function getAllCollections(req, res) { - const allCols = $.read(COLLECTIONS_KEY); - res.json({ - status: "success", - data: Object.keys(allCols) - }); -} - -async function deleteAllCollections(req, res) { - $.write({}, COLLECTIONS_KEY); - res.json({ - status: "success" - }); -} - -/**************************** Proxy Handlers ***************************************/ -function ProxyParser(targetPlatform) { - // parser collections - const parsers = []; - const producers = []; - - function addParsers(...args) { - args.forEach(a => parsers.push(a())); - } - - function addProducers(...args) { - args.forEach(a => producers.push(a())) - } - - function parse(raw) { - raw = preprocessing(raw); - const lines = raw.split("\n"); - const result = []; - // convert to json format - for (let line of lines) { - line = line.trim(); - if (line.length === 0) continue; // skip empty line - if (line.startsWith("#")) continue; // skip comments - let matched = false; - for (const p of parsers) { - const {patternTest, func} = p; - - // some lines with weird format may produce errors! - let patternMatched; - try { - patternMatched = patternTest(line); - } catch (err) { - patternMatched = false; - } - - if (patternMatched) { - matched = true; - // run parser safely. - try { - const proxy = func(line); - if (!proxy) { - // failed to parse this line - console.log(`ERROR: parser return nothing for \n${line}\n`); - break; - } - // skip unsupported proxies - // if proxy.supported is undefined, assume that all platforms are supported. - if (typeof proxy.supported === 'undefined' || proxy.supported[targetPlatform]) { - delete proxy.supported; - result.push(proxy); - break; - } - } catch (err) { - console.log(`ERROR: Failed to parse line: \n ${line}\n Reason: ${err}`); - } - } - } - if (!matched) { - console.log(`ERROR: Failed to find a rule to parse line: \n${line}\n`); - } - } - if (result.length === 0) { - throw new Error(`ERROR: Input does not contains any valid node for platform ${targetPlatform}`) - } - return result; - } - - function produce(proxies) { - for (const p of producers) { - if (p.targetPlatform === targetPlatform) { - return proxies.map(proxy => { - try { - return p.output(proxy) - } catch (err) { - console.log(`ERROR: cannot produce proxy: ${JSON.stringify(proxy)}\nReason: ${err}`); - return ""; - } - }).join("\n"); - } - } - throw new Error(`Cannot find any producer for target platform: ${targetPlatform}`); - } - - // preprocess raw input - function preprocessing(raw) { - let output; - if (raw.indexOf("DOCTYPE html") !== -1) { - // HTML format, maybe a wrong URL! - throw new Error("Invalid format HTML!"); - } - // check if content is based64 encoded - const Base64 = new Base64Code(); - const keys = ["dm1lc3M", "c3NyOi8v", "dHJvamFu", "c3M6Ly", "c3NkOi8v"]; - if (keys.some(k => raw.indexOf(k) !== -1)) { - output = Base64.safeDecode(raw); - } else { - output = raw; - } - output = output.split("\n"); - for (let i = 0; i < output.length; i++) { - output[i] = output[i].trim(); // trim lines - } - return output.join("\n"); - } - - // Parsers - addParsers( - // URI format parsers - URI_SS, URI_SSR, URI_VMess, URI_Trojan, - // Quantumult X platform - QX_SS, QX_SSR, QX_VMess, QX_Trojan, QX_Http, - // Loon platform - Loon_SS, Loon_SSR, Loon_VMess, Loon_Trojan, Loon_Http, - // Surge platform - Surge_SS, Surge_VMess, Surge_Trojan, Surge_Http - ); - - // Producers - addProducers( - QX_Producer, Loon_Producer, Surge_Producer, Raw_Producer - ); - - return { - parse, produce - }; -} - -function ProxyFilter() { - const filters = []; - - function addFilters(...args) { - args.forEach(a => filters.push(a)); - } - - // select proxies - function process(proxies) { - let selected = FULL(proxies.length, true); - for (const filter of filters) { - try { - selected = AND(selected, filter.func(proxies)); - } catch (err) { - console.log(`Cannot apply filter ${filter.name}\n Reason: ${err}`); - } - } - return proxies.filter((_, i) => selected[i]) - } - - return { - process, addFilters - } -} - -function ProxyOperator() { - const operators = []; - - function addOperators(...args) { - args.forEach(a => operators.push(a)); - } - - // run all operators - function process(proxies) { - let output = clone(proxies); - for (const op of operators) { - try { - const output_ = op.func(output); - if (output_) output = output_; - } catch (err) { - // print log and skip this operator - console.log(`ERROR: cannot apply operator ${op.name}! Reason: ${err}`); - } - } - return output; - } - - return {addOperators, process} -} - -/**************************** URI Format ***************************************/ -// Parse SS URI format (only supports new SIP002, legacy format is depreciated). -// reference: https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html -function URI_SS() { - const patternTest = (line) => { - return /^ss:\/\//.test(line); - } - const Base64 = new Base64Code(); - const supported = clone(DEFAULT_SUPPORTED_PLATFORMS); - const func = (line) => { - // parse url - let content = line.split("ss://")[1]; - - const proxy = { - name: decodeURIComponent(line.split("#")[1]), - type: "ss", - supported - } - content = content.split("#")[0]; // strip proxy name - - // handle IPV4 and IPV6 - const serverAndPort = content.match(/@([^\/]*)\//)[1]; - const portIdx = serverAndPort.lastIndexOf(":"); - proxy.server = serverAndPort.substring(0, portIdx); - proxy.port = serverAndPort.substring(portIdx + 1); - - const userInfo = Base64.safeDecode(content.split("@")[0]).split(":"); - proxy.cipher = userInfo[0]; - proxy.password = userInfo[1]; - - // handle obfs - const idx = content.indexOf("?plugin="); - if (idx !== -1) { - const pluginInfo = ("plugin=" + decodeURIComponent(content.split("?plugin=")[1])).split(";"); - const params = {}; - for (const item of pluginInfo) { - const [key, val] = item.split("="); - if (key) params[key] = val || true; // some options like "tls" will not have value - } - switch (params.plugin) { - case 'simple-obfs': - proxy.plugin = 'obfs' - proxy['plugin-opts'] = { - mode: params.obfs, - host: params['obfs-host'] - } - break - case 'v2ray-plugin': - proxy.supported = { - ...DEFAULT_SUPPORTED_PLATFORMS, - Loon: false, - Surge: false - } - proxy.obfs = 'v2ray-plugin' - proxy['plugin-opts'] = { - mode: "websocket", - host: params['obfs-host'], - path: params.path || "" - } - break - default: - throw new Error(`Unsupported plugin option: ${params.plugin}`) - } - } - return proxy; - } - return {patternTest, func}; -} - -// Parse URI SSR format, such as ssr://xxx -function URI_SSR() { - const patternTest = (line) => { - return /^ssr:\/\//.test(line); - } - const Base64 = new Base64Code(); - const supported = { - ...DEFAULT_SUPPORTED_PLATFORMS, - Surge: false - } - - const func = (line) => { - line = Base64.safeDecode(line.split("ssr://")[1]); - - // handle IPV6 & IPV4 format - let splitIdx = line.indexOf(':origin'); - if (splitIdx === -1) { - splitIdx = line.indexOf(":auth_"); - } - const serverAndPort = line.substring(0, splitIdx); - const server = serverAndPort.substring(0, serverAndPort.lastIndexOf(":")); - const port = serverAndPort.substring(serverAndPort.lastIndexOf(":") + 1); - - let params = line.substring(splitIdx + 1).split("/?")[0].split(":"); - let proxy = { - type: "ssr", - server, - port, - protocol: params[0], - cipher: params[1], - obfs: params[2], - password: Base64.safeDecode(params[3]), - supported - } - // get other params - params = {}; - line = line.split("/?")[1].split("&"); - if (line.length > 1) { - for (const item of line) { - const [key, val] = item.split("="); - params[key] = val; - } - } - proxy = { - ...proxy, - name: Base64.safeDecode(params.remarks), - "protocol-param": Base64.safeDecode(params.protoparam).replace(/\s/g, "") || "", - "obfs-param": Base64.safeDecode(params.obfsparam).replace(/\s/g, "") || "" - } - return proxy; - } - - return {patternTest, func}; -} - -// V2rayN URI VMess format -// reference: https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2) -function URI_VMess() { - const patternTest = (line) => { - return /^vmess:\/\//.test(line); - } - const Base64 = new Base64Code(); - const supported = clone(DEFAULT_SUPPORTED_PLATFORMS); - const func = (line) => { - line = line.split("vmess://")[1]; - const params = JSON.parse(Base64.safeDecode(line)); - const proxy = { - name: params.ps, - type: "vmess", - server: params.add, - port: params.port, - cipher: "auto", // V2rayN has no default cipher! use aes-128-gcm as default. - uuid: params.id, - alterId: params.aid || 0, - tls: JSON.parse(params.tls || "false"), - supported - } - // handle obfs - if (params.net === 'ws') { - proxy.network = 'ws'; - proxy['ws-path'] = params.path; - proxy['ws-headers'] = { - Host: params.host || params.add - } - } - return proxy - } - return {patternTest, func}; -} - -// Trojan URI format -function URI_Trojan() { - const patternTest = (line) => { - return /^trojan:\/\//.test(line); - } - const supported = clone(DEFAULT_SUPPORTED_PLATFORMS); - const func = (line) => { - // trojan forces to use 443 port - if (line.indexOf(":443") === -1) { - throw new Error("Trojan port should always be 443!"); - } - line = line.split("trojan://")[1]; - const server = line.split("@")[1].split(":443")[0]; - - return { - name: `[Trojan] ${server}`, // trojan uri has no server tag! - type: "trojan", - server, - port: 443, - password: line.split("@")[0], - supported - } - } - return {patternTest, func}; -} - -/**************************** Quantumult X ***************************************/ -function QX_SS() { - const patternTest = (line) => { - return /^shadowsocks\s*=/.test(line.split(",")[0].trim()) && line.indexOf("ssr-protocol") === -1; - }; - const func = (line) => { - const params = getQXParams(line); - const proxy = { - name: params.tag, - type: "ss", - server: params.server, - port: params.port, - cipher: params.method, - password: params.password, - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - supported: clone(DEFAULT_SUPPORTED_PLATFORMS) - }; - // handle obfs options - if (params.obfs) { - proxy["plugin-opts"] = { - host: params['obfs-host'] || proxy.server - }; - switch (params.obfs) { - case "http": - case "tls": - proxy.plugin = "obfs"; - proxy["plugin-opts"].mode = params.obfs; - break; - case "ws": - case "wss": - proxy["plugin-opts"] = { - ...proxy["plugin-opts"], - mode: "websocket", - path: params['obfs-uri'], - tls: params.obfs === 'wss' - } - proxy.plugin = "v2ray-plugin" - // Surge and Loon lack support for v2ray-plugin obfs - proxy.supported.Surge = false - proxy.supported.Loon = false - break; - } - } - return proxy; - }; - return {patternTest, func}; -} - -function QX_SSR() { - const patternTest = (line) => { - return /^shadowsocks\s*=/.test(line.split(",")[0].trim()) && line.indexOf("ssr-protocol") !== -1; - }; - const supported = { - ...DEFAULT_SUPPORTED_PLATFORMS, - Surge: false - } - const func = (line) => { - const params = getQXParams(line); - const proxy = { - name: params.tag, - type: "ssr", - server: params.server, - port: params.port, - cipher: params.method, - password: params.password, - protocol: params["ssr-protocol"], - obfs: "plain", // default obfs - "protocol-param": params['ssr-protocol-param'], - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - supported - } - // handle obfs options - if (params.obfs) { - proxy.obfs = params.obfs; - proxy['obfs-param'] = params['obfs-host'] - } - return proxy; - } - return {patternTest, func}; -} - -function QX_VMess() { - const patternTest = (line) => { - return /^vmess\s*=/.test(line.split(",")[0].trim()); - }; - const func = (line) => { - const params = getQXParams(line) - const proxy = { - type: "vmess", - name: params.tag, - server: params.server, - port: params.port, - cipher: params.method || 'none', - uuid: params.password, - alterId: 0, - tls: params.obfs === 'over-tls' || params.obfs === 'wss', - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - } - if (proxy.tls) { - proxy.sni = params['obfs-host'] || params.server; - proxy.scert = !JSON.parse(params['tls-verification'] || 'true'); - } - // handle ws headers - if (params.obfs === 'ws' || params.obfs === 'wss') { - proxy.network = 'ws'; - proxy['ws-path'] = params['obfs-uri']; - proxy['ws-headers'] = { - Host: params['obfs-host'] || params.server // if no host provided, use the same as server - } - } - return proxy; - } - - return {patternTest, func}; -} - -function QX_Trojan() { - const patternTest = (line) => { - return /^trojan\s*=/.test(line.split(",")[0].trim()); - }; - const func = (line) => { - const params = getQXParams(line); - const proxy = { - type: "trojan", - name: params.tag, - server: params.server, - port: params.port, - password: params.password, - sni: params['tls-host'] || params.server, - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - } - proxy.scert = !JSON.parse(params['tls-verification'] || 'true'); - return proxy; - } - return {patternTest, func} -} - -function QX_Http() { - const patternTest = (line) => { - return /^http\s*=/.test(line.split(",")[0].trim()); - }; - const func = (line) => { - const params = getQXParams(line); - const proxy = { - type: "http", - name: params.tag, - server: params.server, - port: params.port, - username: params.username, - password: params.password, - tls: JSON.parse(params['over-tls'] || "false"), - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - } - if (proxy.tls) { - proxy.sni = params['tls-host'] || proxy.server; - proxy.scert = !JSON.parse(params['tls-verification'] || 'true'); - } - return proxy; - } - - return {patternTest, func}; -} - -function getQXParams(line) { - const groups = line.split(","); - const params = {}; - const protocols = ["shadowsocks", "vmess", "http", "trojan"]; - groups.forEach((g) => { - const [key, value] = g.split("="); - if (protocols.indexOf(key) !== -1) { - params.type = key; - const conf = value.split(":"); - params.server = conf[0]; - params.port = conf[1]; - } else { - params[key.trim()] = value.trim(); - } - }); - return params; -} - -/**************************** Loon ***************************************/ -function Loon_SS() { - const patternTest = (line) => { - return line.split(",")[0].split("=")[1].trim().toLowerCase() === 'shadowsocks'; - } - const func = (line) => { - const params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "ss", - server: params[1], - port: params[2], - cipher: params[3], - password: params[4].replace(/"/g, "") - } - // handle obfs - if (params.length > 5) { - proxy.plugin = 'obfs'; - proxy['plugin-opts'] = { - mode: proxy.obfs, - host: params[6] - } - } - return proxy; - } - return {patternTest, func}; -} - -function Loon_SSR() { - const patternTest = (line) => { - return line.split(",")[0].split("=")[1].trim().toLowerCase() === 'shadowsocksr'; - } - const func = (line) => { - const params = line.split("=")[1].split(","); - const supported = clone(DEFAULT_SUPPORTED_PLATFORMS); - supported.Surge = false; - return { - name: line.split("=")[0].trim(), - type: "ssr", - server: params[1], - port: params[2], - cipher: params[3], - password: params[4].replace(/"/g, ""), - protocol: params[5], - "protocol-param": params[6].match(/{(.*)}/)[1], - supported, - obfs: params[7], - 'obfs-param': params[8].match(/{(.*)}/)[1] - } - } - return {patternTest, func}; -} - -function Loon_VMess() { - const patternTest = (line) => { - // distinguish between surge vmess - return /^.*=\s*vmess/i.test(line.split(",")[0]) && line.indexOf("username") === -1; - } - const func = (line) => { - let params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "vmess", - server: params[1], - port: params[2], - cipher: params[3] || 'none', - uuid: params[4].replace(/"/g, ""), - alterId: 0, - } - // get transport options - params = params.splice(5); - for (const item of params) { - const [key, val] = item.split(":"); - params[key] = val; - } - proxy.tls = JSON.parse(params['over-tls'] || 'false'); - if (proxy.tls) { - proxy.sni = params['tls-name'] || proxy.server; - proxy.scert = JSON.parse(params['skip-cert-verify'] || 'false'); - } - switch (params.transport) { - case "tcp": - break; - case "ws": - proxy.network = params.transport - proxy['ws-path'] = params.path - proxy['ws-headers'] = { - Host: params.host - } - } - if (proxy.tls) { - proxy.scert = JSON.parse(params['skip-cert-verify'] || 'false') - } - return proxy; - } - return {patternTest, func}; -} - -function Loon_Trojan() { - const patternTest = (line) => { - return /^.*=\s*trojan/i.test(line.split(",")[0]) && line.indexOf("password") === -1; - } - - const func = (line) => { - const params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "trojan", - server: params[1], - port: params[2], - password: params[3].replace(/"/g, ""), - sni: params[1], // default sni is the server itself - scert: JSON.parse(params['skip-cert-verify'] || 'false') - } - // trojan sni - if (params.length > 4) { - const [key, val] = params[4].split(":"); - if (key === 'tls-name') proxy.sni = val; - else throw new Error(`ERROR: unknown option ${key} for line: \n${line}`); - } - return proxy; - } - - return {patternTest, func} -} - -function Loon_Http() { - const patternTest = (line) => { - return /^.*=\s*http/i.test(line.split(",")[0]) - && line.split(",").length === 5 - && line.indexOf("username") === -1 - && line.indexOf("password") === -1 - } - - const func = (line) => { - const params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "http", - server: params[1], - port: params[2], - tls: params[2] === "443", // port 443 is considered as https type - username: (params[3] || "").replace(/"/g, ""), - password: (params[4] || "").replace(/"/g, "") - } - if (proxy.tls) { - proxy.sni = params['tls-name'] || proxy.server; - proxy.scert = JSON.parse(params['skip-cert-verify'] || 'false'); - } - - return proxy; - } - return {patternTest, func} -} - -/**************************** Surge ***************************************/ -function Surge_SS() { - const patternTest = (line) => { - return /^.*=\s*ss/.test(line.split(",")[0]); - } - const func = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "ss", - server: params.server, - port: params.port, - cipher: params['encrypt-method'], - password: params.password, - tfo: JSON.parse(params.tfo || "false"), - udp: JSON.parse(params['udp-relay'] || "false"), - } - // handle obfs - if (params.obfs) { - proxy.plugin = 'obfs'; - proxy['plugin-opts'] = { - mode: params.obfs, - host: params['obfs-host'] - } - } - return proxy; - } - return {patternTest, func} -} - -function Surge_VMess() { - const patternTest = (line) => { - return /^.*=\s*vmess/.test(line.split(",")[0]) && line.indexOf("username") !== -1; - } - const func = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "vmess", - server: params.server, - port: params.port, - uuid: params.username, - alterId: 0, // surge does not have this field - cipher: "none", // surge does not have this field - tls: JSON.parse(params.tls || "false"), - tfo: JSON.parse(params.tfo || "false"), - } - if (proxy.tls) { - proxy.scert = JSON.parse(params['skip-cert-verify'] || "false"); - proxy.sni = params['sni'] || params.server; - } - // use websocket - if (JSON.parse(params.ws || "false")) { - proxy.network = 'ws'; - proxy['ws-path'] = params['ws-path']; - proxy['ws-headers'] = { - Host: params.sni - } - } - return proxy; - } - return {patternTest, func}; -} - -function Surge_Trojan() { - const patternTest = (line) => { - return /^.*=\s*trojan/.test(line.split(",")[0]) && line.indexOf("sni") !== -1; - } - const func = (line) => { - const params = getSurgeParams(line); - return { - name: params.name, - type: "trojan", - server: params.server, - port: params.port, - password: params.password, - sni: params.sni || params.server, - tfo: JSON.parse(params.tfo || "false"), - scert: JSON.parse(params['skip-cert-verify'] || "false"), - } - } - - return {patternTest, func}; -} - -function Surge_Http() { - const patternTest = (line) => { - return /^.*=\s*http/.test(line.split(",")[0]) && !Loon_Http().patternTest(line) - } - const func = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "http", - server: params.server, - port: params.port, - tls: JSON.parse(params.tls || "false"), - tfo: JSON.parse(params.tfo || "false"), - } - if (proxy.tls) { - proxy.scert = JSON.parse(params['skip-cert-verify'] || "false"); - proxy.sni = params.sni || params.server; - } - if (params.username !== 'none') proxy.username = params.username; - if (params.password !== 'none') proxy.password = params.password; - return proxy; - } - return {patternTest, func} -} - -function getSurgeParams(line) { - const params = {}; - params.name = line.split("=")[0].trim(); - const segments = line.split(","); - params.server = segments[1].trim(); - params.port = segments[2].trim(); - for (let i = 3; i < segments.length; i++) { - const item = segments[i] - if (item.indexOf("=") !== -1) { - const [key, value] = item.split("="); - params[key.trim()] = value.trim(); - } - } - return params; -} - -/**************************** Output Functions ***************************************/ -function QX_Producer() { - const targetPlatform = "QX"; - const output = (proxy) => { - let obfs_opts; - let tls_opts; - switch (proxy.type) { - case 'ss': - obfs_opts = ""; - if (proxy.plugin === 'obfs') { - obfs_opts = `,obfs=${proxy['plugin-opts'].mode},obfs-host=${proxy['plugin-opts'].host}`; - } - if (proxy.plugin === 'v2ray-plugin') { - const {tls, host, path} = proxy['plugin-opts']; - obfs_opts = `,obfs=${tls ? 'wss' : 'ws'},obfs-host=${host}${path ? ',obfs-uri=' + path : ""}`; - } - return `shadowsocks = ${proxy.server}:${proxy.port}, method=${proxy.cipher}, password=${proxy.password}${obfs_opts}${proxy.tfo ? ", fast-open=true" : ", fast-open=false"}${proxy.udp ? ", udp-relay=true" : ", udp-relay=false"}, tag=${proxy.name}` - case 'ssr': - return `shadowsocks=${proxy.server}:${proxy.port},method=${proxy.cipher},password=${proxy.password},ssr-protocol=${proxy.protocol}${proxy['protocol-param'] ? ",ssr-protocol-param=" + proxy['protocol-param'] : ""}${proxy.obfs ? ",obfs=" + proxy.obfs : ""}${proxy['obfs-param'] ? ",obfs-host=" + proxy['obfs-param'] : ""}${proxy.tfo ? ",fast-open=true" : ",fast-open=false"}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"},tag=${proxy.name}` - case 'vmess': - obfs_opts = ""; - if (proxy.network === 'ws') { - // websocket - if (proxy.tls) { - // ws-tls - obfs_opts = `,obfs=wss,obfs-host=${proxy.sni}${proxy['ws-path'] ? ",obfs-uri=" + proxy['ws-path'] : ""},tls-verification=${proxy.scert ? "false" : "true"}`; - } else { - // ws - obfs_opts = `,obfs=ws,obfs-host=${proxy['ws-headers'].Host}${proxy['ws-path'] ? ",obfs-uri=" + proxy['ws-path'] : ""}`; - } - } else { - // tcp - if (proxy.tls) { - obfs_opts = `,obfs=over-tls,obfs-host=${proxy.sni},tls-verification=${proxy.scert ? "false" : "true"}`; - } - } - return `vmess=${proxy.server}:${proxy.port},method=${proxy.cipher},password=${proxy.uuid}${obfs_opts}${proxy.tfo ? ",fast-open=true" : ",fast-open=false"}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"},tag=${proxy.name}` - case 'trojan': - return `trojan=${proxy.server}:${proxy.port},password=${proxy.password},tls-host=${proxy.sni},tls-verification=${proxy.scert ? "false" : "true"}${proxy.tfo ? ",fast-open=true" : ",fast-open=false"}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"},tag=${proxy.name}` - case 'http': - tls_opts = ""; - if (proxy.tls) { - tls_opts = `,over-tls=true,tls-verification=${proxy.scert ? "false" : "true"},tls-host=${proxy.sni}`; - } - return `http=${proxy.server}:${proxy.port},username=${proxy.username},password=${proxy.password}${tls_opts}${proxy.tfo ? ",fast-open=true" : ",fast-open=false"},tag=${proxy.name}`; - } - throw new Error(`Platform ${targetPlatform} does not support proxy type: ${proxy.type}`); - } - return {targetPlatform, output}; -} - -function Loon_Producer() { - const targetPlatform = "Loon"; - const output = (proxy) => { - let obfs_opts, tls_opts; - switch (proxy.type) { - case "ss": - obfs_opts = ",,"; - if (proxy.plugin === 'obfs') { - const {mode, host} = proxy['plugin-opts']; - obfs_opts = `,${mode},${host}` - } - return `${proxy.name}=shadowsocks,${proxy.server},${proxy.port},${proxy.cipher},${proxy.password}${obfs_opts}`; - case "ssr": - return `${proxy.name}=shadowsocksr,${proxy.server},${proxy.port},${proxy.cipher},${proxy.password},${proxy.protocol},{${proxy['protocol-param']}},${proxy.obfs},{${proxy['obfs-param']}}` - case "vmess": - obfs_opts = ""; - if (proxy.network === 'ws') { - const host = proxy['ws-headers'].Host; - obfs_opts = `,transport:ws,host:${host},path:${proxy['ws-path']}`; - } else { - obfs_opts = `,transport:tcp`; - } - if (proxy.tls) { - obfs_opts += `,tls-name=${proxy.sni},skip-cert-verify:${proxy.scert}`; - } - return `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher},over-tls:${proxy.tls}${obfs_opts}`; - case "trojan": - return `${proxy.name}=trojan,${proxy.server},${proxy.port},${proxy.password},tls-name:${proxy.sni},skip-cert-verify:${proxy.scert}`; - case "http": - tls_opts = ""; - const base = `${proxy.name}=${proxy.tls ? 'http' : 'https'},${proxy.server},${proxy.port},${proxy.username || ""},${proxy.password || ""}`; - if (proxy.tls) { - // https - tls_opts = `,skip-cert-verify:${proxy.scert},tls-name:${proxy.sni}`; - return base + tls_opts; - } else return base; - } - throw new Error(`Platform ${targetPlatform} does not support proxy type: ${proxy.type}`); - } - return {targetPlatform, output} -} - -function Surge_Producer() { - const targetPlatform = "Surge"; - const output = (proxy) => { - let obfs_opts, tls_opts; - switch (proxy.type) { - case 'ss': - obfs_opts = ""; - if (proxy.plugin === "obfs") { - obfs_opts = `,obfs=${proxy['plugin-opts'].mode},obfs-host=${proxy['plugin-opts'].host}` - } else { - throw new Error(`Platform ${targetPlatform} does not support obfs option: ${proxy.obfs}`); - } - return `${proxy.name}=ss,${proxy.server},${proxy.port},encrypt-method=${proxy.cipher},password=${proxy.password}${obfs_opts},tfo=${proxy.tfo || 'false'},udp-relay=${proxy.udp || 'false'}`; - case 'vmess': - tls_opts = ""; - let config = `${proxy.name}=vmess,${proxy.server},${proxy.port},username=${proxy.uuid},tls=${proxy.tls},tfo=${proxy.tfo || "false"}`; - if (proxy.network === 'ws') { - const path = proxy['ws-path']; - const host = proxy['ws-headers'].Host; - config += `,ws=true${path ? ',ws-path=' + path : ""}${host ? ',ws-headers=HOST:' + host : ""}`; - } - if (proxy.tls) { - config += `,skip-cert-verify=${proxy.scert},sni=${proxy.sni}`; - } - return config; - case 'trojan': - return `${proxy.name}=trojan,${proxy.server},${proxy.port},password=${proxy.password},sni=${proxy.sni},tfo=${proxy.tfo || 'false'}`; - case 'http': - tls_opts = ",tls=false"; - if (proxy.tls) { - tls_opts = `,tls=true,skip-cert-verify=${proxy.scert},sni=${proxy.sni}`; - } - return `${proxy.name}=http,${proxy.server},${proxy.port}${proxy.username ? ",username=" + proxy.username : ""}${proxy.password ? ",password=" + proxy.password : ""}${tls_opts},tfo=${proxy.tfo || 'false'}`; - } - throw new Error(`Platform ${targetPlatform} does not support proxy type: ${proxy.type}`); - } - return {targetPlatform, output}; -} - -function Raw_Producer() { - const targetPlatform = "Raw"; - const output = (proxy) => { - return JSON.stringify(proxy); - } - return {targetPlatform, output}; -} - -/**************************** Operators ***************************************/ -// force to set some properties (e.g., scert, udp, tfo, etc.) -function SetPropertyOperator(key, val) { - return { - name: "Set Property Operator", - func: proxies => { - return proxies.map(p => { - p[key] = val; - return p; - }) - } - } -} - -// add or remove flag for proxies -function FlagOperator(type) { - return { - name: "Flag Operator", - func: proxies => { - return proxies.map(proxy => { - switch (type) { - case 0: - // no flag - proxy.name = removeFlag(proxy.name); - break - case 1: - // get flag - const newFlag = getFlag(proxy.name); - // remove old flag - proxy.name = removeFlag(proxy.name); - proxy.name = newFlag + " " + proxy.name; - proxy.name = proxy.name.replace(/🇹🇼/g, "🇨🇳"); - break; - default: - throw new Error("Unknown flag type: " + type); - } - return proxy; - }) - } - } -} - -// sort proxies according to their names -function SortOperator(order = 'asc') { - return { - name: "Sort Operator", - func: proxies => { - switch (order) { - case "asc": - case 'desc': - return proxies.sort((a, b) => { - let res = (a.name > b.name) ? 1 : -1; - res *= order === 'desc' ? -1 : 1; - return res - }) - case 'random': - return shuffle(proxies); - default: - throw new Error("Unknown sort option: " + order); - } - } - } -} - -// sort by keywords -function KeywordSortOperator(...keywords) { - return { - name: "Keyword Sort Operator", - func: proxies => proxies.sort((a, b) => { - const oA = getKeywordOrder(keywords, a.name); - const oB = getKeywordOrder(keywords, b.name); - if (oA && !oB) return -1; - if (oB && !oA) return 1; - if (oA && oB) return oA < oB ? -1 : 1; - if ((!oA && !oB) || (oA && oB && oA === oB)) return a.name < b.name ? -1 : 1; // fallback to normal sort - }) - } -} - -function getKeywordOrder(keywords, str) { - let order = null; - for (let i = 0; i < keywords.length; i++) { - if (str.indexOf(keywords[i]) !== -1) { - order = i + 1; // plus 1 is important! 0 will be treated as false!!! - break; - } - } - return order; -} - -// rename by keywords -// keywords: [{old: "old", now: "now"}] -function KeywordRenameOperator(...keywords) { - return { - name: "Keyword Rename Operator", - func: proxies => { - return proxies.map(proxy => { - for (const {old, now} of keywords) { - proxy.name = proxy.name.replace(old, now); - } - return proxy; - }) - } - } -} - -// rename by regex -// keywords: [{expr: "string format regex", now: "now"}] -function RegexRenameOperator(...regex) { - return { - name: "Regex Rename Operator", - func: proxies => { - return proxies.map(proxy => { - for (const {expr, now} of regex) { - proxy.name = proxy.name.replace(new RegExp(expr, "g"), now); - } - return proxy; - }) - } - } -} - -// delete keywords operator -// keywords: ['a', 'b', 'c'] -function KeywordDeleteOperator(...keywords) { - const keywords_ = keywords.map(k => { - return { - old: k, - now: "" - } - }) - return { - name: "Keyword Delete Operator", - func: KeywordRenameOperator(keywords_).func - } -} - -// delete regex operator -// regex: ['a', 'b', 'c'] -function RegexDeleteOperator(...regex) { - const regex_ = regex.map(r => { - return { - expr: r, - now: "" - } - }); - return { - name: "Regex Delete Operator", - func: RegexRenameOperator(regex_).func - } -} - -// use base64 encoded script to rename -/** Example script - function func(proxies) { - // do something - return proxies; - } - - WARNING: - 1. This function name should be `func`! - 2. Always declare variable before using it! - */ -function ScriptOperator(script) { - return { - name: "Script Operator", - func: (proxies) => { - ;(function () { - eval(script); - return func(proxies); - })(); - } - } -} - -/**************************** Filters ***************************************/ -// filter by keywords -function KeywordFilter(...keywords) { - return { - name: "Keyword Filter", - func: (proxies) => { - return proxies.map(proxy => keywords.some(k => proxy.name.indexOf(k) !== -1)); - } - } -} - -function DiscardKeywordFilter(...keywords) { - return { - name: "Discard Keyword Filter", - func: proxies => { - const filter = KeywordFilter(keywords).func; - return NOT(filter(proxies)); - } - } -} - -// filter useless proxies -function UselessFilter() { - const KEYWORDS = ["流量", "时间", "应急", "过期", "Bandwidth", "expire"]; - return { - name: "Useless Filter", - func: DiscardKeywordFilter(KEYWORDS).func - } -} - -// filter by regions -function RegionFilter(...regions) { - const REGION_MAP = { - "HK": "🇭🇰", - "TW": "🇹🇼", - "US": "🇺🇸", - "SG": "🇸🇬", - "JP": "🇯🇵", - "UK": "🇬🇧", - "KR": "🇰🇷" - }; - return { - name: "Region Filter", - func: (proxies) => { - // this would be high memory usage - return proxies.map(proxy => { - const flag = getFlag(proxy.name); - return regions.some(r => REGION_MAP[r] === flag); - }) - } - } -} - -// filter by regex -function RegexFilter(...regex) { - return { - name: "Regex Filter", - func: (proxies) => { - return proxies.map(proxy => regex.some(r => r.test(proxy.name))); - } - } -} - -function DiscardRegexFilter(...regex) { - return { - name: "Discard Regex Filter", - func: proxies => { - const filter = RegexFilter(regex).func; - return NOT(filter(proxies)); - } - } -} - -// filter by proxy types -function TypeFilter(...types) { - return { - name: "Type Filter", - func: (proxies) => { - return proxies.map(proxy => types.some(t => proxy.type === t)); - } - } -} - -// use base64 encoded script to filter proxies -/** Script Example - function func(proxies) { - const selected = FULL(proxies.length, true); - // do something - return selected; - } - WARNING: - 1. This function name should be `func`! - 2. Always declare variable before using it! - */ -function ScriptFilter(script) { - return { - name: "Script Filter", - func: (proxies) => { - !(function () { - eval(script); - return filter(proxies); - })(); - } - } -} - -/******************************** Utility Functions *********************************************/ -// get proxy flag according to its name -function getFlag(name) { - // flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js - const flags = { - "🏳️🌈": ["流量", "时间", "应急", "过期", "Bandwidth", "expire"], - "🇦🇨": ["AC"], - "🇦🇹": ["奥地利", "维也纳"], - "🇦🇺": ["AU", "Australia", "Sydney", "澳大利亚", "澳洲", "墨尔本", "悉尼"], - "🇧🇪": ["BE", "比利时"], - "🇧🇬": ["保加利亚", "Bulgaria"], - "🇧🇷": ["BR", "Brazil", "巴西", "圣保罗"], - "🇨🇦": ["Canada", "Waterloo", "加拿大", "蒙特利尔", "温哥华", "楓葉", "枫叶", "滑铁卢", "多伦多"], - "🇨🇭": ["瑞士", "苏黎世", "Switzerland"], - "🇩🇪": ["DE", "German", "GERMAN", "德国", "德國", "法兰克福"], - "🇩🇰": ["丹麦"], - "🇪🇸": ["ES", "西班牙", "Spain"], - "🇪🇺": ["EU", "欧盟", "欧罗巴"], - "🇫🇮": ["Finland", "芬兰", "赫尔辛基"], - "🇫🇷": ["FR", "France", "法国", "法國", "巴黎"], - "🇬🇧": ["UK", "GB", "England", "United Kingdom", "英国", "伦敦", "英"], - "🇲🇴": ["MO", "Macao", "澳门", "CTM"], - "🇭🇺": ["匈牙利", "Hungary"], - "🇭🇰": ["HK", "Hongkong", "Hong Kong", "香港", "深港", "沪港", "呼港", "HKT", "HKBN", "HGC", "WTT", "CMI", "穗港", "京港", "港"], - "🇮🇩": ["Indonesia", "印尼", "印度尼西亚", "雅加达"], - "🇮🇪": ["Ireland", "爱尔兰", "都柏林"], - "🇮🇳": ["India", "印度", "孟买", "Mumbai"], - "🇰🇵": ["KP", "朝鲜"], - "🇰🇷": ["KR", "Korea", "KOR", "韩国", "首尔", "韩", "韓"], - "🇱🇻": ["Latvia", "Latvija", "拉脱维亚"], - "🇲🇽️": ["MEX", "MX", "墨西哥"], - "🇲🇾": ["MY", "Malaysia", "马来西亚", "吉隆坡"], - "🇳🇱": ["NL", "Netherlands", "荷兰", "荷蘭", "尼德蘭", "阿姆斯特丹"], - "🇵🇭": ["PH", "Philippines", "菲律宾"], - "🇷🇴": ["RO", "罗马尼亚"], - "🇷🇺": ["RU", "Russia", "俄罗斯", "俄羅斯", "伯力", "莫斯科", "圣彼得堡", "西伯利亚", "新西伯利亚", "京俄", "杭俄"], - "🇸🇦": ["沙特", "迪拜"], - "🇸🇪": ["SE", "Sweden"], - "🇸🇬": ["SG", "Singapore", "新加坡", "狮城", "沪新", "京新", "泉新", "穗新", "深新", "杭新", "广新"], - "🇹🇭": ["TH", "Thailand", "泰国", "泰國", "曼谷"], - "🇹🇷": ["TR", "Turkey", "土耳其", "伊斯坦布尔"], - "🇹🇼": ["TW", "Taiwan", "台湾", "台北", "台中", "新北", "彰化", "CHT", "台", "HINET"], - "🇺🇸": ["US", "USA", "America", "United States", "美国", "美", "京美", "波特兰", "达拉斯", "俄勒冈", "凤凰城", "费利蒙", "硅谷", "矽谷", "拉斯维加斯", "洛杉矶", "圣何塞", "圣克拉拉", "西雅图", "芝加哥", "沪美", "哥伦布", "纽约"], - "🇻🇳": ["VN", "越南", "胡志明市"], - "🇮🇹": ["Italy", "IT", "Nachash", "意大利", "米兰", "義大利"], - "🇿🇦": ["South Africa", "南非"], - "🇦🇪": ["United Arab Emirates", "阿联酋"], - "🇯🇵": ["JP", "Japan", "日", "日本", "东京", "大阪", "埼玉", "沪日", "穗日", "川日", "中日", "泉日", "杭日", "深日", "辽日", "广日"], - "🇦🇷": ["AR", "阿根廷"], - "🇳🇴": ["Norway", "挪威", "NO"], - "🇨🇳": ["CN", "China", "回国", "中国", "江苏", "北京", "上海", "广州", "深圳", "杭州", "徐州", "青岛", "宁波", "镇江", "back"] - }; - for (let k of Object.keys(flags)) { - if (flags[k].some((item => name.indexOf(item) !== -1))) { - return k; - } - } - // no flag found - const oldFlag = (name.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/) || [])[0]; - return oldFlag || "🏴☠️"; -} - -// remove flag -function removeFlag(str) { - return str.replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g, "").trim(); -} - -// clone an object -function clone(obj) { - return JSON.parse(JSON.stringify(obj)) -} - -// shuffle array -function shuffle(array) { - let currentIndex = array.length, temporaryValue, randomIndex; - - // While there remain elements to shuffle... - while (0 !== currentIndex) { - - // Pick a remaining element... - randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex -= 1; - - // And swap it with the current element. - temporaryValue = array[currentIndex]; - array[currentIndex] = array[randomIndex]; - array[randomIndex] = temporaryValue; - } - - return array; -} - -// some logical functions for proxy filters -function AND(...args) { - return args.reduce((a, b) => a.map((c, i) => b[i] && c)); -} - -function OR(...args) { - return args.reduce((a, b) => a.map((c, i) => b[i] || c)) -} - -function NOT(array) { - return array.map(c => !c); -} - -function FULL(length, bool) { - return [...Array(length).keys()].map(() => bool); -} - -// UUID -// source: https://stackoverflow.com/questions/105034/how-to-create-guid-uuid -function UUID() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); -} - -// get platform form UA -function getPlatformFromHeaders(headers) { - const keys = Object.keys(headers); - let UA = ""; - for (let k of keys) { - if (k.match(/USER-AGENT/i)) { - UA = headers[k]; - break; - } - } - if (UA.indexOf("Quantumult%20X") !== -1) { - return "QX"; - } else if (UA.indexOf("Surge") !== -1) { - return "Surge"; - } else if (UA.indexOf("Decar") !== -1) { - return "Loon"; - } else { - // browser - return FALL_BACK_TARGET; - } -} - -/*********************************** OpenAPI *************************************/ -// OpenAPI -// prettier-ignore -function ENV() { - const isQX = typeof $task != "undefined"; - const isLoon = typeof $loon != "undefined"; - const isSurge = typeof $httpClient != "undefined" && !this.isLoon; - const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; - const isNode = typeof require == "function" && !isJSBox; - const isRequest = typeof $request !== "undefined"; - return {isQX, isLoon, isSurge, isNode, isJSBox, isRequest}; -} - -function HTTP(baseURL, defaultOptions = {}) { - const {isQX, isLoon, isSurge} = ENV(); - const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; - - function send(method, options) { - options = typeof options === "string" ? {url: options} : options; - options.url = baseURL ? baseURL + options.url : options.url; - options = {...defaultOptions, ...options}; - const timeout = options.timeout; - const events = { - ...{ - onRequest: () => { - }, - onResponse: (resp) => resp, - onTimeout: () => { - }, - }, - ...options.events, - }; - - events.onRequest(method, options); - - let worker; - if (isQX) { - worker = $task.fetch({method, ...options}); - } else { - worker = new Promise((resolve, reject) => { - const request = isSurge || isLoon ? $httpClient : require("request"); - request[method.toLowerCase()](options, (err, response, body) => { - if (err) reject(err); - else - resolve({ - statusCode: response.status || response.statusCode, - headers: response.headers, - body, - }); - }); - }); - } - - let timeoutid; - const timer = timeout - ? new Promise((_, reject) => { - timeoutid = setTimeout(() => { - events.onTimeout(); - return reject( - `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` - ); - }, timeout); - }) - : null; - - return (timer - ? Promise.race([timer, worker]).then((res) => { - clearTimeout(timeoutid); - return res; - }) - : worker - ) - .then((resp) => events.onResponse(resp)) - } - - const http = {}; - methods.forEach( - (method) => - (http[method.toLowerCase()] = (options) => send(method, options)) - ); - return http; -} - -function API(name = "untitled", debug = false) { - const {isQX, isLoon, isSurge, isNode, isJSBox} = ENV(); - return new (class { - constructor(name, debug) { - this.name = name; - this.debug = debug; - - this.http = HTTP(); - this.env = ENV(); - - this.node = (() => { - if (isNode) { - const fs = require("fs"); - - return { - fs, - }; - } else { - return null; - } - })(); - this.initCache(); - - const delay = (t, v) => - new Promise(function (resolve) { - setTimeout(resolve.bind(null, v), t); - }); - - Promise.prototype.delay = function (t) { - return this.then(function (v) { - return delay(t, v); - }); - }; - } - - // persistance - - // initialize cache - initCache() { - if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); - if (isLoon || isSurge) - this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); - - if (isNode) { - // create a json for root cache - let fpath = "root.json"; - if (!this.node.fs.existsSync(fpath)) { - this.node.fs.writeFileSync( - fpath, - JSON.stringify({}), - {flag: "wx"}, - (err) => console.log(err) - ); - } - this.root = {}; - - // create a json file with the given name if not exists - fpath = `${this.name}.json`; - if (!this.node.fs.existsSync(fpath)) { - this.node.fs.writeFileSync( - fpath, - JSON.stringify({}), - {flag: "wx"}, - (err) => console.log(err) - ); - this.cache = {}; - } else { - this.cache = JSON.parse( - this.node.fs.readFileSync(`${this.name}.json`) - ); - } - } - } - - // store cache - persistCache() { - const data = JSON.stringify(this.cache); - if (isQX) $prefs.setValueForKey(data, this.name); - if (isLoon || isSurge) $persistentStore.write(data, this.name); - if (isNode) { - this.node.fs.writeFileSync( - `${this.name}.json`, - data, - {flag: "w"}, - (err) => console.log(err) - ); - this.node.fs.writeFileSync( - "root.json", - JSON.stringify(this.root), - {flag: "w"}, - (err) => console.log(err) - ); - } - } - - write(data, key) { - this.log(`SET ${key}`); - if (key.indexOf("#") !== -1) { - key = key.substr(1); - if (isSurge & isLoon) { - $persistentStore.write(data, key); - } - if (isQX) { - $prefs.setValueForKey(data, key); - } - if (isNode) { - this.root[key] = data; - } - } else { - this.cache[key] = data; - } - this.persistCache(); - } - - read(key) { - this.log(`READ ${key}`); - if (key.indexOf("#") !== -1) { - key = key.substr(1); - if (isSurge & isLoon) { - return $persistentStore.read(key); - } - if (isQX) { - return $prefs.valueForKey(key); - } - if (isNode) { - return this.root[key]; - } - } else { - return this.cache[key]; - } - } - - delete(key) { - this.log(`DELETE ${key}`); - if (key.indexOf("#") !== -1) { - key = key.substr(1); - if (isSurge & isLoon) { - $persistentStore.write(null, key); - } - if (isQX) { - $prefs.removeValueForKey(key); - } - if (isNode) { - delete this.root[key]; - } - } else { - delete this.cache[key]; - } - this.persistCache(); - } - - // notification - notify(title, subtitle = "", content = "", options = {}) { - const openURL = options["open-url"]; - const mediaURL = options["media-url"]; - - const content_ = - content + - (openURL ? `\n点击跳转: ${openURL}` : "") + - (mediaURL ? `\n多媒体: ${mediaURL}` : ""); - - if (isQX) $notify(title, subtitle, content, options); - if (isSurge) $notification.post(title, subtitle, content_); - if (isLoon) $notification.post(title, subtitle, content, openURL); - if (isNode) { - if (isJSBox) { - const push = require("push"); - push.schedule({ - title: title, - body: (subtitle ? subtitle + "\n" : "") + content_, - }); - } else { - console.log(`${title}\n${subtitle}\n${content_}\n\n`); - } - } - } - - // other helper functions - log(msg) { - if (this.debug) console.log(msg); - } - - info(msg) { - console.log(msg); - } - - error(msg) { - console.log("ERROR: " + msg); - } - - wait(millisec) { - return new Promise((resolve) => setTimeout(resolve, millisec)); - } - - done(value = {}) { - if (isQX || isLoon || isSurge) { - $done(value); - } else if (isNode && !isJSBox) { - if (typeof $context !== "undefined") { - $context.headers = value.headers; - $context.statusCode = value.statusCode; - $context.body = value.body; - } - } - } - })(name, debug); -} - -/*********************************** Mini Express *************************************/ -function express(port = 3000) { - const {isNode} = ENV(); - - // node support - if (isNode) { - const express_ = require("express"); - const bodyParser = require("body-parser"); - const app = express_(); - app.use(bodyParser.json({verify: rawBodySaver})); - app.use(bodyParser.urlencoded({verify: rawBodySaver, extended: true})); - app.use(bodyParser.raw({verify: rawBodySaver, type: '*/*'})); - - // adapter - app.start = () => { - app.listen(port, () => { - console.log(`Express started on port: ${port}`); - }) - } - return app; - } - - // route handlers - const handlers = []; - - // http methods - const METHODS_NAMES = [ - "GET", - "POST", - "PUT", - "DELETE", - "PATCH", - "OPTIONS", - "HEAD'", - "ALL", - ]; - - // dispatch url to route - const dispatch = (request, start = 0) => { - let {method, url, headers, body} = request; - method = method.toUpperCase(); - const {path, query} = extractURL(url); - let handler = null; - let i; - - for (i = start; i < handlers.length; i++) { - if (handlers[i].method === "ALL" || method === handlers[i].method) { - const {pattern} = handlers[i]; - if (patternMatched(pattern, path)) { - handler = handlers[i]; - break; - } - } - } - if (handler) { - // dispatch to next handler - const next = () => { - dispatch(method, url, i); - }; - const req = { - method, url, path, query, - params: extractPathParams(handler.pattern, path), - headers, body - }; - const res = Response(); - handler.callback(req, res, next).catch(err => { - res.status(500).json({ - status: "failed", - message: err - }); - }); - } else { - // no route, return 404 - const res = Response(); - res.status("404").json({ - status: "failed", - message: "ERROR: 404 not found" - }); - } - }; - - const app = {}; - - // attach http methods - METHODS_NAMES.forEach((method) => { - app[method.toLowerCase()] = (pattern, callback) => { - // add handler - handlers.push({method, pattern, callback}); - }; - }); - - // chainable route - app.route = (pattern) => { - const chainApp = {}; - METHODS_NAMES.forEach((method) => { - chainApp[method.toLowerCase()] = (callback) => { - // add handler - handlers.push({method, pattern, callback}); - return chainApp; - }; - }); - return chainApp; - }; - - // start service - app.start = () => { - dispatch($request); - }; - - return app; - - /************************************************ - Utility Functions - *************************************************/ - function rawBodySaver(req, res, buf, encoding) { - if (buf && buf.length) { - req.rawBody = buf.toString(encoding || 'utf8'); - } - } - - function Response() { - let statusCode = "200"; - const {isQX, isLoon, isSurge} = ENV(); - const headers = { - "Content-Type": "text/plain;charset=UTF-8", - }; - return new (class { - status(code) { - statusCode = code; - return this; - } - - send(body = "") { - const response = { - status: statusCode, - body, - headers, - }; - if (isQX) { - $done(...response); - } else if (isLoon || isSurge) { - $done({ - response, - }); - } - } - - end() { - this.send(); - } - - html(data) { - this.set("Content-Type", "text/html;charset=UTF-8"); - this.send(data); - } - - json(data) { - this.set("Content-Type", "application/json;charset=UTF-8"); - this.send(JSON.stringify(data)); - } - - set(key, val) { - headers[key] = val; - return this; - } - })(); - } - - function patternMatched(pattern, path) { - if (pattern instanceof RegExp && pattern.test(path)) { - return true; - } else { - // root pattern, match all - if (pattern === "/") return true; - // normal string pattern - if (pattern.indexOf(":") === -1) { - const spath = path.split("/"); - const spattern = pattern.split("/"); - for (let i = 0; i < spattern.length; i++) { - if (spath[i] !== spattern[i]) { - return false; - } - } - return true; - } - // string pattern with path parameters - else if (extractPathParams(pattern, path)) { - return true; - } - } - return false; - } - - function extractURL(url) { - // extract path - const match = url.match(/https?:\/\/[^\/]+(\/[^?]*)/) || []; - const path = match[1] || "/"; - - // extract query string - const split = url.indexOf("?"); - const query = {}; - if (split !== -1) { - let hashes = url.slice(url.indexOf("?") + 1).split("&"); - for (let i = 0; i < hashes.length; i++) { - hash = hashes[i].split("="); - query[hash[0]] = hash[1]; - } - } - return { - path, - query, - }; - } - - function extractPathParams(pattern, path) { - if (pattern.indexOf(":") === -1) { - return null; - } else { - const params = {}; - for (let i = 0, j = 0; i < pattern.length; i++, j++) { - if (pattern[i] === ":") { - let key = []; - let val = []; - while (pattern[++i] !== "/" && i < pattern.length) { - key.push(pattern[i]); - } - while (path[j] !== "/" && j < path.length) { - val.push(path[j++]); - } - params[key.join("")] = val.join(""); - } else { - if (pattern[i] !== path[j]) { - return null; - } - } - } - return params; - } - } -} - -/******************************** Base 64 *********************************************/ -// Base64 Coding Library -// https://github.com/dankogai/js-base64#readme -// Under BSD License -function Base64Code() { - // constants - const b64chars - = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - const b64tab = function (bin) { - const t = {}; - let i = 0; - const l = bin.length; - for (; i < l; i++) t[bin.charAt(i)] = i; - return t; - }(b64chars); - const fromCharCode = String.fromCharCode; - // encoder stuff - const cb_utob = function (c) { - let cc; - if (c.length < 2) { - cc = c.charCodeAt(0); - return cc < 0x80 ? c - : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) - + fromCharCode(0x80 | (cc & 0x3f))) - : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) - + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) - + fromCharCode(0x80 | (cc & 0x3f))); - } else { - cc = 0x10000 - + (c.charCodeAt(0) - 0xD800) * 0x400 - + (c.charCodeAt(1) - 0xDC00); - return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) - + fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) - + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) - + fromCharCode(0x80 | (cc & 0x3f))); - } - }; - const re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; - const utob = function (u) { - return u.replace(re_utob, cb_utob); - }; - const cb_encode = function (ccc) { - const padlen = [0, 2, 1][ccc.length % 3], - ord = ccc.charCodeAt(0) << 16 - | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) - | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), - chars = [ - b64chars.charAt(ord >>> 18), - b64chars.charAt((ord >>> 12) & 63), - padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), - padlen >= 1 ? '=' : b64chars.charAt(ord & 63) - ]; - return chars.join(''); - }; - const btoa = function (b) { - return b.replace(/[\s\S]{1,3}/g, cb_encode); - }; - this.encode = function (u) { - const isUint8Array = Object.prototype.toString.call(u) === '[object Uint8Array]'; - return isUint8Array ? u.toString('base64') - : btoa(utob(String(u))); - } - const uriencode = function (u, urisafe) { - return !urisafe - ? _encode(u) - : _encode(String(u)).replace(/[+\/]/g, function (m0) { - return m0 === '+' ? '-' : '_'; - }).replace(/=/g, ''); - }; - const encodeURI = function (u) { - return uriencode(u, true) - }; - // decoder stuff - const re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; - const cb_btou = function (cccc) { - switch (cccc.length) { - case 4: - const cp = ((0x07 & cccc.charCodeAt(0)) << 18) - | ((0x3f & cccc.charCodeAt(1)) << 12) - | ((0x3f & cccc.charCodeAt(2)) << 6) - | (0x3f & cccc.charCodeAt(3)), - offset = cp - 0x10000; - return (fromCharCode((offset >>> 10) + 0xD800) - + fromCharCode((offset & 0x3FF) + 0xDC00)); - case 3: - return fromCharCode( - ((0x0f & cccc.charCodeAt(0)) << 12) - | ((0x3f & cccc.charCodeAt(1)) << 6) - | (0x3f & cccc.charCodeAt(2)) - ); - default: - return fromCharCode( - ((0x1f & cccc.charCodeAt(0)) << 6) - | (0x3f & cccc.charCodeAt(1)) - ); - } - }; - const btou = function (b) { - return b.replace(re_btou, cb_btou); - }; - const cb_decode = function (cccc) { - const len = cccc.length, - padlen = len % 4, - n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) - | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) - | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) - | (len > 3 ? b64tab[cccc.charAt(3)] : 0), - chars = [ - fromCharCode(n >>> 16), - fromCharCode((n >>> 8) & 0xff), - fromCharCode(n & 0xff) - ]; - chars.length -= [0, 0, 2, 1][padlen]; - return chars.join(''); - }; - const _atob = function (a) { - return a.replace(/\S{1,4}/g, cb_decode); - }; - const atob = function (a) { - return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g, '')); - }; - const _decode = function (u) { - return btou(_atob(u)) - }; - this.decode = function (a) { - return _decode( - String(a).replace(/[-_]/g, function (m0) { - return m0 === '-' ? '+' : '/' - }) - .replace(/[^A-Za-z0-9\+\/]/g, '') - ).replace(/>/g, ">").replace(/</g, "<"); - }; - this.safeEncode = function (a) { - return this.encode(a.replace(/\+/g, "-").replace(/\//g, "_")); - } - this.safeDecode = function (a) { - return this.decode(a.replace(/-/g, "+").replace(/_/g, "/")); - } -} \ No newline at end of file diff --git a/collection.json b/collection.json deleted file mode 100644 index 2c32851c7..000000000 --- a/collection.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "Surge", - "subscriptions": ["AAEX", "Nexitally"] -} \ No newline at end of file diff --git a/config/Loon.plugin b/config/Loon.plugin new file mode 100644 index 000000000..7f589f9c3 --- /dev/null +++ b/config/Loon.plugin @@ -0,0 +1,19 @@ +#!name=Sub-Store +#!desc=高级订阅管理工具 +#!openUrl=https://sub.store +#!author=Peng-YM +#!homepage=https://github.com/sub-store-org/Sub-Store +#!icon=https://raw.githubusercontent.com/58xinian/icon/master/Sub-Store1.png +#!select = 节点缓存有效期,1分钟,5分钟,10分钟,30分钟,1小时,2小时,3小时,6小时,12小时,24小时,48小时,72小时,参数传入 + +[Rule] +DOMAIN,sub-store.vercel.app,PROXY + +[MITM] +hostname=sub.store + +[Script] +http-request ^https?:\/\/sub\.store\/((download)|api\/(preview|sync|(utils\/node-info))) script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-1.min.js, requires-body=true, timeout=120, tag=Sub-Store Core +http-request ^https?:\/\/sub\.store script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-0.min.js, requires-body=true, timeout=120, tag=Sub-Store Simple + +cron "0 0 * * *" script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/cron-sync-artifacts.min.js, tag=Sub-Store Sync \ No newline at end of file diff --git a/config/QX-Task.json b/config/QX-Task.json new file mode 100644 index 000000000..392dbda04 --- /dev/null +++ b/config/QX-Task.json @@ -0,0 +1,7 @@ +{ + "name":"Sub-Store", + "description":"", + "task":[ + "0 0 * * * https://github.com/sub-store-org/Sub-Store/releases/latest/download/cron-sync-artifacts.min.js, tag=Sub-Store Sync, img-url=https://raw.githubusercontent.com/58xinian/icon/master/Sub-Store1.png" + ] +} diff --git a/config/QX.snippet b/config/QX.snippet new file mode 100644 index 000000000..ca654339f --- /dev/null +++ b/config/QX.snippet @@ -0,0 +1,4 @@ +hostname=sub.store + +^https?:\/\/sub\.store\/((download)|api\/(preview|sync|(utils\/node-info))) url script-analyze-echo-response https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-1.min.js +^https?:\/\/sub\.store url script-analyze-echo-response https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-0.min.js \ No newline at end of file diff --git a/config/README.md b/config/README.md new file mode 100644 index 000000000..46520d53d --- /dev/null +++ b/config/README.md @@ -0,0 +1,36 @@ +# Sub-Store 配置指南 + +## 查看更新说明: + +Sub-Store Releases: [`https://github.com/sub-store-org/Sub-Store/releases`](https://github.com/sub-store-org/Sub-Store/releases) + +Telegram 频道: [`https://t.me/cool_scripts` ](https://t.me/cool_scripts) + +## 脚本配置: + +### 1. Loon +安装使用 插件 [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Loon.plugin`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Loon.plugin) 即可。 + +### 2. Surge +1. 官方默认版模块(目前不带 ability 参数, 不保证以后不会改动): [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge.sgmodule`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge.sgmodule) + +2. 固定带 ability 参数版本,可能会爆内存, 如果需要使用指定节点功能 例如[加国旗脚本或者cname脚本] 请使用此带 ability 参数版本: [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge-ability.sgmodule`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge-ability.sgmodule) + +3. 固定不带 ability 参数版本: [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge-Noability.sgmodule`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge-Noability.sgmodule) + + +### 3. QX +订阅 重写 [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/QX.snippet`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/QX.snippet) 即可。 + +定时任务: [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/QX-Task.json`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/QX-Task.json) + +### 4. Stash +安装使用 覆写 [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Stash.stoverride`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Stash.stoverride) 即可。 + +### 5. Shadowrocket +安装使用 模块 [`https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge.sgmodule`](https://raw.githubusercontent.com/sub-store-org/Sub-Store/master/config/Surge.sgmodule) 即可。 + +## 使用 Sub-Store +1. 使用 Safari 打开这个 https://sub.store 如网页正常打开并且未弹出任何错误提示,说明 Sub-Store 已经配置成功。 +2. 可以把 Sub-Store 添加到主屏幕,即可获得类似于 APP 的使用体验。 +3. 更详细的使用指南请参考[文档](https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46)。 diff --git a/config/Stash.stoverride b/config/Stash.stoverride new file mode 100644 index 000000000..c667bc30f --- /dev/null +++ b/config/Stash.stoverride @@ -0,0 +1,36 @@ +name: Sub-Store +desc: 高级订阅管理工具 @Peng-YM + +http: + mitm: + - sub.store + script: + - match: ^https?:\/\/sub\.store\/((download)|api\/(preview|sync|(utils\/node-info))) + name: sub-store-1 + type: request + require-body: true + timeout: 120 + - match: ^https?:\/\/sub\.store + name: sub-store-0 + type: request + require-body: true + timeout: 120 + +cron: + script: + - name: cron-sync-artifacts + cron: "0 0 * * *" + timeout: 120 + +script-providers: + sub-store-0: + url: https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-0.min.js + interval: 86400 + + sub-store-1: + url: https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-1.min.js + interval: 86400 + + cron-sync-artifacts: + url: https://github.com/sub-store-org/Sub-Store/releases/latest/download/cron-sync-artifacts.min.js + interval: 86400 \ No newline at end of file diff --git a/config/Surge-Noability.sgmodule b/config/Surge-Noability.sgmodule new file mode 100644 index 000000000..b2816b310 --- /dev/null +++ b/config/Surge-Noability.sgmodule @@ -0,0 +1,12 @@ +#!name=Sub-Store +#!desc=高级订阅管理工具 @Peng-YM 无 ability 参数版本,不会爆内存, 如果需要使用指定节点功能 例如[加国旗脚本或者cname脚本] 可以用带 ability 参数 + +[MITM] +hostname = %APPEND% sub.store + +[Script] +# 主程序 已经去掉 Sub-Store Core 的参数 [,ability=http-client-policy] 不会爆内存,这个参数在 Surge 非常占用内存; 如果不需要使用指定节点功能 例如[加国旗脚本或者cname脚本] 则可以使用此脚本 +Sub-Store Core=type=http-request,pattern=^https?:\/\/sub\.store\/((download)|api\/(preview|sync|(utils\/node-info))),script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-1.min.js,requires-body=true,timeout=120 +Sub-Store Simple=type=http-request,pattern=^https?:\/\/sub\.store,script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-0.min.js,requires-body=true + +Sub-Store Sync=type=cron,cronexp=0 0 * * *,wake-system=1,timeout=120,script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/cron-sync-artifacts.min.js diff --git a/config/Surge-ability.sgmodule b/config/Surge-ability.sgmodule new file mode 100644 index 000000000..4d27c8af4 --- /dev/null +++ b/config/Surge-ability.sgmodule @@ -0,0 +1,11 @@ +#!name=Sub-Store +#!desc=高级订阅管理工具 @Peng-YM 带 ability 参数版本, 可能会爆内存, 如果不需要使用指定节点功能 例如[加国旗脚本或者cname脚本] 可以用不带 ability 参数版本 + +[MITM] +hostname = %APPEND% sub.store + +[Script] +Sub-Store Core=type=http-request,pattern=^https?:\/\/sub\.store\/((download)|api\/(preview|sync|(utils\/node-info))),script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-1.min.js,requires-body=true,timeout=120,ability=http-client-policy +Sub-Store Simple=type=http-request,pattern=^https?:\/\/sub\.store,script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-0.min.js,requires-body=true + +Sub-Store Sync=type=cron,cronexp=0 0 * * *,wake-system=1,timeout=120,script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/cron-sync-artifacts.min.js diff --git a/config/Surge.sgmodule b/config/Surge.sgmodule new file mode 100644 index 000000000..06e2f047c --- /dev/null +++ b/config/Surge.sgmodule @@ -0,0 +1,11 @@ +#!name=Sub-Store +#!desc=高级订阅管理工具 @Peng-YM 无 ability 参数版本,不会爆内存, 如果需要使用指定节点功能 例如[加国旗脚本或者cname脚本] 可以用带 ability 参数 + +[MITM] +hostname = %APPEND% sub.store + +[Script] +Sub-Store Core=type=http-request,pattern=^https?:\/\/sub\.store\/((download)|api\/(preview|sync|(utils\/node-info))),script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-1.min.js,requires-body=true,timeout=120 +Sub-Store Simple=type=http-request,pattern=^https?:\/\/sub\.store,script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store-0.min.js,requires-body=true + +Sub-Store Sync=type=cron,cronexp=0 0 * * *,wake-system=1,timeout=120,script-path=https://github.com/sub-store-org/Sub-Store/releases/latest/download/cron-sync-artifacts.min.js diff --git a/nginx/front.conf b/nginx/front.conf new file mode 100644 index 000000000..7f37b5356 --- /dev/null +++ b/nginx/front.conf @@ -0,0 +1,40 @@ +upstream api { + server 0.0.0.0:3000; +} + +server { + listen 6080; +# allow 127.0.0.1; +# allow 0.0.0.0; +# deny all; + + gzip on; + gzip_static on; + gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript; + gzip_proxied any; + gzip_vary on; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.0; + + location / { + root /Sub-Store/web/dist; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://api; + } + + location /download { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://api; + } + +} \ No newline at end of file diff --git a/scripts/fancy-characters.js b/scripts/fancy-characters.js new file mode 100644 index 000000000..3e8a8386d --- /dev/null +++ b/scripts/fancy-characters.js @@ -0,0 +1,56 @@ +/** + * 节点名改为花里胡哨字体,仅支持英文字符和数字 + * + * 【字体】 + * 可参考:https://www.dute.org/weird-fonts + * serif-bold, serif-italic, serif-bold-italic, sans-serif-regular, sans-serif-bold-italic, script-regular, script-bold, fraktur-regular, fraktur-bold, monospace-regular, double-struck-bold, circle-regular, square-regular + * + * 【示例】 + * 1️⃣ 设置所有格式为 "serif-bold" + * #type=serif-bold + * + * 2️⃣ 设置字母格式为 "serif-bold",数字格式为 "circle-regular" + * #type=serif-bold&num=circle-regular + */ + +function operator(proxies) { + const { type, num } = $arguments; + const TABLE = { + "serif-bold": ["𝟎","𝟏","𝟐","𝟑","𝟒","𝟓","𝟔","𝟕","𝟖","𝟗","𝐚","𝐛","𝐜","𝐝","𝐞","𝐟","𝐠","𝐡","𝐢","𝐣","𝐤","𝐥","𝐦","𝐧","𝐨","𝐩","𝐪","𝐫","𝐬","𝐭","𝐮","𝐯","𝐰","𝐱","𝐲","𝐳","𝐀","𝐁","𝐂","𝐃","𝐄","𝐅","𝐆","𝐇","𝐈","𝐉","𝐊","𝐋","𝐌","𝐍","𝐎","𝐏","𝐐","𝐑","𝐒","𝐓","𝐔","𝐕","𝐖","𝐗","𝐘","𝐙"] , + "serif-italic": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "𝑎", "𝑏", "𝑐", "𝑑", "𝑒", "𝑓", "𝑔", "ℎ", "𝑖", "𝑗", "𝑘", "𝑙", "𝑚", "𝑛", "𝑜", "𝑝", "𝑞", "𝑟", "𝑠", "𝑡", "𝑢", "𝑣", "𝑤", "𝑥", "𝑦", "𝑧", "𝐴", "𝐵", "𝐶", "𝐷", "𝐸", "𝐹", "𝐺", "𝐻", "𝐼", "𝐽", "𝐾", "𝐿", "𝑀", "𝑁", "𝑂", "𝑃", "𝑄", "𝑅", "𝑆", "𝑇", "𝑈", "𝑉", "𝑊", "𝑋", "𝑌", "𝑍"], + "serif-bold-italic": ["0","1","2","3","4","5","6","7","8","9","𝒂","𝒃","𝒄","𝒅","𝒆","𝒇","𝒈","𝒉","𝒊","𝒋","𝒌","𝒍","𝒎","𝒏","𝒐","𝒑","𝒒","𝒓","𝒔","𝒕","𝒖","𝒗","𝒘","𝒙","𝒚","𝒛","𝑨","𝑩","𝑪","𝑫","𝑬","𝑭","𝑮","𝑯","𝑰","𝑱","𝑲","𝑳","𝑴","𝑵","𝑶","𝑷","𝑸","𝑹","𝑺","𝑻","𝑼","𝑽","𝑾","𝑿","𝒀","𝒁"], + "sans-serif-regular": ["𝟢", "𝟣", "𝟤", "𝟥", "𝟦", "𝟧", "𝟨", "𝟩", "𝟪", "𝟫", "𝖺", "𝖻", "𝖼", "𝖽", "𝖾", "𝖿", "𝗀", "𝗁", "𝗂", "𝗃", "𝗄", "𝗅", "𝗆", "𝗇", "𝗈", "𝗉", "𝗊", "𝗋", "𝗌", "𝗍", "𝗎", "𝗏", "𝗐", "𝗑", "𝗒", "𝗓", "𝖠", "𝖡", "𝖢", "𝖣", "𝖤", "𝖥", "𝖦", "𝖧", "𝖨", "𝖩", "𝖪", "𝖫", "𝖬", "𝖭", "𝖮", "𝖯", "𝖰", "𝖱", "𝖲", "𝖳", "𝖴", "𝖵", "𝖶", "𝖷", "𝖸", "𝖹"], + "sans-serif-bold": ["𝟬","𝟭","𝟮","𝟯","𝟰","𝟱","𝟲","𝟳","𝟴","𝟵","𝗮","𝗯","𝗰","𝗱","𝗲","𝗳","𝗴","𝗵","𝗶","𝗷","𝗸","𝗹","𝗺","𝗻","𝗼","𝗽","𝗾","𝗿","𝘀","𝘁","𝘂","𝘃","𝘄","𝘅","𝘆","𝘇","𝗔","𝗕","𝗖","𝗗","𝗘","𝗙","𝗚","𝗛","𝗜","𝗝","𝗞","𝗟","𝗠","𝗡","𝗢","𝗣","𝗤","𝗥","𝗦","𝗧","𝗨","𝗩","𝗪","𝗫","𝗬","𝗭"], + "sans-serif-italic": ["0","1","2","3","4","5","6","7","8","9","𝘢","𝘣","𝘤","𝘥","𝘦","𝘧","𝘨","𝘩","𝘪","𝘫","𝘬","𝘭","𝘮","𝘯","𝘰","𝘱","𝘲","𝘳","𝘴","𝘵","𝘶","𝘷","𝘸","𝘹","𝘺","𝘻","𝘈","𝘉","𝘊","𝘋","𝘌","𝘍","𝘎","𝘏","𝘐","𝘑","𝘒","𝘓","𝘔","𝘕","𝘖","𝘗","𝘘","𝘙","𝘚","𝘛","𝘜","𝘝","𝘞","𝘟","𝘠","𝘡"], + "sans-serif-bold-italic": ["0","1","2","3","4","5","6","7","8","9","𝙖","𝙗","𝙘","𝙙","𝙚","𝙛","𝙜","𝙝","𝙞","𝙟","𝙠","𝙡","𝙢","𝙣","𝙤","𝙥","𝙦","𝙧","𝙨","𝙩","𝙪","𝙫","𝙬","𝙭","𝙮","𝙯","𝘼","𝘽","𝘾","𝘿","𝙀","𝙁","𝙂","𝙃","𝙄","𝙅","𝙆","𝙇","𝙈","𝙉","𝙊","𝙋","𝙌","𝙍","𝙎","𝙏","𝙐","𝙑","𝙒","𝙓","𝙔","𝙕"], + "script-regular": ["0","1","2","3","4","5","6","7","8","9","𝒶","𝒷","𝒸","𝒹","ℯ","𝒻","ℊ","𝒽","𝒾","𝒿","𝓀","𝓁","𝓂","𝓃","ℴ","𝓅","𝓆","𝓇","𝓈","𝓉","𝓊","𝓋","𝓌","𝓍","𝓎","𝓏","𝒜","ℬ","𝒞","𝒟","ℰ","ℱ","𝒢","ℋ","ℐ","𝒥","𝒦","ℒ","ℳ","𝒩","𝒪","𝒫","𝒬","ℛ","𝒮","𝒯","𝒰","𝒱","𝒲","𝒳","𝒴","𝒵"], + "script-bold": ["0","1","2","3","4","5","6","7","8","9","𝓪","𝓫","𝓬","𝓭","𝓮","𝓯","𝓰","𝓱","𝓲","𝓳","𝓴","𝓵","𝓶","𝓷","𝓸","𝓹","𝓺","𝓻","𝓼","𝓽","𝓾","𝓿","𝔀","𝔁","𝔂","𝔃","𝓐","𝓑","𝓒","𝓓","𝓔","𝓕","𝓖","𝓗","𝓘","𝓙","𝓚","𝓛","𝓜","𝓝","𝓞","𝓟","𝓠","𝓡","𝓢","𝓣","𝓤","𝓥","𝓦","𝓧","𝓨","𝓩"], + "fraktur-regular": ["0","1","2","3","4","5","6","7","8","9","𝔞","𝔟","𝔠","𝔡","𝔢","𝔣","𝔤","𝔥","𝔦","𝔧","𝔨","𝔩","𝔪","𝔫","𝔬","𝔭","𝔮","𝔯","𝔰","𝔱","𝔲","𝔳","𝔴","𝔵","𝔶","𝔷","𝔄","𝔅","ℭ","𝔇","𝔈","𝔉","𝔊","ℌ","ℑ","𝔍","𝔎","𝔏","𝔐","𝔑","𝔒","𝔓","𝔔","ℜ","𝔖","𝔗","𝔘","𝔙","𝔚","𝔛","𝔜","ℨ"], + "fraktur-bold": ["0","1","2","3","4","5","6","7","8","9","𝖆","𝖇","𝖈","𝖉","𝖊","𝖋","𝖌","𝖍","𝖎","𝖏","𝖐","𝖑","𝖒","𝖓","𝖔","𝖕","𝖖","𝖗","𝖘","𝖙","𝖚","𝖛","𝖜","𝖝","𝖞","𝖟","𝕬","𝕭","𝕮","𝕯","𝕰","𝕱","𝕲","𝕳","𝕴","𝕵","𝕶","𝕷","𝕸","𝕹","𝕺","𝕻","𝕼","𝕽","𝕾","𝕿","𝖀","𝖁","𝖂","𝖃","𝖄","𝖅"], + "monospace-regular": ["𝟶","𝟷","𝟸","𝟹","𝟺","𝟻","𝟼","𝟽","𝟾","𝟿","𝚊","𝚋","𝚌","𝚍","𝚎","𝚏","𝚐","𝚑","𝚒","𝚓","𝚔","𝚕","𝚖","𝚗","𝚘","𝚙","𝚚","𝚛","𝚜","𝚝","𝚞","𝚟","𝚠","𝚡","𝚢","𝚣","𝙰","𝙱","𝙲","𝙳","𝙴","𝙵","𝙶","𝙷","𝙸","𝙹","𝙺","𝙻","𝙼","𝙽","𝙾","𝙿","𝚀","𝚁","𝚂","𝚃","𝚄","𝚅","𝚆","𝚇","𝚈","𝚉"], + "double-struck-bold": ["𝟘","𝟙","𝟚","𝟛","𝟜","𝟝","𝟞","𝟟","𝟠","𝟡","𝕒","𝕓","𝕔","𝕕","𝕖","𝕗","𝕘","𝕙","𝕚","𝕛","𝕜","𝕝","𝕞","𝕟","𝕠","𝕡","𝕢","𝕣","𝕤","𝕥","𝕦","𝕧","𝕨","𝕩","𝕪","𝕫","𝔸","𝔹","ℂ","𝔻","𝔼","𝔽","𝔾","ℍ","𝕀","𝕁","𝕂","𝕃","𝕄","ℕ","𝕆","ℙ","ℚ","ℝ","𝕊","𝕋","𝕌","𝕍","𝕎","𝕏","𝕐","ℤ"], + "circle-regular": ["⓪","①","②","③","④","⑤","⑥","⑦","⑧","⑨","ⓐ","ⓑ","ⓒ","ⓓ","ⓔ","ⓕ","ⓖ","ⓗ","ⓘ","ⓙ","ⓚ","ⓛ","ⓜ","ⓝ","ⓞ","ⓟ","ⓠ","ⓡ","ⓢ","ⓣ","ⓤ","ⓥ","ⓦ","ⓧ","ⓨ","ⓩ","Ⓐ","Ⓑ","Ⓒ","Ⓓ","Ⓔ","Ⓕ","Ⓖ","Ⓗ","Ⓘ","Ⓙ","Ⓚ","Ⓛ","Ⓜ","Ⓝ","Ⓞ","Ⓟ","Ⓠ","Ⓡ","Ⓢ","Ⓣ","Ⓤ","Ⓥ","Ⓦ","Ⓧ","Ⓨ","Ⓩ"], + "square-regular": ["0","1","2","3","4","5","6","7","8","9","🄰","🄱","🄲","🄳","🄴","🄵","🄶","🄷","🄸","🄹","🄺","🄻","🄼","🄽","🄾","🄿","🅀","🅁","🅂","🅃","🅄","🅅","🅆","🅇","🅈","🅉","🄰","🄱","🄲","🄳","🄴","🄵","🄶","🄷","🄸","🄹","🄺","🄻","🄼","🄽","🄾","🄿","🅀","🅁","🅂","🅃","🅄","🅅","🅆","🅇","🅈","🅉"], + }; + + // charCode => index in `TABLE` + const INDEX = { "48": 0, "49": 1, "50": 2, "51": 3, "52": 4, "53": 5, "54": 6, "55": 7, "56": 8, "57": 9, "65": 36, "66": 37, "67": 38, "68": 39, "69": 40, "70": 41, "71": 42, "72": 43, "73": 44, "74": 45, "75": 46, "76": 47, "77": 48, "78": 49, "79": 50, "80": 51, "81": 52, "82": 53, "83": 54, "84": 55, "85": 56, "86": 57, "87": 58, "88": 59, "89": 60, "90": 61, "97": 10, "98": 11, "99": 12, "100": 13, "101": 14, "102": 15, "103": 16, "104": 17, "105": 18, "106": 19, "107": 20, "108": 21, "109": 22, "110": 23, "111": 24, "112": 25, "113": 26, "114": 27, "115": 28, "116": 29, "117": 30, "118": 31, "119": 32, "120": 33, "121": 34, "122": 35 }; + + return proxies.map(p => { + p.name = [...p.name].map(c => { + if (/[a-zA-Z0-9]/.test(c)) { + const code = c.charCodeAt(0); + const index = INDEX[code]; + if (isNumber(code) && num) { + return TABLE[num][index]; + } else { + return TABLE[type][index]; + } + } + return c; + }).join(""); + return p; + }) +} + +function isNumber(code) { return code >= 48 && code <= 57; } \ No newline at end of file diff --git a/scripts/ip-flag.js b/scripts/ip-flag.js new file mode 100644 index 000000000..bda8c792f --- /dev/null +++ b/scripts/ip-flag.js @@ -0,0 +1,175 @@ +const RESOURCE_CACHE_KEY = '#sub-store-cached-resource'; +const CACHE_EXPIRATION_TIME_MS = 10 * 60 * 1000; +const $ = $substore; + +class ResourceCache { + constructor(expires) { + this.expires = expires; + if (!$.read(RESOURCE_CACHE_KEY)) { + $.write('{}', RESOURCE_CACHE_KEY); + } + this.resourceCache = JSON.parse($.read(RESOURCE_CACHE_KEY)); + this._cleanup(); + } + + _cleanup() { + // clear obsolete cached resource + let clear = false; + Object.entries(this.resourceCache).forEach((entry) => { + const [id, updated] = entry; + if (!updated.time) { + // clear old version cache + delete this.resourceCache[id]; + $.delete(`#${id}`); + clear = true; + } + if (new Date().getTime() - updated.time > this.expires) { + delete this.resourceCache[id]; + clear = true; + } + }); + if (clear) this._persist(); + } + + revokeAll() { + this.resourceCache = {}; + this._persist(); + } + + _persist() { + $.write(JSON.stringify(this.resourceCache), RESOURCE_CACHE_KEY); + } + + get(id) { + const updated = this.resourceCache[id] && this.resourceCache[id].time; + if (updated && new Date().getTime() - updated <= this.expires) { + return this.resourceCache[id].data; + } + return null; + } + + set(id, value) { + this.resourceCache[id] = { time: new Date().getTime(), data: value } + this._persist(); + } +} + +const resourceCache = new ResourceCache(CACHE_EXPIRATION_TIME_MS); + +async function operator(proxies) { + const { isLoon, isSurge } = $substore.env; + let support = false; + if (isLoon) { + support = true; + } else if (isSurge) { + const build = $environment['surge-build']; + if (build && parseInt(build) >= 2407) { + support = true; + } + } + + if (support) { + const batches = []; + const BATCH_SIZE = 10; + + let i = 0; + while (i < proxies.length) { + const batch = proxies.slice(i, i + BATCH_SIZE); + await Promise.all(batch.map(async proxy => { + try { + // remove the original flag + let proxyName = removeFlag(proxy.name); + + // query ip-api + const countryCode = await queryIpApi(proxy); + + proxyName = getFlagEmoji(countryCode) + ' ' + proxyName; + proxy.name = proxyName; + } catch (err) { + // TODO: + } + })); + + await sleep(1000); + i += BATCH_SIZE; + } + } else { + $.error(`IP Flag only supports Loon and Surge!`); + } + return proxies; +} + +const tasks = new Map(); +async function queryIpApi(proxy) { + const id = getId(proxy); + if (tasks.has(id)) { + return tasks.get(id); + } + + const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:78.0) Gecko/20100101 Firefox/78.0"; + const headers = { + "User-Agent": ua + }; + const { isLoon } = $substore.env; + const target = isLoon ? "Loon" : "Surge"; + const result = new Promise((resolve, reject) => { + const cached = resourceCache.get(id); + if (cached) { + resolve(cached); + } + const url = `http://ip-api.com/json`; + let node = ProxyUtils.produce([proxy], target); + + // Loon 需要去掉节点名字 + if (isLoon) { + const s = node.indexOf("="); + node = node.substring(s + 1); + } + + $.http.get({ + url, + headers, + node + }).then(resp => { + const body = resp.body; + const data = JSON.parse(body); + if (data.status === "success") { + resourceCache.set(id, data.countryCode); + resolve(data.countryCode); + } else { + reject(new Error(data.message)); + } + }).catch(err => { + console.log(err); + reject(err); + }); + }); + tasks.set(id, result); + return result; +} + +function getId(proxy) { + return MD5(`IP-FLAG-${proxy.server}-${proxy.port}`); +} + +function getFlagEmoji(countryCode) { + const codePoints = countryCode + .toUpperCase() + .split('') + .map(char => 127397 + char.charCodeAt()); + return String + .fromCodePoint(...codePoints) + .replace(/🇹🇼/g, '🇨🇳'); +} + +function removeFlag(str) { + return str + .replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g, '') + .trim(); +} + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +var MD5 = function (d) { var r = M(V(Y(X(d), 8 * d.length))); return r.toLowerCase() }; function M(d) { for (var _, m = "0123456789ABCDEF", f = "", r = 0; r < d.length; r++)_ = d.charCodeAt(r), f += m.charAt(_ >>> 4 & 15) + m.charAt(15 & _); return f } function X(d) { for (var _ = Array(d.length >> 2), m = 0; m < _.length; m++)_[m] = 0; for (m = 0; m < 8 * d.length; m += 8)_[m >> 5] |= (255 & d.charCodeAt(m / 8)) << m % 32; return _ } function V(d) { for (var _ = "", m = 0; m < 32 * d.length; m += 8)_ += String.fromCharCode(d[m >> 5] >>> m % 32 & 255); return _ } function Y(d, _) { d[_ >> 5] |= 128 << _ % 32, d[14 + (_ + 64 >>> 9 << 4)] = _; for (var m = 1732584193, f = -271733879, r = -1732584194, i = 271733878, n = 0; n < d.length; n += 16) { var h = m, t = f, g = r, e = i; f = md5_ii(f = md5_ii(f = md5_ii(f = md5_ii(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_ff(f = md5_ff(f = md5_ff(f = md5_ff(f, r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 0], 7, -680876936), f, r, d[n + 1], 12, -389564586), m, f, d[n + 2], 17, 606105819), i, m, d[n + 3], 22, -1044525330), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 4], 7, -176418897), f, r, d[n + 5], 12, 1200080426), m, f, d[n + 6], 17, -1473231341), i, m, d[n + 7], 22, -45705983), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 8], 7, 1770035416), f, r, d[n + 9], 12, -1958414417), m, f, d[n + 10], 17, -42063), i, m, d[n + 11], 22, -1990404162), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 12], 7, 1804603682), f, r, d[n + 13], 12, -40341101), m, f, d[n + 14], 17, -1502002290), i, m, d[n + 15], 22, 1236535329), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 1], 5, -165796510), f, r, d[n + 6], 9, -1069501632), m, f, d[n + 11], 14, 643717713), i, m, d[n + 0], 20, -373897302), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 5], 5, -701558691), f, r, d[n + 10], 9, 38016083), m, f, d[n + 15], 14, -660478335), i, m, d[n + 4], 20, -405537848), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 9], 5, 568446438), f, r, d[n + 14], 9, -1019803690), m, f, d[n + 3], 14, -187363961), i, m, d[n + 8], 20, 1163531501), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 13], 5, -1444681467), f, r, d[n + 2], 9, -51403784), m, f, d[n + 7], 14, 1735328473), i, m, d[n + 12], 20, -1926607734), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 5], 4, -378558), f, r, d[n + 8], 11, -2022574463), m, f, d[n + 11], 16, 1839030562), i, m, d[n + 14], 23, -35309556), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 1], 4, -1530992060), f, r, d[n + 4], 11, 1272893353), m, f, d[n + 7], 16, -155497632), i, m, d[n + 10], 23, -1094730640), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 13], 4, 681279174), f, r, d[n + 0], 11, -358537222), m, f, d[n + 3], 16, -722521979), i, m, d[n + 6], 23, 76029189), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 9], 4, -640364487), f, r, d[n + 12], 11, -421815835), m, f, d[n + 15], 16, 530742520), i, m, d[n + 2], 23, -995338651), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 0], 6, -198630844), f, r, d[n + 7], 10, 1126891415), m, f, d[n + 14], 15, -1416354905), i, m, d[n + 5], 21, -57434055), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 12], 6, 1700485571), f, r, d[n + 3], 10, -1894986606), m, f, d[n + 10], 15, -1051523), i, m, d[n + 1], 21, -2054922799), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 8], 6, 1873313359), f, r, d[n + 15], 10, -30611744), m, f, d[n + 6], 15, -1560198380), i, m, d[n + 13], 21, 1309151649), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 4], 6, -145523070), f, r, d[n + 11], 10, -1120210379), m, f, d[n + 2], 15, 718787259), i, m, d[n + 9], 21, -343485551), m = safe_add(m, h), f = safe_add(f, t), r = safe_add(r, g), i = safe_add(i, e) } return Array(m, f, r, i) } function md5_cmn(d, _, m, f, r, i) { return safe_add(bit_rol(safe_add(safe_add(_, d), safe_add(f, i)), r), m) } function md5_ff(d, _, m, f, r, i, n) { return md5_cmn(_ & m | ~_ & f, d, _, r, i, n) } function md5_gg(d, _, m, f, r, i, n) { return md5_cmn(_ & f | m & ~f, d, _, r, i, n) } function md5_hh(d, _, m, f, r, i, n) { return md5_cmn(_ ^ m ^ f, d, _, r, i, n) } function md5_ii(d, _, m, f, r, i, n) { return md5_cmn(m ^ (_ | ~f), d, _, r, i, n) } function safe_add(d, _) { var m = (65535 & d) + (65535 & _); return (d >> 16) + (_ >> 16) + (m >> 16) << 16 | 65535 & m } function bit_rol(d, _) { return d << _ | d >>> 32 - _ } \ No newline at end of file diff --git a/scripts/media-filter.js b/scripts/media-filter.js new file mode 100644 index 000000000..e69de29bb diff --git a/scripts/revert.js b/scripts/revert.js new file mode 100644 index 000000000..c64cc1b71 --- /dev/null +++ b/scripts/revert.js @@ -0,0 +1,5 @@ +const $ = API() +$.write("{}", "#sub-store") +$.done() + +function ENV(){const e="function"==typeof require&&"undefined"!=typeof $jsbox;return{isQX:"undefined"!=typeof $task,isLoon:"undefined"!=typeof $loon,isSurge:"undefined"!=typeof $httpClient&&"undefined"!=typeof $utils,isBrowser:"undefined"!=typeof document,isNode:"function"==typeof require&&!e,isJSBox:e,isRequest:"undefined"!=typeof $request,isScriptable:"undefined"!=typeof importModule}}function HTTP(e={baseURL:""}){const{isQX:t,isLoon:s,isSurge:o,isScriptable:n,isNode:i,isBrowser:r}=ENV(),u=/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;const a={};return["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"].forEach(h=>a[h.toLowerCase()]=(a=>(function(a,h){h="string"==typeof h?{url:h}:h;const d=e.baseURL;d&&!u.test(h.url||"")&&(h.url=d?d+h.url:h.url),h.body&&h.headers&&!h.headers["Content-Type"]&&(h.headers["Content-Type"]="application/x-www-form-urlencoded");const l=(h={...e,...h}).timeout,c={onRequest:()=>{},onResponse:e=>e,onTimeout:()=>{},...h.events};let f,p;if(c.onRequest(a,h),t)f=$task.fetch({method:a,...h});else if(s||o||i)f=new Promise((e,t)=>{(i?require("request"):$httpClient)[a.toLowerCase()](h,(s,o,n)=>{s?t(s):e({statusCode:o.status||o.statusCode,headers:o.headers,body:n})})});else if(n){const e=new Request(h.url);e.method=a,e.headers=h.headers,e.body=h.body,f=new Promise((t,s)=>{e.loadString().then(s=>{t({statusCode:e.response.statusCode,headers:e.response.headers,body:s})}).catch(e=>s(e))})}else r&&(f=new Promise((e,t)=>{fetch(h.url,{method:a,headers:h.headers,body:h.body}).then(e=>e.json()).then(t=>e({statusCode:t.status,headers:t.headers,body:t.data})).catch(t)}));const y=l?new Promise((e,t)=>{p=setTimeout(()=>(c.onTimeout(),t(`${a} URL: ${h.url} exceeds the timeout ${l} ms`)),l)}):null;return(y?Promise.race([y,f]).then(e=>(clearTimeout(p),e)):f).then(e=>c.onResponse(e))})(h,a))),a}function API(e="untitled",t=!1){const{isQX:s,isLoon:o,isSurge:n,isNode:i,isJSBox:r,isScriptable:u}=ENV();return new class{constructor(e,t){this.name=e,this.debug=t,this.http=HTTP(),this.env=ENV(),this.node=(()=>{if(i){return{fs:require("fs")}}return null})(),this.initCache();Promise.prototype.delay=function(e){return this.then(function(t){return((e,t)=>new Promise(function(s){setTimeout(s.bind(null,t),e)}))(e,t)})}}initCache(){if(s&&(this.cache=JSON.parse($prefs.valueForKey(this.name)||"{}")),(o||n)&&(this.cache=JSON.parse($persistentStore.read(this.name)||"{}")),i){let e="root.json";this.node.fs.existsSync(e)||this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.root={},e=`${this.name}.json`,this.node.fs.existsSync(e)?this.cache=JSON.parse(this.node.fs.readFileSync(`${this.name}.json`)):(this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.cache={})}}persistCache(){const e=JSON.stringify(this.cache,null,2);s&&$prefs.setValueForKey(e,this.name),(o||n)&&$persistentStore.write(e,this.name),i&&(this.node.fs.writeFileSync(`${this.name}.json`,e,{flag:"w"},e=>console.log(e)),this.node.fs.writeFileSync("root.json",JSON.stringify(this.root,null,2),{flag:"w"},e=>console.log(e)))}write(e,t){if(this.log(`SET ${t}`),-1!==t.indexOf("#")){if(t=t.substr(1),n||o)return $persistentStore.write(e,t);if(s)return $prefs.setValueForKey(e,t);i&&(this.root[t]=e)}else this.cache[t]=e;this.persistCache()}read(e){return this.log(`READ ${e}`),-1===e.indexOf("#")?this.cache[e]:(e=e.substr(1),n||o?$persistentStore.read(e):s?$prefs.valueForKey(e):i?this.root[e]:void 0)}delete(e){if(this.log(`DELETE ${e}`),-1!==e.indexOf("#")){if(e=e.substr(1),n||o)return $persistentStore.write(null,e);if(s)return $prefs.removeValueForKey(e);i&&delete this.root[e]}else delete this.cache[e];this.persistCache()}notify(e,t="",a="",h={}){const d=h["open-url"],l=h["media-url"];if(s&&$notify(e,t,a,h),n&&$notification.post(e,t,a+`${l?"\n多媒体:"+l:""}`,{url:d}),o){let s={};d&&(s.openUrl=d),l&&(s.mediaUrl=l),"{}"===JSON.stringify(s)?$notification.post(e,t,a):$notification.post(e,t,a,s)}if(i||u){const s=a+(d?`\n点击跳转: ${d}`:"")+(l?`\n多媒体: ${l}`:"");if(r){require("push").schedule({title:e,body:(t?t+"\n":"")+s})}else console.log(`${e}\n${t}\n${s}\n\n`)}}log(e){this.debug&&console.log(`[${this.name}] LOG: ${this.stringify(e)}`)}info(e){console.log(`[${this.name}] INFO: ${this.stringify(e)}`)}error(e){console.log(`[${this.name}] ERROR: ${this.stringify(e)}`)}wait(e){return new Promise(t=>setTimeout(t,e))}done(e={}){s||o||n?$done(e):i&&!r&&"undefined"!=typeof $context&&($context.headers=e.headers,$context.statusCode=e.statusCode,$context.body=e.body)}stringify(e){if("string"==typeof e||e instanceof String)return e;try{return JSON.stringify(e,null,2)}catch(e){return"[object Object]"}}}(e,t)} diff --git a/scripts/tls-fingerprint.js b/scripts/tls-fingerprint.js new file mode 100644 index 000000000..20838a9bc --- /dev/null +++ b/scripts/tls-fingerprint.js @@ -0,0 +1,12 @@ +/** + * 为节点添加 tls 证书指纹 + * 示例 + * #fingerprint=... + */ +function operator(proxies) { + const { fingerprint } = $arguments; + proxies.forEach(proxy => { + proxy['tls-fingerprint'] = fingerprint; + }); + return proxies; +} \ No newline at end of file diff --git a/scripts/udp-filter.js b/scripts/udp-filter.js new file mode 100644 index 000000000..7bd76af07 --- /dev/null +++ b/scripts/udp-filter.js @@ -0,0 +1,6 @@ +/** + * 过滤 UDP 节点 + */ +function filter(proxies) { + return proxies.map(p => p.udp); +} diff --git a/scripts/vmess-ws-obfs-host.js b/scripts/vmess-ws-obfs-host.js new file mode 100644 index 000000000..58c45c559 --- /dev/null +++ b/scripts/vmess-ws-obfs-host.js @@ -0,0 +1,16 @@ +/** + * 为 VMess WebSocket 节点修改混淆 host + * 示例 + * #host=google.com + */ +function operator(proxies) { + const { host } = $arguments; + proxies.forEach(p => { + if (p.type === 'vmess' && p.network === 'ws') { + p["ws-opts"] = p["ws-opts"] || {}; + p["ws-opts"]["headers"] = p["ws-opts"]["headers"] || {}; + p["ws-opts"]["headers"]["Host"] = host; + } + }); + return proxies; +} \ No newline at end of file diff --git a/sub-store-web/.gitignore b/sub-store-web/.gitignore deleted file mode 100644 index 403adbc1e..000000000 --- a/sub-store-web/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -.DS_Store -node_modules -/dist - - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/sub-store-web/README.md b/sub-store-web/README.md deleted file mode 100644 index 4f753635d..000000000 --- a/sub-store-web/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# sub-store-web - -## Project setup -``` -npm install -``` - -### Compiles and hot-reloads for development -``` -npm run serve -``` - -### Compiles and minifies for production -``` -npm run build -``` - -### Lints and fixes files -``` -npm run lint -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/sub-store-web/babel.config.js b/sub-store-web/babel.config.js deleted file mode 100644 index e9558405f..000000000 --- a/sub-store-web/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset' - ] -} diff --git a/sub-store-web/package-lock.json b/sub-store-web/package-lock.json deleted file mode 100644 index 67a0bd8a5..000000000 --- a/sub-store-web/package-lock.json +++ /dev/null @@ -1,12117 +0,0 @@ -{ - "name": "sub-store-web", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@ant-design-vue/babel-helper-vue-transform-on": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/@ant-design-vue/babel-helper-vue-transform-on/download/@ant-design-vue/babel-helper-vue-transform-on-1.0.1.tgz", - "integrity": "sha1-0hnZL04fxeet0hHDR8f6AAUYtiM=", - "dev": true - }, - "@ant-design-vue/babel-plugin-jsx": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npm.taobao.org/@ant-design-vue/babel-plugin-jsx/download/@ant-design-vue/babel-plugin-jsx-1.0.0-rc.1.tgz", - "integrity": "sha1-rlbOy9qfCGkbz5Lf6Y4kFud9dYs=", - "dev": true, - "requires": { - "@ant-design-vue/babel-helper-vue-transform-on": "^1.0.0", - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", - "svg-tags": "^1.0.0" - } - }, - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz?cache=0&sync_timestamp=1593522948158&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.10.4.tgz", - "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.11.0.tgz", - "integrity": "sha1-6fc+/gmvE1W3I6fzmxG61jfXyZw=", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.11.1.tgz?cache=0&sync_timestamp=1596578849394&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.11.1.tgz", - "integrity": "sha1-LFW2BOc6QNwhsOUmULEcZc8nZkM=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.11.0.tgz?cache=0&sync_timestamp=1596144430330&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.11.0.tgz", - "integrity": "sha1-S5DHjYwSglAkVoy+g+5smvGTWFw=", - "dev": true, - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.10.4.tgz?cache=0&sync_timestamp=1593521294951&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha1-W/DUlaP3V6w72ki1vzs7ownHK6M=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz?cache=0&sync_timestamp=1593522960718&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor%2Fdownload%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha1-uwt18xv5jL+f8UPBrleLhydK4aM=", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.10.4.tgz?cache=0&sync_timestamp=1593522816195&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.10.4.tgz", - "integrity": "sha1-gEro4/BDdmB8x5G51H1UAnYzK9I=", - "dev": true, - "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha1-n2FEa6gOgkCwpchcb9rIRZ1vJZ0=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.10.4.tgz?cache=0&sync_timestamp=1593522973297&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-create-regexp-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha1-/dYNiFJGWaC2lZwFeZJeQlcU87g=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.10.5.tgz", - "integrity": "sha1-tTwQ23imQIABUmkrEzkxR6y5uzA=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.10.4.tgz?cache=0&sync_timestamp=1593522981063&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha1-QKHNkXv/Eoj2malKdbN6Gi29jHw=", - "dev": true, - "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.10.4.tgz?cache=0&sync_timestamp=1593522977138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.10.4.tgz", - "integrity": "sha1-0tOyDFmtjEcRL6fSqUvAnV74Lxo=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.10.4.tgz?cache=0&sync_timestamp=1593521294451&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.10.4.tgz", - "integrity": "sha1-mMHL6g4jMvM/mkZhuM4VBbLBm6I=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.10.4.tgz?cache=0&sync_timestamp=1593521294715&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.10.4.tgz", - "integrity": "sha1-1JsAHR1aaMpeZgTdoBpil/fJOB4=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.11.0.tgz?cache=0&sync_timestamp=1596144430473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha1-rmnIPYTugvS0L5bioJQQk1qPJt8=", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.10.4.tgz?cache=0&sync_timestamp=1593522965782&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.10.4.tgz", - "integrity": "sha1-TFxUvgS9MWcKc4J5fXW5+i5bViA=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.11.0.tgz", - "integrity": "sha1-sW8lAinkchGr3YSzS2RzfCqy01k=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.10.4.tgz?cache=0&sync_timestamp=1593521296446&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha1-UNyWQT1ZT5lad5BZBbBYk813lnM=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.10.4.tgz?cache=0&sync_timestamp=1593521082372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-plugin-utils%2Fdownload%2F%40babel%2Fhelper-plugin-utils-7.10.4.tgz", - "integrity": "sha1-L3WoMSadT2d95JmG3/WZJ1M883U=", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.10.5.tgz?cache=0&sync_timestamp=1594750677873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-regex%2Fdownload%2F%40babel%2Fhelper-regex-7.10.5.tgz", - "integrity": "sha1-Mt+7eYmQc8QVVXBToZvQVarlCuA=", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.10.4.tgz?cache=0&sync_timestamp=1593522966172&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-remap-async-to-generator%2Fdownload%2F%40babel%2Fhelper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha1-/Oi+pOlpC76SMFbe0h5UtOi2jtU=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.10.4.tgz?cache=0&sync_timestamp=1593522959591&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.10.4.tgz", - "integrity": "sha1-1YXNk4jqBuYDHkzUS2cTy+rZ5s8=", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.10.4.tgz?cache=0&sync_timestamp=1593522975802&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.10.4.tgz", - "integrity": "sha1-D1zNopRSd6KnotOoIeFTle3PNGE=", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha1-7sFi8RLC9Y068K8SXju1dmUUZyk=", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha1-+KSRJErPamdhWKxCBykRuoOtCZ8=", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz?cache=0&sync_timestamp=1593521083613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.10.4.tgz", - "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=" - }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.10.4.tgz?cache=0&sync_timestamp=1593522965325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.10.4.tgz", - "integrity": "sha1-im9wHqsP8592W1oc/vQJmQ5iS4c=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.10.4.tgz?cache=0&sync_timestamp=1593522959913&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.10.4.tgz", - "integrity": "sha1-Kr6w1yGv98Cpc3a54fb2XXpHUEQ=", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.10.4.tgz?cache=0&sync_timestamp=1593521095576&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.10.4.tgz", - "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.11.3.tgz?cache=0&sync_timestamp=1596915985899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.11.3.tgz", - "integrity": "sha1-nh6uRnOLzQjiPoZ7q0PnuVKZqPk=" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.10.5.tgz?cache=0&sync_timestamp=1594750682516&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha1-NJHKvy98F5q4IGBs7Cf+0V4OhVg=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.10.4.tgz?cache=0&sync_timestamp=1593522963242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-class-properties%2Fdownload%2F%40babel%2Fplugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha1-ozv2Mto5ClnHqMVwBF0RFc13iAc=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.10.5.tgz?cache=0&sync_timestamp=1594750722573&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.10.5.tgz", - "integrity": "sha1-QomLukeLxLGuJCpwOpU6etNQ/7Q=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.10.4" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.10.4.tgz?cache=0&sync_timestamp=1593521093903&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-dynamic-import%2Fdownload%2F%40babel%2Fplugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha1-uleibLmLN3QenVvKG4sN34KR8X4=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha1-Vw2IO5EDFjez4pWO6jxDjmLAX1Q=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.10.4.tgz?cache=0&sync_timestamp=1593521092651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-json-strings%2Fdownload%2F%40babel%2Fplugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha1-WT5ZxjUoFgIzvTIbGuvgggwjQds=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha1-n4DkgsAwg8hxJd7hACa1hSfqIMg=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz?cache=0&sync_timestamp=1593521087263&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator%2Fdownload%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha1-AqfpYfwy5tWy2wZJ4Bv4Dd7n4Eo=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.10.4.tgz?cache=0&sync_timestamp=1593522970329&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-numeric-separator%2Fdownload%2F%40babel%2Fplugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha1-zhWQ/wplrRKXCmCdeIVemkwa7wY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha1-vYH5Wh90Z2DqQ7bC09YrEXkK0K8=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.10.4.tgz?cache=0&sync_timestamp=1593521089386&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-optional-catch-binding%2Fdownload%2F%40babel%2Fplugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha1-Mck4MJ0kp4pJ1o/av/qoY3WFVN0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha1-3lhm0GRvav2quKVmOC/joiF1UHY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.10.4.tgz?cache=0&sync_timestamp=1593522970831&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-private-methods%2Fdownload%2F%40babel%2Fplugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha1-sWDZcrj9ulx9ERoUX8jEIfwqaQk=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.10.4.tgz?cache=0&sync_timestamp=1593522975170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-unicode-property-regex%2Fdownload%2F%40babel%2Fplugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha1-RIPNpTBBzjQTt/4vAAImZd36p10=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.10.4.tgz?cache=0&sync_timestamp=1593521086484&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-class-properties%2Fdownload%2F%40babel%2Fplugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha1-ZkTmoLqlWmH54yMfbJ7rbuRsEkw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.10.4.tgz?cache=0&sync_timestamp=1593521097781&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-decorators%2Fdownload%2F%40babel%2Fplugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha1-aFMIWyxCn50yLQL1pjUBjN6yNgw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha1-Oauq48v3EMQ3PYQpSE5rohNAFmw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz?cache=0&sync_timestamp=1593521788128&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-numeric-separator%2Fdownload%2F%40babel%2Fplugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha1-S764kXtU/PdoNk4KgfVg4zo+9X0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.10.4.tgz?cache=0&sync_timestamp=1593521290488&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-arrow-functions%2Fdownload%2F%40babel%2Fplugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha1-4ilg135pfHT0HFAdRNc9v4pqZM0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.10.4.tgz?cache=0&sync_timestamp=1593522968362&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-async-to-generator%2Fdownload%2F%40babel%2Fplugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha1-QaUBfknrbzzak5KlHu8pQFskWjc=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.10.4.tgz?cache=0&sync_timestamp=1593522071341&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-block-scoped-functions%2Fdownload%2F%40babel%2Fplugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha1-GvpZV0T3XkOpGvc7DZmOz+Trwug=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha1-W37+mIUr741lLAsoFEzZOp5LUhU=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.10.4.tgz?cache=0&sync_timestamp=1593522971188&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.10.4.tgz", - "integrity": "sha1-QFE2rys+IYvEoZJiKLyRerGgrcc=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.10.4.tgz?cache=0&sync_timestamp=1593521290771&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-computed-properties%2Fdownload%2F%40babel%2Fplugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha1-ne2DqBboLe0o1S1LTsvdgQzfwOs=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.10.4.tgz?cache=0&sync_timestamp=1593521291443&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-destructuring%2Fdownload%2F%40babel%2Fplugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha1-cN3Ss9G+qD0BUJ6bsl3bOnT8heU=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.10.4.tgz?cache=0&sync_timestamp=1593522977820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-dotall-regex%2Fdownload%2F%40babel%2Fplugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha1-RpwgYhBcHragQOr0+sS0iAeDle4=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha1-aX5Qyf7hQ4D+hD0fMGspVhdDHkc=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.10.4.tgz?cache=0&sync_timestamp=1593522967206&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-exponentiation-operator%2Fdownload%2F%40babel%2Fplugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha1-WuM4xX+M9AAb2zVgeuZrktZlry4=", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.10.4.tgz?cache=0&sync_timestamp=1593521291715&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-for-of%2Fdownload%2F%40babel%2Fplugin-transform-for-of-7.10.4.tgz", - "integrity": "sha1-wIiS6IGdOl2ykDGxFa9RHbv+uuk=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.10.4.tgz?cache=0&sync_timestamp=1593522961117&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-function-name%2Fdownload%2F%40babel%2Fplugin-transform-function-name-7.10.4.tgz", - "integrity": "sha1-akZ4gOD8ljhRS6NpERgR3b4mRLc=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.10.4.tgz?cache=0&sync_timestamp=1593521291903&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-literals%2Fdownload%2F%40babel%2Fplugin-transform-literals-7.10.4.tgz", - "integrity": "sha1-n0K6CEEQChNfInEtDjkcRi9XHzw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.10.4.tgz?cache=0&sync_timestamp=1593521293070&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-member-expression-literals%2Fdownload%2F%40babel%2Fplugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha1-sexE/PGVr8uNssYs2OVRyIG6+Lc=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.10.5.tgz?cache=0&sync_timestamp=1594750712546&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha1-G5zdrwXZ6Is6rTOcs+RFxPAgqbE=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.10.4.tgz?cache=0&sync_timestamp=1593522963909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha1-ZmZ8Pu2h6/eJbUHx8WsXEFovvKA=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.10.5.tgz?cache=0&sync_timestamp=1594750707592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha1-YnAJnIVAZmgbrp4F+H4bnK2+jIU=", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.10.4.tgz?cache=0&sync_timestamp=1593522964232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-umd%2Fdownload%2F%40babel%2Fplugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha1-moSB/oG4JGVLOgtl2j34nz0hg54=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.10.4.tgz?cache=0&sync_timestamp=1593522978582&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-named-capturing-groups-regex%2Fdownload%2F%40babel%2Fplugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha1-eLTZeIELbzvPA/njGPL8DtQa7LY=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.10.4.tgz?cache=0&sync_timestamp=1593521292141&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-new-target%2Fdownload%2F%40babel%2Fplugin-transform-new-target-7.10.4.tgz", - "integrity": "sha1-kJfXU8t7Aky3OBo7LlLpUTqcaIg=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.10.4.tgz?cache=0&sync_timestamp=1593522965761&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.10.4.tgz", - "integrity": "sha1-1xRsTROUM+emUm+IjGZ+MUoJOJQ=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.10.5.tgz?cache=0&sync_timestamp=1594750687789&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-parameters%2Fdownload%2F%40babel%2Fplugin-transform-parameters-7.10.5.tgz", - "integrity": "sha1-WdM51Y0LGVBDX0BD504lEABeLEo=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.10.4.tgz?cache=0&sync_timestamp=1593521293406&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-property-literals%2Fdownload%2F%40babel%2Fplugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha1-9v5UtlkDUimHhbg+3YFdIUxC48A=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.10.4.tgz?cache=0&sync_timestamp=1593521089707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-regenerator%2Fdownload%2F%40babel%2Fplugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha1-IBXlnYOQdOdoON4hWdtCGWb9i2M=", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.10.4.tgz?cache=0&sync_timestamp=1593522978219&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-reserved-words%2Fdownload%2F%40babel%2Fplugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha1-jyaCvNzvntMn4bCGFYXXAT+KVN0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.11.0.tgz", - "integrity": "sha1-4n946zbxlEhjbgXDPJD9mtm4vM8=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.10.4.tgz?cache=0&sync_timestamp=1593521293679&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-shorthand-properties%2Fdownload%2F%40babel%2Fplugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha1-n9Jexc3VVbt/Rz5ebuHJce7eTdY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha1-+oTTAPXk9XdS/kGm0bPFVPE/F8w=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.10.4.tgz?cache=0&sync_timestamp=1593521295131&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-sticky-regex%2Fdownload%2F%40babel%2Fplugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha1-jziJ7oZXWBEwop2cyR18c7fEoo0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.10.5.tgz?cache=0&sync_timestamp=1594750692589&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-template-literals%2Fdownload%2F%40babel%2Fplugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha1-eLxdYmpmQtszEtnQ8AH152Of3ow=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.10.4.tgz?cache=0&sync_timestamp=1593522969066&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha1-lQnxp+7DHE7b/+E3wWzDP/C8W/w=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.10.4.tgz?cache=0&sync_timestamp=1593522967875&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-unicode-escapes%2Fdownload%2F%40babel%2Fplugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha1-/q5SM5HHZR3awRXa4KnQaFeJIAc=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.10.4.tgz?cache=0&sync_timestamp=1593522975515&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-unicode-regex%2Fdownload%2F%40babel%2Fplugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha1-5W1x+SgvrG2wnIJ0IFVXbV5tgKg=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.11.0.tgz", - "integrity": "sha1-hg7jjyzhetYEgMICG6lok5Pvt5Y=", - "dev": true, - "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.3.tgz", - "integrity": "sha1-EyQrU7XvjIg8PPfd3VWzbOgPvHI=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.11.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.11.2.tgz", - "integrity": "sha1-9UnBPHVMxAuHZEufqfCaapX+BzY=", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.10.4.tgz", - "integrity": "sha1-MlGZbEIA68cdGo/EBfupQPNrong=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.11.0.tgz", - "integrity": "sha1-m5ls4bmPU/fD5BdRFWBdVu0H3SQ=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.11.0.tgz", - "integrity": "sha1-Kua/G6mujDxDgk5YYSaYcbIG6Q0=", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1593993895205&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz", - "integrity": "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU=", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz?cache=0&sync_timestamp=1593915150444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fbourne%2Fdownload%2F%40hapi%2Fbourne-1.3.2.tgz", - "integrity": "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo=", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz?cache=0&sync_timestamp=1596229985980&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fhoek%2Fdownload%2F%40hapi%2Fhoek-8.5.1.tgz", - "integrity": "sha1-/elgZMpEbeyMVajC8TCVewcMbgY=", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz", - "integrity": "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc=", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npm.taobao.org/@hapi/topo/download/@hapi/topo-3.1.6.tgz?cache=0&sync_timestamp=1593916080558&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Ftopo%2Fdownload%2F%40hapi%2Ftopo-3.1.6.tgz", - "integrity": "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck=", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@intervolga/optimize-cssnano-plugin": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz", - "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=", - "dev": true, - "requires": { - "cssnano": "^4.0.0", - "cssnano-preset-default": "^4.0.0", - "postcss": "^7.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", - "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz", - "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", - "dev": true - }, - "@soda/friendly-errors-webpack-plugin": { - "version": "1.7.1", - "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz", - "integrity": "sha1-cG9kvLSouWQrSK46zkRMcDNNYV0=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "@soda/get-current-script": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/@soda/get-current-script/download/@soda/get-current-script-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Fget-current-script%2Fdownload%2F%40soda%2Fget-current-script-1.0.2.tgz", - "integrity": "sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc=", - "dev": true - }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/@types/anymatch/download/@types/anymatch-1.3.1.tgz", - "integrity": "sha1-M2utwb7sudrMOL6izzKt9ieoQho=", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.19.0.tgz", - "integrity": "sha1-BoWzxH6zAG/+0RfN1VFkth+AU48=", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz", - "integrity": "sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=", - "dev": true - }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npm.taobao.org/@types/connect/download/@types/connect-3.4.33.tgz?cache=0&sync_timestamp=1596837850490&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fconnect%2Fdownload%2F%40types%2Fconnect-3.4.33.tgz", - "integrity": "sha1-MWEMkB7KVzuHE8MzCrxua59YhUY=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/@types/connect-history-api-fallback/download/@types/connect-history-api-fallback-1.3.3.tgz", - "integrity": "sha1-R3K3m4tTGF8PTJ3qsJI2uvdu47Q=", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.7", - "resolved": "https://registry.npm.taobao.org/@types/express/download/@types/express-4.17.7.tgz", - "integrity": "sha1-QgRb5kdWNtmAE2nNRBjvZc2w3Vk=", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.9", - "resolved": "https://registry.npm.taobao.org/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.9.tgz", - "integrity": "sha1-LXs03P0l7GY8JchddmCPiySWZ/E=", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.3.tgz?cache=0&sync_timestamp=1596838206290&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fglob%2Fdownload%2F%40types%2Fglob-7.1.3.tgz", - "integrity": "sha1-5rqA82t9qtLGhazZJmOC5omFwYM=", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.4", - "resolved": "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz?cache=0&sync_timestamp=1596839386031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.4.tgz", - "integrity": "sha1-58kuPb4+E6p5lED/QubToXqdBFs=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-proxy-middleware": { - "version": "0.19.3", - "resolved": "https://registry.npm.taobao.org/@types/http-proxy-middleware/download/@types/http-proxy-middleware-0.19.3.tgz?cache=0&sync_timestamp=1596839386511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy-middleware%2Fdownload%2F%40types%2Fhttp-proxy-middleware-0.19.3.tgz", - "integrity": "sha1-suuW+8D5rHJQtdnExTqt4ElJfQM=", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/http-proxy": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.5.tgz?cache=0&sync_timestamp=1596838729190&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.5.tgz", - "integrity": "sha1-3M5EMOZLRDuolF8CkPtWStW6xt0=", - "dev": true - }, - "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/@types/mime/download/@types/mime-2.0.3.tgz", - "integrity": "sha1-yJO3NyHbc2mZQ7/DZTsd63+qSjo=", - "dev": true - }, - "@types/mini-css-extract-plugin": { - "version": "0.9.1", - "resolved": "https://registry.npm.taobao.org/@types/mini-css-extract-plugin/download/@types/mini-css-extract-plugin-0.9.1.tgz?cache=0&sync_timestamp=1596839014743&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fmini-css-extract-plugin%2Fdownload%2F%40types%2Fmini-css-extract-plugin-0.9.1.tgz", - "integrity": "sha1-1L3eUZcyb8oDnUGPS92gPcdNxFE=", - "dev": true, - "optional": true, - "requires": { - "@types/webpack": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz?cache=0&sync_timestamp=1596839141589&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.3.tgz", - "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", - "dev": true - }, - "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/@types/minimist/download/@types/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", - "dev": true - }, - "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.6.0.tgz?cache=0&sync_timestamp=1597674929436&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.6.0.tgz", - "integrity": "sha1-fUQRv1FXM5M318/4ZNn/RfF3tJk=", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/@types/normalize-package-data/download/@types/normalize-package-data-2.4.0.tgz?cache=0&sync_timestamp=1596839391651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.0.tgz", - "integrity": "sha1-5IbQ2XOW15vu3QpuM/RTT/a0lz4=", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.4.tgz", - "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=", - "dev": true - }, - "@types/qs": { - "version": "6.9.4", - "resolved": "https://registry.npm.taobao.org/@types/qs/download/@types/qs-6.9.4.tgz", - "integrity": "sha1-pZ6FHBuhbAUT6hI4MN1jmgoVy2o=", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/@types/range-parser/download/@types/range-parser-1.2.3.tgz", - "integrity": "sha1-fuMwunyq+5gJC+zoal7kQRWQTCw=", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.5", - "resolved": "https://registry.npm.taobao.org/@types/serve-static/download/@types/serve-static-1.13.5.tgz?cache=0&sync_timestamp=1596840339942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fserve-static%2Fdownload%2F%40types%2Fserve-static-1.13.5.tgz", - "integrity": "sha1-PSXZQaGEFdOrCS3vhG4TWgi7z1M=", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/@types/source-list-map/download/@types/source-list-map-0.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fsource-list-map%2Fdownload%2F%40types%2Fsource-list-map-0.1.2.tgz", - "integrity": "sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk=", - "dev": true - }, - "@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/@types/tapable/download/@types/tapable-1.0.6.tgz", - "integrity": "sha1-qcpLcKGLJwzLK8Cqr+/R1Ia36nQ=", - "dev": true - }, - "@types/uglify-js": { - "version": "3.9.3", - "resolved": "https://registry.npm.taobao.org/@types/uglify-js/download/@types/uglify-js-3.9.3.tgz?cache=0&sync_timestamp=1596841575547&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fuglify-js%2Fdownload%2F%40types%2Fuglify-js-3.9.3.tgz", - "integrity": "sha1-2U7WCOKVvFQkyWAOa4VlQHtrS2s=", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "@types/webpack": { - "version": "4.41.21", - "resolved": "https://registry.npm.taobao.org/@types/webpack/download/@types/webpack-4.41.21.tgz?cache=0&sync_timestamp=1596841577093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fwebpack%2Fdownload%2F%40types%2Fwebpack-4.41.21.tgz", - "integrity": "sha1-zGhbMywz8VO7L1/B+jrIretZLe4=", - "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "@types/webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npm.taobao.org/@types/webpack-dev-server/download/@types/webpack-dev-server-3.11.0.tgz?cache=0&sync_timestamp=1596841577349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fwebpack-dev-server%2Fdownload%2F%40types%2Fwebpack-dev-server-3.11.0.tgz", - "integrity": "sha1-vMO4Xn3GrC2yUzBhBRPyIowvz7I=", - "dev": true, - "requires": { - "@types/connect-history-api-fallback": "*", - "@types/express": "*", - "@types/http-proxy-middleware": "*", - "@types/serve-static": "*", - "@types/webpack": "*" - } - }, - "@types/webpack-sources": { - "version": "1.4.2", - "resolved": "https://registry.npm.taobao.org/@types/webpack-sources/download/@types/webpack-sources-1.4.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fwebpack-sources%2Fdownload%2F%40types%2Fwebpack-sources-1.4.2.tgz", - "integrity": "sha1-XT1N6gQAineakBNf+W+1wMnmKSw=", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.7.3.tgz", - "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", - "dev": true - } - } - }, - "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz?cache=0&sync_timestamp=1596768129236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.0.0.tgz", - "integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=", - "dev": true - }, - "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.1.2.tgz", - "integrity": "sha1-wKPm78Ai515CR7RIqPxrhvA+kcA=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - } - } - }, - "@vue/babel-preset-app": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-4.5.4.tgz", - "integrity": "sha1-uxZOirVWc8Vh5ug1EWMe2hnv1+Q=", - "dev": true, - "requires": { - "@ant-design-vue/babel-plugin-jsx": "^1.0.0-0", - "@babel/core": "^7.11.0", - "@babel/helper-compilation-targets": "^7.9.6", - "@babel/helper-module-imports": "^7.8.3", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.11.0", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.0", - "@vue/babel-preset-jsx": "^1.1.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.6.5", - "core-js-compat": "^3.6.5", - "semver": "^6.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - } - } - }, - "@vue/babel-preset-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.1.2.tgz", - "integrity": "sha1-LhaetMIE6jfKZsLqhaiAv8mdTyA=", - "dev": true, - "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "@vue/babel-sugar-functional-vue": "^1.1.2", - "@vue/babel-sugar-inject-h": "^1.1.2", - "@vue/babel-sugar-v-model": "^1.1.2", - "@vue/babel-sugar-v-on": "^1.1.2" - } - }, - "@vue/babel-sugar-functional-vue": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.1.2.tgz", - "integrity": "sha1-9+JPugnm8e5wEEVgqICAV1VfGpo=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-inject-h": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.1.2.tgz", - "integrity": "sha1-ilJ2ttji7Rb/yAeKrZQjYnTm7fA=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-v-model": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.1.2.tgz", - "integrity": "sha1-H/b9G4ACI/ycsehNzrXlLXN6gZI=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - } - } - }, - "@vue/babel-sugar-v-on": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.1.2.tgz", - "integrity": "sha1-su+ZuPL6sJ++rSWq1w70Lhz1sTs=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "camelcase": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } - } - }, - "@vue/cli-overlay": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-overlay/download/@vue/cli-overlay-4.5.4.tgz?cache=0&sync_timestamp=1597717221287&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-overlay%2Fdownload%2F%40vue%2Fcli-overlay-4.5.4.tgz", - "integrity": "sha1-4H48zC5Ndw1P29Rc3ed31ZKCLBk=", - "dev": true - }, - "@vue/cli-plugin-babel": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-4.5.4.tgz", - "integrity": "sha1-oBzcs9RgZGdd2I1htkCtrcyFHis=", - "dev": true, - "requires": { - "@babel/core": "^7.11.0", - "@vue/babel-preset-app": "^4.5.4", - "@vue/cli-shared-utils": "^4.5.4", - "babel-loader": "^8.1.0", - "cache-loader": "^4.1.0", - "thread-loader": "^2.1.3", - "webpack": "^4.0.0" - } - }, - "@vue/cli-plugin-eslint": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-4.5.4.tgz", - "integrity": "sha1-Dx8wer/h5K1n3Ll2k2QJQrFfrnY=", - "dev": true, - "requires": { - "@vue/cli-shared-utils": "^4.5.4", - "eslint-loader": "^2.2.1", - "globby": "^9.2.0", - "inquirer": "^7.1.0", - "webpack": "^4.0.0", - "yorkie": "^2.0.0" - } - }, - "@vue/cli-plugin-router": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.5.4.tgz", - "integrity": "sha1-BvIkCMftas7dv3MCy0eik7evQ0c=", - "dev": true, - "requires": { - "@vue/cli-shared-utils": "^4.5.4" - } - }, - "@vue/cli-plugin-vuex": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-vuex/download/@vue/cli-plugin-vuex-4.5.4.tgz", - "integrity": "sha1-YpbjBziPYRMhF+CsAxiAE2UrDFU=", - "dev": true - }, - "@vue/cli-service": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-service/download/@vue/cli-service-4.5.4.tgz?cache=0&sync_timestamp=1597717222018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-service%2Fdownload%2F%40vue%2Fcli-service-4.5.4.tgz", - "integrity": "sha1-+QPt9VXRB0BGJN4v7VmW2oztxSQ=", - "dev": true, - "requires": { - "@intervolga/optimize-cssnano-plugin": "^1.0.5", - "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@soda/get-current-script": "^1.0.0", - "@types/minimist": "^1.2.0", - "@types/webpack": "^4.0.0", - "@types/webpack-dev-server": "^3.11.0", - "@vue/cli-overlay": "^4.5.4", - "@vue/cli-plugin-router": "^4.5.4", - "@vue/cli-plugin-vuex": "^4.5.4", - "@vue/cli-shared-utils": "^4.5.4", - "@vue/component-compiler-utils": "^3.1.2", - "@vue/preload-webpack-plugin": "^1.1.0", - "@vue/web-component-wrapper": "^1.2.0", - "acorn": "^7.4.0", - "acorn-walk": "^7.1.1", - "address": "^1.1.2", - "autoprefixer": "^9.8.6", - "browserslist": "^4.12.0", - "cache-loader": "^4.1.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "cli-highlight": "^2.1.4", - "clipboardy": "^2.3.0", - "cliui": "^6.0.0", - "copy-webpack-plugin": "^5.1.1", - "css-loader": "^3.5.3", - "cssnano": "^4.1.10", - "debug": "^4.1.1", - "default-gateway": "^5.0.5", - "dotenv": "^8.2.0", - "dotenv-expand": "^5.1.0", - "file-loader": "^4.2.0", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "hash-sum": "^2.0.0", - "html-webpack-plugin": "^3.2.0", - "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.1", - "lodash.mapvalues": "^4.6.0", - "lodash.transform": "^4.6.0", - "mini-css-extract-plugin": "^0.9.0", - "minimist": "^1.2.5", - "pnp-webpack-plugin": "^1.6.4", - "portfinder": "^1.0.26", - "postcss-loader": "^3.0.0", - "ssri": "^7.1.0", - "terser-webpack-plugin": "^2.3.6", - "thread-loader": "^2.1.3", - "url-loader": "^2.2.0", - "vue-loader": "^15.9.2", - "vue-loader-v16": "npm:vue-loader@^16.0.0-beta.3", - "vue-style-loader": "^4.1.2", - "webpack": "^4.0.0", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-chain": "^6.4.0", - "webpack-dev-server": "^3.11.0", - "webpack-merge": "^4.2.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.4.0.tgz?cache=0&sync_timestamp=1597235774928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.4.0.tgz", - "integrity": "sha1-4a1IbmxUUBY0xsOXxcEh2qODYHw=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz", - "integrity": "sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw=", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", - "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", - "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", - "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-7.1.0.tgz", - "integrity": "sha1-ksJBv23oI2W1x/tL126XVSLhKU0=", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "terser-webpack-plugin": { - "version": "2.3.8", - "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1597229593156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz", - "integrity": "sha1-iUdkoZsHQ/L3BOfCqEjFKDppZyQ=", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.3.1", - "jest-worker": "^25.4.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.6.12", - "webpack-sources": "^1.4.3" - } - } - } - }, - "@vue/cli-shared-utils": { - "version": "4.5.4", - "resolved": "https://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-4.5.4.tgz?cache=0&sync_timestamp=1597717221168&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-shared-utils%2Fdownload%2F%40vue%2Fcli-shared-utils-4.5.4.tgz", - "integrity": "sha1-7Taylx3AJlP38q1OZrvpUQ4b1BQ=", - "dev": true, - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - } - } - }, - "@vue/compiler-core": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/compiler-core/download/@vue/compiler-core-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985153463&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-core%2Fdownload%2F%40vue%2Fcompiler-core-3.0.0-rc.5.tgz", - "integrity": "sha1-3U8YFvyuNKgbxg5YT5eZPK0oTVQ=", - "requires": { - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "@vue/shared": "3.0.0-rc.5", - "estree-walker": "^2.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" - } - } - }, - "@vue/compiler-dom": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/compiler-dom/download/@vue/compiler-dom-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985152508&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-dom%2Fdownload%2F%40vue%2Fcompiler-dom-3.0.0-rc.5.tgz", - "integrity": "sha1-g5BehgESOjZUuQ+9gHCKFlMM4ho=", - "requires": { - "@vue/compiler-core": "3.0.0-rc.5", - "@vue/shared": "3.0.0-rc.5" - } - }, - "@vue/compiler-sfc": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/compiler-sfc/download/@vue/compiler-sfc-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985044175&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-sfc%2Fdownload%2F%40vue%2Fcompiler-sfc-3.0.0-rc.5.tgz", - "integrity": "sha1-N05Spvv4+5ruEhMCYFCg8cSW/s8=", - "dev": true, - "requires": { - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "@vue/compiler-core": "3.0.0-rc.5", - "@vue/compiler-dom": "3.0.0-rc.5", - "@vue/compiler-ssr": "3.0.0-rc.5", - "@vue/shared": "3.0.0-rc.5", - "consolidate": "^0.15.1", - "estree-walker": "^2.0.1", - "hash-sum": "^2.0.0", - "lru-cache": "^5.1.1", - "magic-string": "^0.25.7", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.27", - "postcss-modules": "^3.1.0", - "postcss-selector-parser": "^6.0.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "@vue/compiler-ssr": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/compiler-ssr/download/@vue/compiler-ssr-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985044376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-ssr%2Fdownload%2F%40vue%2Fcompiler-ssr-3.0.0-rc.5.tgz", - "integrity": "sha1-h4QGxZ2v82Ls3LGZ+5Rnp2nKjeU=", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.0.0-rc.5", - "@vue/shared": "3.0.0-rc.5" - } - }, - "@vue/component-compiler-utils": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.2.0.tgz?cache=0&sync_timestamp=1595427628913&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcomponent-compiler-utils%2Fdownload%2F%40vue%2Fcomponent-compiler-utils-3.2.0.tgz", - "integrity": "sha1-j4UYLO7Sjps8dTE95mn4MWbRHl0=", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427582110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "@vue/preload-webpack-plugin": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fpreload-webpack-plugin%2Fdownload%2F%40vue%2Fpreload-webpack-plugin-1.1.2.tgz", - "integrity": "sha1-zrkktOyzucQ4ccekKaAvhCPmIas=", - "dev": true - }, - "@vue/reactivity": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/reactivity/download/@vue/reactivity-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985154146&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Freactivity%2Fdownload%2F%40vue%2Freactivity-3.0.0-rc.5.tgz", - "integrity": "sha1-Rc/42DnXrRMLHkmSOQkAUP3s/xM=", - "requires": { - "@vue/shared": "3.0.0-rc.5" - } - }, - "@vue/runtime-core": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/runtime-core/download/@vue/runtime-core-3.0.0-rc.5.tgz", - "integrity": "sha1-3VmvOl/AidHNwFplcyDA3Bflw2I=", - "requires": { - "@vue/reactivity": "3.0.0-rc.5", - "@vue/shared": "3.0.0-rc.5" - } - }, - "@vue/runtime-dom": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/runtime-dom/download/@vue/runtime-dom-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985153167&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fruntime-dom%2Fdownload%2F%40vue%2Fruntime-dom-3.0.0-rc.5.tgz", - "integrity": "sha1-L9daHymyOr8P/lzN7avaEXIcW1s=", - "requires": { - "@vue/runtime-core": "3.0.0-rc.5", - "@vue/shared": "3.0.0-rc.5", - "csstype": "^2.6.8" - } - }, - "@vue/shared": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/@vue/shared/download/@vue/shared-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595985152851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fshared%2Fdownload%2F%40vue%2Fshared-3.0.0-rc.5.tgz", - "integrity": "sha1-zqI3jj43Nj3cH13RWO3JybWz//A=" - }, - "@vue/web-component-wrapper": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.2.0.tgz", - "integrity": "sha1-uw5G8VhafiibTuYGfcxaauYvHdE=", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz", - "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q=", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz", - "integrity": "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI=", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz", - "integrity": "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA=", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz", - "integrity": "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc=", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz", - "integrity": "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg=", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz", - "integrity": "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A=", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz", - "integrity": "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz", - "integrity": "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ=", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz", - "integrity": "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU=", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz", - "integrity": "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas=", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz", - "integrity": "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz", - "integrity": "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz", - "integrity": "sha1-IhEYHlsxMmRDzIES658LkChyGmE=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz", - "integrity": "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz", - "integrity": "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz", - "integrity": "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", - "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", - "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.1.tgz?cache=0&sync_timestamp=1597235774928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.1.tgz", - "integrity": "sha1-Ux5Yuj9RudrLmmZGyk3r9bFMpHQ=", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.2.0.tgz?cache=0&sync_timestamp=1589684116279&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn-jsx%2Fdownload%2Facorn-jsx-5.2.0.tgz", - "integrity": "sha1-TGYGkXPW/daO2FI5/CViJhgrLr4=", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-7.2.0.tgz?cache=0&sync_timestamp=1597235855275&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn-walk%2Fdownload%2Facorn-walk-7.2.0.tgz", - "integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w=", - "dev": true - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz", - "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=", - "dev": true - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz", - "integrity": "sha1-2y/nJG5Tb0DZtUQqOeEX191qJOA=", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.4.tgz?cache=0&sync_timestamp=1597480759610&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.4.tgz", - "integrity": "sha1-BhT6zEUiEn+nE0Rca/0+vTduIjQ=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", - "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1595907068314&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", - "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz", - "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-4.3.1.tgz", - "integrity": "sha1-pcR8xDGB8fOP/XB2g3cA05VSKmE=", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.11.0.tgz", - "integrity": "sha1-l6vwhyMQ/tiKXEZrJWgVdhReM/E=", - "dev": true - } - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz?cache=0&sync_timestamp=1589682753624&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-html%2Fdownload%2Fansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz?cache=0&sync_timestamp=1589682733115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fany-promise%2Fdownload%2Fany-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", - "dev": true - }, - "arch": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/arch/download/arch-2.1.2.tgz", - "integrity": "sha1-DFK75zRLtPomDEQ9LLrZwA/y8L8=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz?cache=0&sync_timestamp=1597414329190&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fargparse%2Fdownload%2Fargparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-5.4.1.tgz", - "integrity": "sha1-EamAuE67kXgc41sP3C7ilON4Pwc=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", - "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", - "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/async/download/async-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", - "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz", - "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", - "dev": true - }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.8.6.tgz?cache=0&sync_timestamp=1596143120138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fautoprefixer%2Fdownload%2Fautoprefixer-9.8.6.tgz", - "integrity": "sha1-O3NZTKG/kmYyDFrPFYjXTep0IQ8=", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz?cache=0&sync_timestamp=1589682812085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws-sign2%2Fdownload%2Faws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.10.1.tgz?cache=0&sync_timestamp=1597236947743&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.10.1.tgz", - "integrity": "sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=", - "dev": true - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.1.0.tgz", - "integrity": "sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.1.0.tgz", - "integrity": "sha1-xhHVESvVIJq+i5+oTD5NolJ18cM=", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz?cache=0&sync_timestamp=1589682746075&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbcrypt-pbkdf%2Fdownload%2Fbcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz", - "integrity": "sha1-MlyGGoIryzWKQceKM7jm4ght3n8=", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", - "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", - "dev": true - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz", - "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", - "dev": true, - "optional": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz?cache=0&sync_timestamp=1589682780212&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbindings%2Fdownload%2Fbindings-1.5.0.tgz", - "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1589682744631&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz", - "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", - "integrity": "sha1-vsoAVAj2Quvr6oCwQrTRjSrA7ms=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz", - "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", - "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.2.1.tgz?cache=0&sync_timestamp=1596557839219&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserify-sign%2Fdownload%2Fbrowserify-sign-4.2.1.tgz", - "integrity": "sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM=", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1589682795646&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.14.0.tgz?cache=0&sync_timestamp=1596756179725&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.14.0.tgz", - "integrity": "sha1-KQiVGr/k7Jhze3LzTDvO3I1DsAA=", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz", - "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", - "dev": true - }, - "buffer-json": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/buffer-json/download/buffer-json-2.0.0.tgz", - "integrity": "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz?cache=0&sync_timestamp=1589682741197&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.4.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-12.0.4.tgz", - "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-loader": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-4.1.0.tgz", - "integrity": "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4=", - "dev": true, - "requires": { - "buffer-json": "^2.0.0", - "find-cache-dir": "^3.0.0", - "loader-utils": "^1.2.3", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "schema-utils": "^2.0.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", - "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", - "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", - "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.0.0.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-6.0.0.tgz", - "integrity": "sha1-Uln3ww414njxvcKk2RIws3ytmB4=", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", - "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001116", - "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001116.tgz?cache=0&sync_timestamp=1597783991061&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001116.tgz", - "integrity": "sha1-86Peo0f5KUo73EKSMJA5zIQRf7g=", - "dev": true - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha1-I6xhPMmoVuT4j/i7c7u16YmCXPc=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1594010664806&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz", - "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", - "dev": true - }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-8.0.3.tgz", - "integrity": "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI=", - "dev": true - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.2.tgz", - "integrity": "sha1-ONyOZY3sOAl0HrPve7Ckf+QkIy0=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true, - "optional": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", - "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz", - "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", - "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1592035524745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz", - "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-highlight": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.4.tgz", - "integrity": "sha1-CYy2Qs8X9CrcHBFF4H+WDsTXUis=", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "highlight.js": "^9.6.0", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^5.1.1", - "yargs": "^15.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", - "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", - "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz", - "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.4.0.tgz?cache=0&sync_timestamp=1595080377121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.4.0.tgz", - "integrity": "sha1-xiVtsha4eM+6RyDnGc7Hz3JoXX8=", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-3.0.0.tgz", - "integrity": "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY=", - "dev": true - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.3.0.tgz", - "integrity": "sha1-PCkDZQxo5GqRs4iYW8J3QofbopA=", - "dev": true, - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz", - "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz?cache=0&sync_timestamp=1597608006561&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-6.0.0.tgz", - "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz?cache=0&sync_timestamp=1589682821772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone%2Fdownload%2Fclone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", - "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/color/download/color-3.1.2.tgz", - "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz", - "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.1.tgz?cache=0&sync_timestamp=1593955763917&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolorette%2Fdownload%2Fcolorette-1.2.1.tgz", - "integrity": "sha1-TQuSEyXBT6+SYzCGpTbbbolWSxs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", - "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", - "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", - "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz?cache=0&sync_timestamp=1589682741197&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz?cache=0&sync_timestamp=1589682751334&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconcat-stream%2Fdownload%2Fconcat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", - "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", - "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz?cache=0&sync_timestamp=1589682802723&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconstants-browserify%2Fdownload%2Fconstants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz?cache=0&sync_timestamp=1589682764242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.7.0.tgz", - "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha1-VIGgPeoRI9iKmIxv+LeCRyFPC4g=", - "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz?cache=0&sync_timestamp=1591083812416&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz", - "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-2.1.2.tgz", - "integrity": "sha1-7OxTsOAxe9yV73arcHS3OEeF+mE=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz?cache=0&sync_timestamp=1589682715547&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslash%2Fdownload%2Fslash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.5.tgz?cache=0&sync_timestamp=1589682726446&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-3.6.5.tgz", - "integrity": "sha1-c5XcJzrzf7LlDpvT2f6EEoUjHRo=" - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.6.5.tgz", - "integrity": "sha1-KlHZpOJd/W5pAlGqgfmePAVIHxw=", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz", - "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz?cache=0&sync_timestamp=1596310819353&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-5.2.1.tgz", - "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz", - "integrity": "sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz?cache=0&sync_timestamp=1589682788096&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcrypto-browserify%2Fdownload%2Fcrypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-3.6.0.tgz", - "integrity": "sha1-Lkssfm4tJ/jI8o9hv/zS5ske9kU=", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-2.1.0.tgz", - "integrity": "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8=", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha1-mL69YsTB2flg7DQM+fdSLjBwmiI=", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-3.3.0.tgz", - "integrity": "sha1-EP7Glqns4uWRrHctdZqsq6w4zTk=", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", - "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", - "dev": true - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz?cache=0&sync_timestamp=1597684732243&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssnano%2Fdownload%2Fcssnano-4.1.10.tgz", - "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.7.tgz?cache=0&sync_timestamp=1597684732598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssnano-preset-default%2Fdownload%2Fcssnano-preset-default-4.0.7.tgz", - "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", - "dev": true - }, - "csso": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/csso/download/csso-4.0.3.tgz", - "integrity": "sha1-DZmF3IUsfMKyys+74QeQFNGo6QM=", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha1-K/8//huz93bPfu/ZHuXLp3oUnus=", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.6.tgz", - "integrity": "sha1-hS3GD8ql2qLoz2yRicRA7T4EKXg=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "csstype": { - "version": "2.6.13", - "resolved": "https://registry.npm.taobao.org/csstype/download/csstype-2.6.13.tgz?cache=0&sync_timestamp=1596101681368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.13.tgz", - "integrity": "sha1-pokwFbkOhN1uhdDjtEKh6E8tvg8=" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1589682745367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz?cache=0&sync_timestamp=1590399968773&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeep-equal%2Fdownload%2Fdeep-equal-1.1.1.tgz", - "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz", - "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=", - "dev": true - }, - "default-gateway": { - "version": "5.0.5", - "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-5.0.5.tgz", - "integrity": "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA=", - "dev": true, - "requires": { - "execa": "^3.3.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", - "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-3.4.0.tgz", - "integrity": "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k=", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&sync_timestamp=1597056502934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz", - "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz", - "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz", - "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz?cache=0&sync_timestamp=1597005345612&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-5.1.2.tgz", - "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz", - "integrity": "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", - "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", - "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", - "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1589682812246&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz", - "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz?cache=0&sync_timestamp=1589682730753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdel%2Fdownload%2Fdel-4.1.1.tgz", - "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz?cache=0&sync_timestamp=1591083812416&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz", - "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", - "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz", - "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", - "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz", - "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", - "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz", - "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz", - "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1597693536966&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1597680509643&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1597574828045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz", - "integrity": "sha1-w07MKVVtxF8fTCJpe29JBODMT8s=", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npm.taobao.org/dotenv/download/dotenv-8.2.0.tgz", - "integrity": "sha1-l+YZJZradQ7qPk6j4mvO6lQksWo=", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz", - "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=", - "dev": true - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz", - "integrity": "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "easy-stack": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.0.tgz", - "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz?cache=0&sync_timestamp=1589682745945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fecc-jsbn%2Fdownload%2Fecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz?cache=0&sync_timestamp=1597678506855&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fejs%2Fdownload%2Fejs-2.7.4.tgz", - "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.537", - "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.537.tgz?cache=0&sync_timestamp=1597808026999&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.537.tgz", - "integrity": "sha1-3+WV9Sg9MRPfiXFYgQ5A9sI1UoM=", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.3.tgz", - "integrity": "sha1-y1nrLv2vc6C9eMzXAVpirW4Pk9Y=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz", - "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", - "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.3.0.tgz", - "integrity": "sha1-O4BvO/r8HsfeaVUe+TzKRsFwQSY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz", - "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.3.tgz", - "integrity": "sha1-XEh+V0Krk8Fau12iJ1m4WQ7AO38=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz", - "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.6.tgz?cache=0&sync_timestamp=1597446082160&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.17.6.tgz", - "integrity": "sha1-kUIHFweFeyysx7iey2cDFsPi1So=", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.0.2.tgz?cache=0&sync_timestamp=1594742958135&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.0.2.tgz", - "integrity": "sha1-algNcO24eIDyK0yR0NVgeN9pYsQ=", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-6.8.0.tgz", - "integrity": "sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.1.0.tgz?cache=0&sync_timestamp=1591269986906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.0.tgz", - "integrity": "sha1-0Plx3+WcaeDK2mhLI9Sdv4JgDOU=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npm.taobao.org/globals/download/globals-12.4.0.tgz", - "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz?cache=0&sync_timestamp=1589682760620&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.2.1.tgz", - "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz", - "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", - "dev": true - } - } - }, - "eslint-loader": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/eslint-loader/download/eslint-loader-2.2.1.tgz", - "integrity": "sha1-KLnBLaVAV68IReKmEScBova/gzc=", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - } - }, - "eslint-plugin-vue": { - "version": "7.0.0-beta.2", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-7.0.0-beta.2.tgz?cache=0&sync_timestamp=1597198168566&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-vue%2Fdownload%2Feslint-plugin-vue-7.0.0-beta.2.tgz", - "integrity": "sha1-SCiSPsJBkwYPgFZ7+MFbGOE5aLM=", - "dev": true, - "requires": { - "eslint-utils": "^2.1.0", - "natural-compare": "^1.4.0", - "semver": "^7.3.2", - "vue-eslint-parser": "^7.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-2.1.0.tgz", - "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.2.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.2.tgz", - "integrity": "sha1-YElisFK4HtB4aq6EOJ/7pw/9OTg=", - "dev": true - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1591269986906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz", - "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.3.tgz", - "integrity": "sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8=", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1597435068105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz", - "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npm.taobao.org/espree/download/espree-6.2.1.tgz?cache=0&sync_timestamp=1595034145062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-6.2.1.tgz", - "integrity": "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o=", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.4.0.tgz?cache=0&sync_timestamp=1597235774928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.4.0.tgz", - "integrity": "sha1-4a1IbmxUUBY0xsOXxcEh2qODYHw=", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz?cache=0&sync_timestamp=1589682833047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesprima%2Fdownload%2Fesprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.3.1.tgz", - "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true - }, - "estree-walker": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-2.0.1.tgz", - "integrity": "sha1-+OAw+yHO+hg7RLetUWt0dDTno+A=" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz?cache=0&sync_timestamp=1589682816934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesutils%2Fdownload%2Fesutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz", - "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.4.tgz", - "integrity": "sha1-tUY6zmNaCD0Bi9x8kXtMXxCoU4Q=", - "dev": true - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/events/download/events-3.2.0.tgz?cache=0&sync_timestamp=1595422577337&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevents%2Fdownload%2Fevents-3.2.0.tgz", - "integrity": "sha1-k7h8GPjvzUICpGGuxN/AVWtjk3k=", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/eventsource/download/eventsource-1.0.7.tgz", - "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1589682766604&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz?cache=0&sync_timestamp=1589682707348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fextend%2Fdownload%2Fextend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz", - "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.7.tgz?cache=0&sync_timestamp=1592291968616&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-2.2.7.tgz", - "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz", - "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/figures/download/figures-3.2.0.tgz", - "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz", - "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-4.3.0.tgz", - "integrity": "sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8=", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", - "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", - "dev": true, - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz", - "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", - "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", - "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz?cache=0&sync_timestamp=1589682814592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.2.tgz", - "integrity": "sha1-RXWyHivO50NKqb5mL0t7X5wrUTg=", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.0.tgz?cache=0&sync_timestamp=1597057976909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.0.tgz", - "integrity": "sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz?cache=0&sync_timestamp=1589682752100&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffresh%2Fdownload%2Ffresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz?cache=0&sync_timestamp=1591229972229&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-extra%2Fdownload%2Ffs-extra-7.0.1.tgz", - "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz", - "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz", - "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "generic-names": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz", - "integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.1.tgz", - "integrity": "sha1-WPQ2H/mH5f9uHnohCCeqNx6qwmk=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&sync_timestamp=1597056502934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz?cache=0&sync_timestamp=1589682745510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgetpass%2Fdownload%2Fgetpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1589682812051&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz", - "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", - "dev": true - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-9.2.0.tgz?cache=0&sync_timestamp=1591083812416&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-9.2.0.tgz", - "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&sync_timestamp=1589682809142&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", - "dev": true - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz", - "integrity": "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ=", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz", - "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz?cache=0&sync_timestamp=1596082584903&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhar-validator%2Fdownload%2Fhar-validator-5.1.5.tgz", - "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", - "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.1.0.tgz", - "integrity": "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM=", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1589682795646&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - } - } - }, - "hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz", - "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", - "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz?cache=0&sync_timestamp=1589682765156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhe%2Fdownload%2Fhe-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz", - "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", - "dev": true - }, - "highlight.js": { - "version": "9.18.3", - "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.3.tgz", - "integrity": "sha1-oaCiAo1eMUniOA+Khl7oUWcD1jQ=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz", - "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz?cache=0&sync_timestamp=1594427993800&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.8.tgz", - "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz", - "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", - "dev": true - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.3.1.tgz", - "integrity": "sha1-+5oaS1sUxdq6gtPjTGrk/nAaDkQ=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", - "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", - "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", - "dev": true - } - } - }, - "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz", - "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=", - "dev": true - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1589682767473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz", - "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", - "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407858306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz", - "integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1589682811784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz", - "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184264130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz", - "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1589682760620&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz", - "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz", - "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", - "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-7.3.3.tgz", - "integrity": "sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM=", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", - "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", - "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz", - "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz?cache=0&sync_timestamp=1597005345612&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-5.1.2.tgz", - "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-3.1.0.tgz", - "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz", - "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-4.3.0.tgz?cache=0&sync_timestamp=1596563037835&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finternal-ip%2Fdownload%2Finternal-ip-4.3.0.tgz", - "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "dependencies": { - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz", - "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.4.0.tgz", - "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", - "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.2.0.tgz", - "integrity": "sha1-gzNlYLVKOONeOi33r9BFTWkUaLs=", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz?cache=0&sync_timestamp=1589682764432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-ci%2Fdownload%2Fis-ci-1.2.1.tgz", - "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/is-docker/download/is-docker-2.1.1.tgz", - "integrity": "sha1-QSWojkTkUNOE4JBH7eca3C0UQVY=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz", - "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-2.2.0.tgz", - "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-2.1.0.tgz", - "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.1.1.tgz?cache=0&sync_timestamp=1596555640677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regex%2Fdownload%2Fis-regex-1.1.1.tgz", - "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-svg/download/is-svg-3.0.0.tgz", - "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz", - "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "javascript-stringify": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-2.0.1.tgz", - "integrity": "sha1-bvNYA1MQ411mfGde1j0+t8GqGeU=", - "dev": true - }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npm.taobao.org/jest-worker/download/jest-worker-25.5.0.tgz?cache=0&sync_timestamp=1597057499649&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjest-worker%2Fdownload%2Fjest-worker-25.5.0.tgz", - "integrity": "sha1-JhHQcbec6g9D7lej0RhZOsFUfbE=", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz", - "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-message": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz", - "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", - "dev": true - }, - "js-queue": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.0.tgz", - "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", - "dev": true, - "requires": { - "easy-stack": "^1.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz", - "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz?cache=0&sync_timestamp=1589682745609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsbn%2Fdownload%2Fjsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", - "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz?cache=0&sync_timestamp=1589682771374&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-stringify-safe%2Fdownload%2Fjson-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", - "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.3.tgz", - "integrity": "sha1-ybD3+pIzv+WAf+ZvzzpWF+1ZfUM=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", - "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - }, - "launch-editor": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz", - "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "shell-quote": "^1.6.1" - } - }, - "launch-editor-middleware": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz", - "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=", - "dev": true, - "requires": { - "launch-editor": "^2.2.1" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/leven/download/leven-3.1.0.tgz", - "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/levenary/download/levenary-1.1.1.tgz", - "integrity": "sha1-hCqe6Y0gdap/ru2+MmeekgX0b3c=", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/loader-fs-cache/download/loader-fs-cache-1.0.3.tgz", - "integrity": "sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k=", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1593786221739&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz", - "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", - "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597335994883&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz", - "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz?cache=0&sync_timestamp=1589682725270&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.memoize%2Fdownload%2Flodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.transform": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz?cache=0&sync_timestamp=1589682817275&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.uniq%2Fdownload%2Flodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", - "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.6.8.tgz", - "integrity": "sha1-iiX7ddCSIw7NRFcnDYC1TigBEXE=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz?cache=0&sync_timestamp=1594427582110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-5.1.1.tgz", - "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz", - "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", - "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", - "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.4.tgz", - "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", - "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz?cache=0&sync_timestamp=1589682763068&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge-stream%2Fdownload%2Fmerge-stream-2.0.0.tgz", - "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.6.tgz?cache=0&sync_timestamp=1590635592890&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.4.6.tgz", - "integrity": "sha1-5bQHyQ20QvK+tbFiNz0Htpr/pNE=", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz", - "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz?cache=0&sync_timestamp=1589682770020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.27.tgz", - "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1597072282658&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz?cache=0&sync_timestamp=1596373165623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-url%2Fdownload%2Fnormalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1589682820731&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz?cache=0&sync_timestamp=1589683712023&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass%2Fdownload%2Fminipass-3.1.3.tgz", - "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", - "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz", - "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz", - "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.4.tgz?cache=0&sync_timestamp=1595998621838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass-pipeline%2Fdownload%2Fminipass-pipeline-1.2.4.tgz", - "integrity": "sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", - "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", - "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1589682820707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.8.tgz", - "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz", - "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.1.tgz?cache=0&sync_timestamp=1589682780413&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.1.tgz", - "integrity": "sha1-174036MQW5FJTDFHCJMV7/iHSwE=", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz?cache=0&sync_timestamp=1589682752355&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnegotiator%2Fdownload%2Fnegotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz?cache=0&sync_timestamp=1594317434347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.2.tgz", - "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.9.0.tgz", - "integrity": "sha1-1iQFDtu0SHStyhK7mlLsY8t4JXk=", - "dev": true - }, - "node-ipc": { - "version": "9.1.1", - "resolved": "https://registry.npm.taobao.org/node-ipc/download/node-ipc-9.1.1.tgz", - "integrity": "sha1-TiRe1pOOZRAOWV68XcNLFujdXWk=", - "dev": true, - "requires": { - "event-pubsub": "4.3.0", - "js-message": "1.0.5", - "js-queue": "2.0.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", - "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz?cache=0&sync_timestamp=1589682803838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpunycode%2Fdownload%2Fpunycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.60.tgz?cache=0&sync_timestamp=1595485377499&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.60.tgz", - "integrity": "sha1-aUi9/OgobwtdDlqI6DhOlU3+cIQ=", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz?cache=0&sync_timestamp=1596373165623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-url%2Fdownload%2Fnormalize-url-3.3.0.tgz", - "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-loader": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/null-loader/download/null-loader-3.0.0.tgz", - "integrity": "sha1-PitsZjxb2oxzpUNX2PoHCNxhskU=", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz?cache=0&sync_timestamp=1589682811909&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foauth-sign%2Fdownload%2Foauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/object-hash/download/object-hash-1.3.1.tgz", - "integrity": "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8=", - "dev": true - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.8.0.tgz?cache=0&sync_timestamp=1592545231350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.8.0.tgz", - "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=", - "dev": true - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.2.tgz", - "integrity": "sha1-xdLof/nhGfeLegiEQVGeLuwVc7Y=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object.values/download/object.values-1.1.1.tgz", - "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", - "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz?cache=0&sync_timestamp=1597005345612&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npm.taobao.org/open/download/open-6.4.0.tgz?cache=0&sync_timestamp=1595208443014&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopen%2Fdownload%2Fopen-6.4.0.tgz", - "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.1.tgz?cache=0&sync_timestamp=1589682813674&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopener%2Fdownload%2Fopener-1.5.1.tgz", - "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", - "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz", - "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1596812605371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fora%2Fdownload%2Fora-3.4.0.tgz", - "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", - "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559734248&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-3.0.0.tgz", - "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50=", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/p-retry/download/p-retry-3.0.1.tgz", - "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz", - "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", - "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz?cache=0&sync_timestamp=1597167309380&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-asn1%2Fdownload%2Fparse-asn1-5.1.6.tgz", - "integrity": "sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ=", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.0.1.tgz", - "integrity": "sha1-fP41wczWQbzjmBRn5sLs5hs7OHg=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz?cache=0&sync_timestamp=1595849263958&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5%2Fdownload%2Fparse5-5.1.1.tgz", - "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-5.1.1.tgz?cache=0&sync_timestamp=1596089818598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5-htmlparser2-tree-adapter%2Fdownload%2Fparse5-htmlparser2-tree-adapter-5.1.1.tgz", - "integrity": "sha1-6MdD1OkhlNUpPs3isIvjHmdGHLw=", - "dev": true, - "requires": { - "parse5": "^5.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", - "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz", - "integrity": "sha1-y4cksPramEWWhW0abrr9NYRlS5Q=", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz", - "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz?cache=0&sync_timestamp=1589682729560&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpinkie-promise%2Fdownload%2Fpinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npm.taobao.org/pnp-webpack-plugin/download/pnp-webpack-plugin-1.6.4.tgz?cache=0&sync_timestamp=1589684269502&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpnp-webpack-plugin%2Fdownload%2Fpnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha1-yXEaxNxIpoXauvyG+Lbdn434QUk=", - "dev": true, - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz?cache=0&sync_timestamp=1596018176291&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fportfinder%2Fdownload%2Fportfinder-1.0.28.tgz", - "integrity": "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g=", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.32.tgz", - "integrity": "sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0=", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.3.tgz?cache=0&sync_timestamp=1596805654356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-7.0.3.tgz", - "integrity": "sha1-1lzKkqPFK/J603pfcy4Fh7dPFiM=", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz?cache=0&sync_timestamp=1597682964214&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-colormin%2Fdownload%2Fpostcss-colormin-4.0.3.tgz", - "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz?cache=0&sync_timestamp=1597682964333&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-convert-values%2Fdownload%2Fpostcss-convert-values-4.0.1.tgz", - "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz?cache=0&sync_timestamp=1597682964431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-comments%2Fdownload%2Fpostcss-discard-comments-4.0.2.tgz", - "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz?cache=0&sync_timestamp=1597682964524&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-duplicates%2Fdownload%2Fpostcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz?cache=0&sync_timestamp=1597682964629&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-empty%2Fdownload%2Fpostcss-discard-empty-4.0.1.tgz", - "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz?cache=0&sync_timestamp=1597682964720&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-overridden%2Fdownload%2Fpostcss-discard-overridden-4.0.1.tgz", - "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.1.0.tgz", - "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-3.0.0.tgz", - "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz?cache=0&sync_timestamp=1597684735557&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-merge-longhand%2Fdownload%2Fpostcss-merge-longhand-4.0.11.tgz", - "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz?cache=0&sync_timestamp=1597684597276&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-merge-rules%2Fdownload%2Fpostcss-merge-rules-4.0.3.tgz", - "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz?cache=0&sync_timestamp=1597684597341&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-font-values%2Fdownload%2Fpostcss-minify-font-values-4.0.2.tgz", - "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz?cache=0&sync_timestamp=1597684736463&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-gradients%2Fdownload%2Fpostcss-minify-gradients-4.0.2.tgz", - "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz?cache=0&sync_timestamp=1597684736706&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-params%2Fdownload%2Fpostcss-minify-params-4.0.2.tgz", - "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz?cache=0&sync_timestamp=1597684737076&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-selectors%2Fdownload%2Fpostcss-minify-selectors-4.0.2.tgz", - "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules/download/postcss-modules-3.2.0.tgz?cache=0&sync_timestamp=1593589775045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules%2Fdownload%2Fpostcss-modules-3.2.0.tgz", - "integrity": "sha1-HKhw0ZfNCaeWQlPhLeKqyQbJQlY=", - "dev": true, - "requires": { - "generic-names": "^2.0.1", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz?cache=0&sync_timestamp=1595733620602&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A=", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha1-OFyuATzHdD9afXYC0Qc6iequYu4=", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz", - "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz?cache=0&sync_timestamp=1597684737335&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-charset%2Fdownload%2Fpostcss-normalize-charset-4.0.1.tgz", - "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz?cache=0&sync_timestamp=1597683104006&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-display-values%2Fdownload%2Fpostcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz?cache=0&sync_timestamp=1597683104141&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-positions%2Fdownload%2Fpostcss-normalize-positions-4.0.2.tgz", - "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz?cache=0&sync_timestamp=1597683104230&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-repeat-style%2Fdownload%2Fpostcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz?cache=0&sync_timestamp=1597683104306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-string%2Fdownload%2Fpostcss-normalize-string-4.0.2.tgz", - "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz?cache=0&sync_timestamp=1597683104399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-timing-functions%2Fdownload%2Fpostcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz?cache=0&sync_timestamp=1597683104480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-unicode%2Fdownload%2Fpostcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz?cache=0&sync_timestamp=1597682956775&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-url%2Fdownload%2Fpostcss-normalize-url-4.0.1.tgz", - "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz?cache=0&sync_timestamp=1597682957024&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-ordered-values%2Fdownload%2Fpostcss-ordered-values-4.1.2.tgz", - "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz?cache=0&sync_timestamp=1597682957212&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-reduce-initial%2Fdownload%2Fpostcss-reduce-initial-4.0.3.tgz", - "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz?cache=0&sync_timestamp=1597682957300&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-reduce-transforms%2Fdownload%2Fpostcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz?cache=0&sync_timestamp=1597682957408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-svgo%2Fdownload%2Fpostcss-svgo-4.0.2.tgz", - "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz?cache=0&sync_timestamp=1597682957541&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-unique-selectors%2Fdownload%2Fpostcss-unique-selectors-4.0.1.tgz", - "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz", - "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1589682761987&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz", - "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", - "dev": true, - "optional": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", - "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz", - "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", - "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz?cache=0&sync_timestamp=1589682803838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpunycode%2Fdownload%2Fpunycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz?cache=0&sync_timestamp=1589682817412&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fq%2Fdownload%2Fq-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz?cache=0&sync_timestamp=1589682791876&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquerystring%2Fdownload%2Fquerystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.2.0.tgz?cache=0&sync_timestamp=1597686771604&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquerystringify%2Fdownload%2Fquerystringify-2.2.0.tgz", - "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", - "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz?cache=0&sync_timestamp=1589682810106&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg%2Fdownload%2Fread-pkg-5.2.0.tgz", - "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.7.tgz", - "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz", - "integrity": "sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.1.tgz", - "integrity": "sha1-ytkq2Oa1kXc0hfvgWkhcr09Ffm8=", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz?cache=0&sync_timestamp=1595456311465&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.7.tgz", - "integrity": "sha1-ysLazIoepnX+qrrriugziYrkb1U=", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.5.tgz", - "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz", - "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", - "dev": true - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.0.tgz", - "integrity": "sha1-/L9FjFBDGwu3tF1pZ7gZLZHz2Tg=", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.2.tgz", - "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.4.tgz", - "integrity": "sha1-p2n4aEMIQBpm6bUp0kNv9NBmYnI=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", - "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", - "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz?cache=0&sync_timestamp=1597680509643&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz?cache=0&sync_timestamp=1589682741998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest%2Fdownload%2Frequest-2.88.2.tgz", - "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.17.0.tgz?cache=0&sync_timestamp=1589682751623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.17.0.tgz", - "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1589682814592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz", - "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.2.tgz", - "integrity": "sha1-gJanrAPyzE/lhg725XKBDZ4BwNI=", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1589682795646&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz?cache=0&sync_timestamp=1589682757445&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-regex%2Fdownload%2Fsafe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz?cache=0&sync_timestamp=1589682784154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafer-buffer%2Fdownload%2Fsafer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", - "dev": true - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.7.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-2.7.0.tgz", - "integrity": "sha1-FxUfdtjq5n+793lgwzxnatn078c=", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.7.tgz", - "integrity": "sha1-2lgZ/QSdVXTyjoipvMbbxubzkGs=", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1590635592890&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-4.0.0.tgz", - "integrity": "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1593407858306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", - "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/shell-quote/download/shell-quote-1.7.2.tgz?cache=0&sync_timestamp=1589682755902&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fshell-quote%2Fdownload%2Fshell-quote-1.7.2.tgz", - "integrity": "sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I=", - "dev": true - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npm.taobao.org/shelljs/download/shelljs-0.8.4.tgz?cache=0&sync_timestamp=1589684087110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fshelljs%2Fdownload%2Fshelljs-0.8.4.tgz", - "integrity": "sha1-3naE/ut2f4cWsyYHiooAh1iQ48I=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz?cache=0&sync_timestamp=1589682814780&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz", - "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", - "dev": true - } - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz?cache=0&sync_timestamp=1589682715547&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslash%2Fdownload%2Fslash-2.0.0.tgz", - "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", - "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.20.tgz", - "integrity": "sha1-smooPsVi74smh7RAM6Tuzqx12FU=", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.4.0.tgz?cache=0&sync_timestamp=1596410219305&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs-client%2Fdownload%2Fsockjs-client-1.4.0.tgz", - "integrity": "sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U=", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&sync_timestamp=1589891993007&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.3.tgz", - "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", - "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz", - "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz?cache=0&sync_timestamp=1589682814927&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.19.tgz", - "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz", - "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz?cache=0&sync_timestamp=1589682794533&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-expression-parse%2Fdownload%2Fspdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz", - "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz", - "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", - "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz", - "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz", - "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz", - "integrity": "sha1-UkKUktY8YuuYmATBFVLj0i53kwM=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1589682739548&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", - "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", - "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz", - "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", - "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha1-hYEqa4R6wAInD1gIFGBkyZX7aRM=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz", - "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", - "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", - "dev": true - } - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz", - "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.1.1.tgz?cache=0&sync_timestamp=1594567532500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.3.tgz", - "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/svgo/download/svgo-1.3.2.tgz", - "integrity": "sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz", - "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz", - "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.8.0.tgz?cache=0&sync_timestamp=1597761636364&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.8.0.tgz", - "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz?cache=0&sync_timestamp=1597229593156&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-1.4.5.tgz", - "integrity": "sha1-oheu+uozDnNP+sthIOwfoxLWBAs=", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.1.tgz", - "integrity": "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thread-loader": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/thread-loader/download/thread-loader-2.1.3.tgz", - "integrity": "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo=", - "dev": true, - "requires": { - "loader-runner": "^2.3.1", - "loader-utils": "^1.1.0", - "neo-async": "^2.6.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz", - "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", - "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1589684134816&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&sync_timestamp=1589682815640&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz", - "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz", - "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=", - "dev": true - }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.2.0.tgz", - "integrity": "sha1-pQCtCEsHmPHDBxrzkeZZEshrypI=", - "dev": true - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz?cache=0&sync_timestamp=1596753875166&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.13.0.tgz", - "integrity": "sha1-yIHhPMcBWJTtkUhi0nZDb6mkcEM=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1589682745749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz", - "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1596387201241&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", - "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE=", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", - "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", - "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz?cache=0&sync_timestamp=1589682745059&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funpipe%2Fdownload%2Funpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", - "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", - "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz?cache=0&sync_timestamp=1589682803838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpunycode%2Fdownload%2Fpunycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-2.3.0.tgz", - "integrity": "sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs=", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npm.taobao.org/url-parse/download/url-parse-1.4.7.tgz", - "integrity": "sha1-qKg1NejACjFuQDpdtKwbm4U64ng=", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz", - "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz?cache=0&sync_timestamp=1589682767473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.1.tgz", - "integrity": "sha1-a693dLgO6w91INi4HQeYKlmruu4=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1595885088251&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.1.tgz", - "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz", - "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz?cache=0&sync_timestamp=1589682787766&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvm-browserify%2Fdownload%2Fvm-browserify-1.1.2.tgz", - "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", - "dev": true - }, - "vue": { - "version": "3.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/vue/download/vue-3.0.0-rc.5.tgz?cache=0&sync_timestamp=1595983987853&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-3.0.0-rc.5.tgz", - "integrity": "sha1-lzF11FqJKzvSPvXef6pK3ZxmJ18=", - "requires": { - "@vue/compiler-dom": "3.0.0-rc.5", - "@vue/runtime-dom": "3.0.0-rc.5", - "@vue/shared": "3.0.0-rc.5" - } - }, - "vue-cli-plugin-vuetify": { - "version": "2.0.7", - "resolved": "https://registry.npm.taobao.org/vue-cli-plugin-vuetify/download/vue-cli-plugin-vuetify-2.0.7.tgz", - "integrity": "sha1-/LTxZV58kZnuQNy/ZGXiNV/QdNU=", - "dev": true, - "requires": { - "null-loader": "^3.0.0", - "semver": "^7.1.2", - "shelljs": "^0.8.3" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.2.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.2.tgz", - "integrity": "sha1-YElisFK4HtB4aq6EOJ/7pw/9OTg=", - "dev": true - } - } - }, - "vue-eslint-parser": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.1.0.tgz?cache=0&sync_timestamp=1589684321779&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.1.0.tgz", - "integrity": "sha1-nNvMgj5lawh1B6GRFzK4Z6wQHoM=", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-scope": "^5.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.2.1", - "esquery": "^1.0.1", - "lodash": "^4.17.15" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.1.0.tgz?cache=0&sync_timestamp=1591269986906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.0.tgz", - "integrity": "sha1-0Plx3+WcaeDK2mhLI9Sdv4JgDOU=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz?cache=0&sync_timestamp=1589682714858&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-hot-reload-api%2Fdownload%2Fvue-hot-reload-api-2.3.4.tgz", - "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", - "dev": true - }, - "vue-loader": { - "version": "15.9.3", - "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.3.tgz", - "integrity": "sha1-DeNdnlVdPtU5aVFsrFziVTEpndo=", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - } - } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.0.0-beta.5", - "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-16.0.0-beta.5.tgz", - "integrity": "sha1-BO3IiUkrA6RF56xm6SJqcBdcqKA=", - "dev": true, - "optional": true, - "requires": { - "@types/mini-css-extract-plugin": "^0.9.1", - "chalk": "^3.0.0", - "hash-sum": "^2.0.0", - "loader-utils": "^1.2.3", - "merge-source-map": "^1.1.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", - "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", - "dev": true, - "optional": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", - "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz", - "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.2.tgz", - "integrity": "sha1-3t80mAbyXOtOZPOtfApE+6c1/Pg=", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - } - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", - "dev": true - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.4.tgz?cache=0&sync_timestamp=1597081659128&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.4.tgz", - "integrity": "sha1-bp2lOzyAuy1lCBiPWyAEEIZs0ws=", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha1-mUihhmy71suCTeoTp+1pH2yN3/A=", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true, - "optional": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webpack": { - "version": "4.44.1", - "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.44.1.tgz?cache=0&sync_timestamp=1597430610874&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack%2Fdownload%2Fwebpack-4.44.1.tgz", - "integrity": "sha1-F+af/58yG48RfR/acU7fwLk5zCE=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.8.0", - "resolved": "https://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.8.0.tgz", - "integrity": "sha1-zms/kI2vBp/R9yZvaSy7O97ZuhY=", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.4.0.tgz?cache=0&sync_timestamp=1597235774928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.4.0.tgz", - "integrity": "sha1-4a1IbmxUUBY0xsOXxcEh2qODYHw=", - "dev": true - } - } - }, - "webpack-chain": { - "version": "6.5.1", - "resolved": "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-6.5.1.tgz?cache=0&sync_timestamp=1595814928534&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-chain%2Fdownload%2Fwebpack-chain-6.5.1.tgz", - "integrity": "sha1-TycoTLu2N+PI+970Pu9YjU2GEgY=", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^2.0.1" - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.7.2.tgz?cache=0&sync_timestamp=1594744455919&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-middleware%2Fdownload%2Fwebpack-dev-middleware-3.7.2.tgz", - "integrity": "sha1-ABnD23FuP6XOy/ZPKriKdLqzMfM=", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.11.0.tgz", - "integrity": "sha1-jxVKO84bz9HMYY705wMniFXn/4w=", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1597608006561&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-3.0.3.tgz", - "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1590789322916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1589682805026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1589682795383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1597809611661&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1596945681098&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz", - "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.2.tgz?cache=0&sync_timestamp=1597767024911&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-merge%2Fdownload%2Fwebpack-merge-4.2.2.tgz", - "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz", - "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.6.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebsocket-driver%2Fdownload%2Fwebsocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz", - "integrity": "sha1-f4RzvIOd/YdgituV1+sHUhFXikI=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1589682812246&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz?cache=0&sync_timestamp=1589683603678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fword-wrap%2Fdownload%2Fword-wrap-1.2.3.tgz", - "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", - "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", - "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", - "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz", - "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz?cache=0&sync_timestamp=1593925481882&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-6.2.1.tgz", - "integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1589682817913&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", - "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-15.4.1.tgz?cache=0&sync_timestamp=1597809611661&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-15.4.1.tgz", - "integrity": "sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169842138&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1596945681098&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz", - "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1589682790492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } - } - }, - "yorkie": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz", - "integrity": "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k=", - "dev": true, - "requires": { - "execa": "^0.8.0", - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz?cache=0&sync_timestamp=1597056502934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427582110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - } - } -} diff --git a/sub-store-web/package.json b/sub-store-web/package.json deleted file mode 100644 index d7e10b5c8..000000000 --- a/sub-store-web/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "sub-store-web", - "version": "0.1.0", - "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" - }, - "dependencies": { - "core-js": "^3.6.5", - "vue": "^3.0.0-0" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "@vue/compiler-sfc": "^3.0.0-0", - "babel-eslint": "^10.1.0", - "eslint": "^6.7.2", - "eslint-plugin-vue": "^7.0.0-0", - "vue-cli-plugin-vuetify": "~2.0.7" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/vue3-essential", - "eslint:recommended" - ], - "parserOptions": { - "parser": "babel-eslint" - }, - "rules": {} - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] -} diff --git a/sub-store-web/public/favicon.ico b/sub-store-web/public/favicon.ico deleted file mode 100644 index df36fcfb7..000000000 Binary files a/sub-store-web/public/favicon.ico and /dev/null differ diff --git a/sub-store-web/public/index.html b/sub-store-web/public/index.html deleted file mode 100644 index 412352865..000000000 --- a/sub-store-web/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -
-
- For a guide and recipes on how to configure / customize this project,
- check out the
- vue-cli documentation.
-