From 4d1498e8c2bf9d1dccb8e87561c53fa5b6832d7d Mon Sep 17 00:00:00 2001 From: WZT Date: Fri, 25 Mar 2022 16:55:16 +0800 Subject: [PATCH 01/20] improvement(cli): sass compiler no longer in default list in wxa project --- packages/wxa-cli/package-lock.json | 9123 +--------------------- packages/wxa-cli/src/const/wxaConfigs.js | 10 +- 2 files changed, 44 insertions(+), 9089 deletions(-) diff --git a/packages/wxa-cli/package-lock.json b/packages/wxa-cli/package-lock.json index c1b41fee..de77f699 100644 --- a/packages/wxa-cli/package-lock.json +++ b/packages/wxa-cli/package-lock.json @@ -3,9074 +3,6 @@ "version": "2.3.1", "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@wxa/cli2", - "version": "2.2.20", - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.1.3", - "@babel/parser": "^7.1.3", - "@babel/plugin-proposal-class-properties": "^7.2.3", - "@babel/plugin-proposal-decorators": "^7.2.3", - "@babel/plugin-transform-runtime": "^7.2.0", - "@babel/preset-env": "^7.2.3", - "@babel/runtime": "7.8.7", - "@babel/template": "~7.10.0", - "@babel/traverse": "~7.9.6", - "@babel/types": "~7.9.6", - "@wxa/compiler-babel": "latest", - "@wxa/compiler-sass": "latest", - "chalk": "^2.3.0", - "chokidar": "^3.3.1", - "commander": "^8.1.0", - "core-js": "^3.0.0-beta.6", - "debug": "^3.1.0", - "deepmerge": "^2.2.1", - "dom-serializer": "^0.1.1", - "find-cache-dir": "^1.0.0", - "find-root": "^1.1.0", - "globby": "^8.0.1", - "htmlparser2": "^3.10.1", - "inquirer": "^6.2.0", - "js-base64": "^2.4.0", - "json5": "^2.1.1", - "mkdirp": "^0.5.1", - "mockjs": "^1.1.0", - "node-notifier": "^5.2.1", - "postcss": "^7.0.36", - "postcss-pxtorpx-pro": "^1.0.0", - "promise.prototype.finally": "^3.1.0", - "shelljs": "^0.8.3", - "source-map": "^0.7.3", - "tapable": "^1.0.0", - "valid-url": "^1.0.9" - }, - "bin": { - "wxa2": "bin/wxa.js" - }, - "devDependencies": { - "@babel/cli": "^7.15.7", - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.0.0", - "@babel/polyfill": "^7.0.0", - "babel-eslint": "^9.0.0", - "eslint": "^4.15.0", - "eslint-config-google": "^0.9.1", - "semver": "^5.5.0", - "webpack": "^4.28.3", - "webpack-cli": "^3.2.0" - } - }, - "node_modules/@babel/cli": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.15.7.tgz", - "integrity": "sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg==", - "dev": true, - "dependencies": { - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@babel/cli/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/cli/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dependencies": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "node_modules/@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "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" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/core/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dependencies": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", - "dependencies": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "dependencies": { - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-define-map/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-define-map/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "dependencies": { - "@babel/types": "^7.11.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dependencies": { - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dependencies": { - "@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" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dependencies": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", - "dependencies": { - "@babel/types": "^7.11.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dependencies": { - "@babel/types": "^7.11.0" - } - }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "dependencies": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/helpers/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz", - "integrity": "sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", - "dependencies": { - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", - "dependencies": { - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", - "dependencies": { - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", - "dependencies": { - "regenerator-transform": "^0.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", - "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/polyfill": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.11.5.tgz", - "integrity": "sha512-FunXnE0Sgpd61pKSj2OSOs1D44rKTD3pGOfGilZ6LGrrIH0QEtJlTjqOqdF8Bs98JmjfGhni2BBkTfv9KcKJ9g==", - "deprecated": "???? This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information.", - "dev": true, - "dependencies": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/polyfill/node_modules/core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "deprecated": "core-js@<3.4 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. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", - "dependencies": { - "@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.5", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dependencies": { - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", - "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", - "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.6", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dependencies": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "dependencies": { - "@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" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "dependencies": { - "@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" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "dependencies": { - "@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" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "dependencies": { - "@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" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@wxa/compiler-babel": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@wxa/compiler-babel/download/@wxa/compiler-babel-2.3.1.tgz", - "integrity": "sha512-ynLDdvuqK7+TQZ0Y6POo3gwkUUEbG5lQqcY29i0NfYvTjVZt3aVfcSsnQUy7DlEogXO8P2t4zHWl1YOdVfTt7w==", - "dependencies": { - "@babel/core": "^7.1.0", - "debug": "^4.0.1", - "find-cache-dir": "^2.0.0", - "mkdirp": "^0.5.1", - "worker-farm": "^1.7.0", - "zlib": "^1.0.5" - } - }, - "node_modules/@wxa/compiler-babel/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1636300872595&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz", - "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wxa/compiler-babel/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz", - "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@wxa/compiler-sass": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@wxa/compiler-sass/download/@wxa/compiler-sass-2.3.1.tgz", - "integrity": "sha512-zgX/D01mrZUyeaOkGOb7WOvrywATiyZW1RjJ0tWgbLC/UoNT8HbXJmzpGtF+E6AMCsBkM0ij6q3tHHfrrZmVTg==", - "dependencies": { - "node-sass": "^4.14.1" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" - }, - "node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "dependencies": { - "acorn": "^3.0.4" - } - }, - "node_modules/acorn-jsx/node_modules/acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true, - "peerDependencies": { - "ajv": "^5.0.0" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.nlark.com/are-we-there-yet/download/are-we-there-yet-1.1.7.tgz", - "integrity": "sha1-sVR0qTKtq0/4pQ2a36fk6SbyEUY=", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmmirror.com/asn1/download/asn1-0.2.6.tgz?cache=0&sync_timestamp=1635986760581&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasn1%2Fdownload%2Fasn1-0.2.6.tgz", - "integrity": "sha1-DTp7tuZOAqkMAwOzHykoaOoJoI0=", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "node_modules/async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.11.0.tgz?cache=0&sync_timestamp=1604101166484&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.11.0.tgz", - "integrity": "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk=" - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-eslint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-9.0.0.tgz", - "integrity": "sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dependencies": { - "inherits": "~2.0.0" - }, - "engines": { - "node": "0.4 || >=0.5.8" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", - "dependencies": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001258", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", - "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==" - }, - "node_modules/browserslist/node_modules/electron-to-chromium": { - "version": "1.3.843", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.843.tgz", - "integrity": "sha512-OWEwAbzaVd1Lk9MohVw8LxMXFlnYd9oYTYxfX8KS++kLLjDfbovLOcEEXwRhG612dqGQ6+44SZvim0GXuBRiKg==" - }, - "node_modules/browserslist/node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/browserslist/node_modules/node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "node_modules/caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "dependencies": { - "callsites": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/camelcase/download/camelcase-2.1.1.tgz?cache=0&sync_timestamp=1636945151239&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase%2Fdownload%2Fcamelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/camelcase-keys/download/camelcase-keys-2.1.0.tgz?cache=0&sync_timestamp=1633332959770&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/code-point-at/download/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.1.0.tgz", - "integrity": "sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "dependencies": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": "*" - } - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1601073454623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdelegates%2Fdownload%2Fdelegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dependencies": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dir-glob/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/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=", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "dependencies": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-config-google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", - "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=4.1.1" - } - }, - "node_modules/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/eslint/node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/eslint/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/eslint/node_modules/inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "node_modules/eslint/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "node_modules/eslint/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "dependencies": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/extsprintf/download/extsprintf-1.3.0.tgz?cache=0&sync_timestamp=1635889740043&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fextsprintf%2Fdownload%2Fextsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dependencies": { - "@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" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "dependencies": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "dependencies": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/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=", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz", - "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmmirror.com/gauge/download/gauge-2.7.4.tgz?cache=0&sync_timestamp=1636989413004&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fgauge%2Fdownload%2Fgauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz", - "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=", - "dependencies": { - "globule": "^1.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/get-stdin/download/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "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" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-modules/node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/globule": { - "version": "1.3.3", - "resolved": "https://registry.nlark.com/globule/download/globule-1.3.3.tgz", - "integrity": "sha1-gRkZ7qwatzROkF8uO+gKE0R5c8I=", - "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmmirror.com/har-validator/download/har-validator-5.1.5.tgz", - "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.9.tgz", - "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=" - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "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" - } - }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1637178599208&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/in-publish/download/in-publish-2.0.1.tgz", - "integrity": "sha1-lIsaU1yAMFYc6lIvc/ePS+NX4Aw=", - "bin": { - "in-install": "in-install.js", - "in-publish": "in-publish.js", - "not-in-install": "not-in-install.js", - "not-in-publish": "not-in-publish.js" - } - }, - "node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz?cache=0&sync_timestamp=1618679442183&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Findent-string%2Fdownload%2Findent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/is-finite/download/is-finite-1.1.0.tgz", - "integrity": "sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz?cache=0&sync_timestamp=1618552489864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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=" - }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/json-schema/download/json-schema-0.2.3.tgz?cache=0&sync_timestamp=1636423494254&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-schema%2Fdownload%2Fjson-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/jsprim/download/jsprim-1.4.1.tgz?cache=0&sync_timestamp=1637110674471&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjsprim%2Fdownload%2Fjsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dependencies": { - "leven": "^3.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.nlark.com/load-json-file/download/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/map-obj/download/map-obj-1.0.1.tgz?cache=0&sync_timestamp=1634552719803&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmap-obj%2Fdownload%2Fmap-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.nlark.com/meow/download/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmmirror.com/mime-db/download/mime-db-1.51.0.tgz?cache=0&sync_timestamp=1636425951030&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-db%2Fdownload%2Fmime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.34.tgz?cache=0&sync_timestamp=1636432355847&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mockjs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz", - "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==", - "dependencies": { - "commander": "*" - }, - "bin": { - "random": "bin/random" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "node_modules/nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmmirror.com/node-gyp/download/node-gyp-3.8.0.tgz?cache=0&sync_timestamp=1636105025371&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-gyp%2Fdownload%2Fnode-gyp-3.8.0.tgz", - "integrity": "sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw=", - "dependencies": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "5.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "node_modules/node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmmirror.com/node-sass/download/node-sass-4.14.1.tgz", - "integrity": "sha1-mch+wu+3BH7WOPtMnbfzpC4iF7U=", - "dependencies": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "bin": { - "node-sass": "bin/node-sass" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-sass/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-sass/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.nlark.com/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-sass/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1637259109971&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1629301872905&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/npmlog/download/npmlog-4.1.2.tgz?cache=0&sync_timestamp=1637085007288&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnpmlog%2Fdownload%2Fnpmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/number-is-nan/download/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz", - "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1636944602935&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz?cache=0&sync_timestamp=1611752058913&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-type%2Fdownload%2Fpath-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-type/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pxtorpx-pro": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-pxtorpx-pro/-/postcss-pxtorpx-pro-1.0.0.tgz", - "integrity": "sha512-MXASoQS5oqAevEdZlRROsaSFMYMGbxUauWX30kIV+yUpJPqLBRqDEM63NCVVn6MpEUQ0yBsO1yXriNt/OmUxLw==", - "dependencies": { - "postcss": "^7.0.27" - } - }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "node_modules/promise.prototype.finally": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz", - "integrity": "sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.0", - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz", - "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "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" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385315895&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/read-pkg-up/download/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/find-up/download/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "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" - } - }, - "node_modules/readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/redent/download/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dependencies": { - "regenerate": "^1.4.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "node_modules/regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.nlark.com/repeating/download/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmmirror.com/request/download/request-2.88.2.tgz", - "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "node_modules/rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "dependencies": { - "rx-lite": "*" - } - }, - "node_modules/rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.5.tgz", - "integrity": "sha1-qYHIdEa4MZ2W3OBnHkh4eb0kwug=", - "dependencies": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - }, - "bin": { - "sassgraph": "bin/sassgraph" - } - }, - "node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dependencies": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - } - }, - "node_modules/scss-tokenizer/node_modules/source-map": { - "version": "0.4.4", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", - "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dependencies": { - "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" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz?cache=0&sync_timestamp=1590161967473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-correct%2Fdownload%2Fspdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmmirror.com/spdx-license-ids/download/spdx-license-ids-3.0.11.tgz?cache=0&sync_timestamp=1636978474315&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dependencies": { - "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" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz", - "integrity": "sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4=", - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/strip-bom/download/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-1.0.1.tgz?cache=0&sync_timestamp=1620053310624&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-indent%2Fdownload%2Fstrip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "dependencies": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "2.2.2", - "resolved": "https://registry.nlark.com/tar/download/tar-2.2.2.tgz?cache=0&sync_timestamp=1629994598621&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftar%2Fdownload%2Ftar-2.2.2.tgz", - "integrity": "sha1-DKiEhWLHKZuLRG/2pNYM27I+3EA=", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "dependencies": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/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=1584646121003&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz", - "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/trim-newlines/download/trim-newlines-1.0.0.tgz?cache=0&sync_timestamp=1623341510447&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz", - "integrity": "sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0=", - "dependencies": { - "glob": "^7.1.2" - } - }, - "node_modules/tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1581364203962&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmmirror.com/uuid/download/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "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.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" - }, - "node_modules/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=", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmmirror.com/verror/download/verror-1.10.0.tgz?cache=0&sync_timestamp=1635885078723&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fverror%2Fdownload%2Fverror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.0" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - }, - "engines": { - "node": "<8.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "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" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", - "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", - "dev": true, - "dependencies": { - "@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" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "4.x.x" - } - }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmmirror.com/wide-align/download/wide-align-1.1.5.tgz", - "integrity": "sha1-3x1MIGhUNp7PPJpImPGyP72dFdM=", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dependencies": { - "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" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/zlib": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/zlib/download/zlib-1.0.5.tgz", - "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=", - "engines": { - "node": ">=0.2.0" - } - } - }, "dependencies": { "@babel/cli": { "version": "7.15.7", @@ -10665,8 +1597,8 @@ }, "@wxa/compiler-babel": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@wxa/compiler-babel/download/@wxa/compiler-babel-2.3.1.tgz", - "integrity": "sha512-ynLDdvuqK7+TQZ0Y6POo3gwkUUEbG5lQqcY29i0NfYvTjVZt3aVfcSsnQUy7DlEogXO8P2t4zHWl1YOdVfTt7w==", + "resolved": "http://10.107.103.115:8001/@wxa/compiler-babel/download/@wxa/compiler-babel-2.3.1.tgz", + "integrity": "sha1-+wI9Ym7hHgC8RvTv4ne3+I9lSoQ=", "requires": { "@babel/core": "^7.1.0", "debug": "^4.0.1", @@ -10677,16 +1609,16 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1636300872595&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz", - "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", + "version": "4.3.4", + "resolved": "http://10.107.103.115:8001/debug/download/debug-4.3.4.tgz", + "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=", "requires": { "ms": "2.1.2" } }, "find-cache-dir": { "version": "2.1.0", - "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1630260009898&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz", + "resolved": "http://10.107.103.115:8001/find-cache-dir/download/find-cache-dir-2.1.0.tgz", "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", "requires": { "commondir": "^1.0.1", @@ -10747,15 +1679,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true, - "requires": {} + "dev": true }, "ansi-escapes": { "version": "3.2.0", @@ -12127,8 +3057,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "3.7.1", @@ -14178,6 +5107,17 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "http://10.107.103.115:8001/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "readdirp": { @@ -14471,8 +5411,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -14850,6 +5789,21 @@ "es-abstract": "^1.17.5" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "http://10.107.103.115:8001/string_decoder/download/string_decoder-1.3.0.tgz", + "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "http://10.107.103.115:8001/safe-buffer/download/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -15539,8 +6493,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "4.0.3", @@ -15792,7 +6745,7 @@ }, "zlib": { "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/zlib/download/zlib-1.0.5.tgz", + "resolved": "http://10.107.103.115:8001/zlib/download/zlib-1.0.5.tgz", "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=" } } diff --git a/packages/wxa-cli/src/const/wxaConfigs.js b/packages/wxa-cli/src/const/wxaConfigs.js index e6a51279..ba15a1c4 100644 --- a/packages/wxa-cli/src/const/wxaConfigs.js +++ b/packages/wxa-cli/src/const/wxaConfigs.js @@ -31,10 +31,12 @@ export default class DefaultWxaConfigs { test: /\.js$/, name: 'babel', }, - { - test: /\.sass|\.scss/, - name: 'sass', - }, + // sass is no longer default compiler in wxa project + // use postcss to transpiler your css file + // { + // test: /\.sass|\.scss/, + // name: 'sass', + // }, ], optimization: { splitDeps: { From 072d9be3631bae9d10a20bf09cbbfa627b272f57 Mon Sep 17 00:00:00 2001 From: WZT Date: Fri, 25 Mar 2022 17:10:34 +0800 Subject: [PATCH 02/20] chore(global component): init publish --- packages/wxa-plugin-global-component-inject/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wxa-plugin-global-component-inject/package.json b/packages/wxa-plugin-global-component-inject/package.json index 28de86c0..f448ab7a 100644 --- a/packages/wxa-plugin-global-component-inject/package.json +++ b/packages/wxa-plugin-global-component-inject/package.json @@ -1,6 +1,6 @@ { "name": "@wxa/plugin-global-component-inject", - "version": "2.2.0", + "version": "2.3.1", "description": "global component inject", "main": "index.js", "scripts": {}, From 0a90d9abde7f5e48fe4dd09706ca9630844acc61 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Fri, 28 May 2021 17:19:46 +0800 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20=E7=AE=80=E5=8D=95=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E6=96=87=E4=BB=B6=E5=86=85=E9=83=A8=E6=AD=BB=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/index.js | 61 +++++++ packages/wxa-cli/example/index.shaking.js | 39 +++++ packages/wxa-cli/example/user.js | 7 + packages/wxa-cli/src/tree-shake/index.js | 198 ++++++++++++++++++++++ packages/wxa-cli/src/tree-shake/scope.js | 0 5 files changed, 305 insertions(+) create mode 100644 packages/wxa-cli/example/index.js create mode 100644 packages/wxa-cli/example/index.shaking.js create mode 100644 packages/wxa-cli/example/user.js create mode 100644 packages/wxa-cli/src/tree-shake/index.js create mode 100644 packages/wxa-cli/src/tree-shake/scope.js diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js new file mode 100644 index 00000000..8af10435 --- /dev/null +++ b/packages/wxa-cli/example/index.js @@ -0,0 +1,61 @@ +/* eslint-disable one-var */ +import getMyUser, {getName as getMyName} from './user'; +import * as user from './user'; + +let a = {x: 1}, + n = 1; +let t = a; +function m(x = 1, y) { + a = 5; + ++a; + t = 9; + let qqq = 10; +} + +m(); + +let ttt = function({x: xxx, y}) {}; + +let sss = (a, b) => {}; + +[1, 2, 3].forEach(function(item) {}); + +{ +} +if (a) { +} + +for (i = 0; i < 100; i++) {} + +class myclass {} + +export function mm() {} + +export {m as qqqqq, a}; + +function name(params) { + let t = {q: 1}; + let q = 2; + q++; + t.q; +} + +let obj = { + x: 1, + t() {}, +}; + +(function(x, y) {})(); + +export default { + x: 1, + t() {}, + m, + age, +}; +export * from './user'; +// export {x, y} from './a'; + +/** +export default function(){} +*/ diff --git a/packages/wxa-cli/example/index.shaking.js b/packages/wxa-cli/example/index.shaking.js new file mode 100644 index 00000000..4c16076c --- /dev/null +++ b/packages/wxa-cli/example/index.shaking.js @@ -0,0 +1,39 @@ +/* eslint-disable one-var */ +import './user'; +import './user'; +let a = { + x: 1, +}; +let t = a; + +function m(x = 1, y) { + a = 5; + ++a; + t = 9; +} + +m(); +[1, 2, 3].forEach(function(item) {}); +{} + +if (a) {} + +for (i = 0; i < 100; i++) {} + +export {m as qqqqq, a}; + +(function(x, y) {})(); + +export default { + x: 1, + + t() {}, + + m, + age, +}; +export * from './user'; // export {x, y} from './a'; + +/** +export default function(){} +*/ diff --git a/packages/wxa-cli/example/user.js b/packages/wxa-cli/example/user.js new file mode 100644 index 00000000..21b56668 --- /dev/null +++ b/packages/wxa-cli/example/user.js @@ -0,0 +1,7 @@ +export function getName() { + +} + +export default function getUser(params) { + +} diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js new file mode 100644 index 00000000..a291a737 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -0,0 +1,198 @@ +let fs = require('fs'); +let path = require('path'); +let mkdirp = require('mkdirp'); +const {parse} = require('@babel/parser'); +const traverse = require('@babel/traverse').default; +const generate = require('@babel/generator').default; +const t = require('@babel/types'); + +function readFile(p) { + let rst = ''; + p = typeof p === 'object' ? path.join(p.dir, p.base) : p; + try { + rst = fs.readFileSync(p, 'utf-8'); + } catch (e) { + rst = null; + } + + return rst; +} + +function writeFile(p, data) { + let opath = typeof p === 'string' ? path.parse(p) : p; + mkdirp.sync(opath.dir); + fs.writeFileSync(p, data); +} + +let entrySrc = path.resolve(__dirname, '../../example/index.js'); +let code = readFile(entrySrc); + +let ast = parse(code, {sourceType: 'unambiguous'}); + +class Scope { + constructor(options) { + options = options || {}; + + this.parent = options.parent; + this.depth = this.parent ? this.parent.depth + 1 : 0; + this.names = options.params || []; + this.nodes = {}; + this.isBlockScope = !!options.block; + } + // 添加变量名 + // isBlockDeclaration 是否是块级声明:let const class import + add(node, name, isBlockDeclaration) { + if (!isBlockDeclaration && this.isBlockScope) { + // it's a `var` or function declaration, and this + // is a block scope, so we need to go up + this.parent.add(node, name, isBlockDeclaration); + } else { + this.names.push(name); + this.nodes[name] = node; + } + } + + contains(name) { + return !!this.findDefiningScope(name); + } + + findDefiningScope(name) { + if (this.names.includes(name)) { + return this; + } + + if (this.parent) { + return this.parent.findDefiningScope(name); + } + + return null; + } +} + +let scope = new Scope(); + +function addToScope(node, attr, isBlockDeclaration = false) { + let identifierNode = node[attr]; + + if (t.isIdentifier(identifierNode)) { + identifierNode._skip = true; + } + + node._used = 0; + scope.add(node, identifierNode.name, isBlockDeclaration); +} + +console.time('ast'); +traverse(ast, { + enter(path) { + let {node} = path; + let childScope; + switch (node.type) { + // 函数声明 function a(){} + case 'FunctionDeclaration': + childScope = new Scope({ + parent: scope, + block: false, + }); + addToScope(node, 'id', false); + // 箭头函数 ()=>{} + case 'ArrowFunctionExpression': + // 函数表达式 function(){} + case 'FunctionExpression': + childScope = new Scope({ + parent: scope, + block: false, + }); + break; + // 块级作用域{} + case 'BlockStatement': + childScope = new Scope({ + parent: scope, + block: true, + }); + break; + // 变量声明 + case 'VariableDeclaration': + node.declarations.forEach((variableDeclarator) => { + if (node.kind === 'let' || node.kind === 'const') { + addToScope(variableDeclarator, 'id', true); + } else { + addToScope(variableDeclarator, 'id', false); + } + }); + break; + // 类的声明 + case 'ClassDeclaration': + addToScope(node, 'id', true); + break; + // import 的声明 + case 'ImportDeclaration': + node.specifiers.forEach((specifier) => { + addToScope(specifier, 'local', true); + }); + break; + } + + if (childScope) { + node._scope = childScope; + scope = childScope; + } + }, + + // 退出节点 + exit(path) { + let {node} = path; + if (node._scope) { + scope = scope.parent; + } + }, +}); +console.timeEnd('ast'); + + +traverse(ast, { + enter(path) { + let {node} = path; + + if (node._scope) { + scope = node._scope; + } + + if (t.isIdentifier(node) && !node._skip) { + let defineScope = scope.findDefiningScope(node.name); + if (defineScope) { + defineScope.nodes[node.name]._used = 1; + } + } + }, +}); + +traverse(ast, { + enter(path) { + let {node} = path; + + if (node._used === 0) { + path.remove(); + } + }, +}); + +const output = generate( + ast, + { + /* options */ + }, + code +); + +writeFile( + path.resolve(__dirname, '../../example/index.shaking.js'), + output.code +); + + +// function name(params) { +// console.log(m); +// } + +// name(); diff --git a/packages/wxa-cli/src/tree-shake/scope.js b/packages/wxa-cli/src/tree-shake/scope.js new file mode 100644 index 00000000..e69de29b From 1077837eb479c9f996f1261f0f9a8f4f4618fee1 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Sun, 30 May 2021 22:32:41 +0800 Subject: [PATCH 04/20] =?UTF-8?q?feat:=20=E5=88=86=E6=9E=90=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/index.js | 6 +- .../{index.shaking.js => shaking/index.js} | 15 +- packages/wxa-cli/example/shaking/user.js | 0 packages/wxa-cli/src/tree-shake/index.js | 300 +++++++++++------- 4 files changed, 202 insertions(+), 119 deletions(-) rename packages/wxa-cli/example/{index.shaking.js => shaking/index.js} (68%) create mode 100644 packages/wxa-cli/example/shaking/user.js diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index 8af10435..e17a713a 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -6,6 +6,7 @@ let a = {x: 1}, n = 1; let t = a; function m(x = 1, y) { + a.x; a = 5; ++a; t = 9; @@ -31,7 +32,6 @@ class myclass {} export function mm() {} -export {m as qqqqq, a}; function name(params) { let t = {q: 1}; @@ -54,6 +54,10 @@ export default { age, }; export * from './user'; +export function getName() { + +} +export {m as qqqqq, a}; // export {x, y} from './a'; /** diff --git a/packages/wxa-cli/example/index.shaking.js b/packages/wxa-cli/example/shaking/index.js similarity index 68% rename from packages/wxa-cli/example/index.shaking.js rename to packages/wxa-cli/example/shaking/index.js index 4c16076c..3d5a18f5 100644 --- a/packages/wxa-cli/example/index.shaking.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -1,28 +1,29 @@ +/* eslint-disable no-var */ + /* eslint-disable one-var */ import './user'; import './user'; let a = { - x: 1, + x: 1 }; let t = a; function m(x = 1, y) { a = 5; ++a; - t = 9; } m(); -[1, 2, 3].forEach(function(item) {}); +[1, 2, 3].forEach(function (item) {}); {} if (a) {} for (i = 0; i < 100; i++) {} -export {m as qqqqq, a}; +export { m as qqqqq, a }; -(function(x, y) {})(); +(function (x, y) {})(); export default { x: 1, @@ -30,10 +31,12 @@ export default { t() {}, m, - age, + age }; export * from './user'; // export {x, y} from './a'; /** export default function(){} */ + +var qqqqq = 1; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js new file mode 100644 index 00000000..e69de29b diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index a291a737..a5b7da48 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -24,11 +24,6 @@ function writeFile(p, data) { fs.writeFileSync(p, data); } -let entrySrc = path.resolve(__dirname, '../../example/index.js'); -let code = readFile(entrySrc); - -let ast = parse(code, {sourceType: 'unambiguous'}); - class Scope { constructor(options) { options = options || {}; @@ -48,7 +43,12 @@ class Scope { this.parent.add(node, name, isBlockDeclaration); } else { this.names.push(name); - this.nodes[name] = node; + // 变量名可能重复,两个var声明同一变量 + if (this.nodes[name]) { + this.nodes[name].push(node); + } else { + this.nodes[name] = [node]; + } } } @@ -69,127 +69,203 @@ class Scope { } } -let scope = new Scope(); - -function addToScope(node, attr, isBlockDeclaration = false) { - let identifierNode = node[attr]; +class Graph { + constructor(entrySrc) { + this.entrySrc = entrySrc; + this.root = this.analysis(entrySrc); + } - if (t.isIdentifier(identifierNode)) { - identifierNode._skip = true; + getAbsolutePath(baseSrc, relativeSrc) { + return path.resolve(path.dirname(baseSrc), relativeSrc); } - node._used = 0; - scope.add(node, identifierNode.name, isBlockDeclaration); -} + analysis(src) { + let imports = {}; + let exports = {}; + let code = readFile(src); + let ast = parse(code, {sourceType: 'unambiguous'}); -console.time('ast'); -traverse(ast, { - enter(path) { - let {node} = path; - let childScope; - switch (node.type) { - // 函数声明 function a(){} - case 'FunctionDeclaration': - childScope = new Scope({ - parent: scope, - block: false, - }); - addToScope(node, 'id', false); - // 箭头函数 ()=>{} - case 'ArrowFunctionExpression': - // 函数表达式 function(){} - case 'FunctionExpression': - childScope = new Scope({ - parent: scope, - block: false, - }); - break; - // 块级作用域{} - case 'BlockStatement': - childScope = new Scope({ - parent: scope, - block: true, - }); - break; - // 变量声明 - case 'VariableDeclaration': - node.declarations.forEach((variableDeclarator) => { - if (node.kind === 'let' || node.kind === 'const') { - addToScope(variableDeclarator, 'id', true); - } else { - addToScope(variableDeclarator, 'id', false); - } - }); - break; - // 类的声明 - case 'ClassDeclaration': - addToScope(node, 'id', true); - break; - // import 的声明 - case 'ImportDeclaration': - node.specifiers.forEach((specifier) => { - addToScope(specifier, 'local', true); - }); - break; - } + let scope = new Scope(); + function addToScope(node, attr, isBlockDeclaration = false) { + let identifierNode = node[attr]; - if (childScope) { - node._scope = childScope; - scope = childScope; - } - }, + if (t.isIdentifier(identifierNode)) { + identifierNode._skip = true; + } - // 退出节点 - exit(path) { - let {node} = path; - if (node._scope) { - scope = scope.parent; + node._used = 0; + scope.add(node, identifierNode.name, isBlockDeclaration); } - }, -}); -console.timeEnd('ast'); + traverse(ast, { + enter: (path) => { + let {node} = path; + let childScope; + switch (node.type) { + // 函数声明 function a(){} + case 'FunctionDeclaration': + childScope = new Scope({ + parent: scope, + block: false, + }); + addToScope(node, 'id', false); + // 箭头函数 ()=>{} + case 'ArrowFunctionExpression': + // 函数表达式 function(){} + case 'FunctionExpression': + childScope = new Scope({ + parent: scope, + block: false, + }); + break; + // 块级作用域{} + case 'BlockStatement': + childScope = new Scope({ + parent: scope, + block: true, + }); + break; + // 变量声明 + case 'VariableDeclaration': + node.declarations.forEach((variableDeclarator) => { + if (node.kind === 'let' || node.kind === 'const') { + addToScope(variableDeclarator, 'id', true); + } else { + addToScope(variableDeclarator, 'id', false); + } + }); + break; + // 类的声明 + case 'ClassDeclaration': + addToScope(node, 'id', true); + break; + // import 的声明 + case 'ImportDeclaration': + node.specifiers.forEach((specifier) => { + addToScope(specifier, 'local', true); + }); -traverse(ast, { - enter(path) { - let {node} = path; + let depSrc = this.getAbsolutePath( + src, + node.source.value + '.js' + ); + imports[depSrc] = imports[depSrc] || []; + imports[depSrc] = imports[depSrc].concat([ + ...node.specifiers, + ]); + break; + // import 的声明 + case 'ExportNamedDeclaration': + exports[src] = exports[src] || []; + exports[src] = imports[src].concat([ + ...node.specifiers, + ]); + break; + } - if (node._scope) { - scope = node._scope; - } + if (childScope) { + node._scope = childScope; + scope = childScope; + } + }, + + // 退出节点 + exit(path) { + let {node} = path; + if (node._scope) { + scope = scope.parent; + } + }, + }); + + traverse(ast, { + enter(path) { + let {node} = path; + + if (node._scope) { + scope = node._scope; + } + + // obj.x 类型的属性访问,不算对x变量的使用 + if (t.isMemberExpression(node) && !node.computed) { + path.skip(); + } - if (t.isIdentifier(node) && !node._skip) { - let defineScope = scope.findDefiningScope(node.name); - if (defineScope) { - defineScope.nodes[node.name]._used = 1; + // TODO,怎么才算变量已经使用 + if (t.isIdentifier(node) && !node._skip) { + let defineScope = scope.findDefiningScope(node.name); + if (defineScope) { + defineScope.nodes[node.name].forEach((node) => { + node._used = 1; + }); + } + } + }, + // 退出节点 + exit(path) { + let {node} = path; + if (node._scope) { + scope = scope.parent; + } + }, + }); + + console.log(src); + console.log(imports); + console.log(exports); + + let dep = { + src, + code, + ast, + imports, + exports, + children: [], + scope, + }; + + Object.keys(dep.imports).forEach((childSrc, index) => { + dep.children[index] = this.analysis(childSrc); + }); + + return dep; + } +} + +let entrySrc = path.resolve(__dirname, '../../example/index.js'); +let graph = new Graph(entrySrc); +function run(dep) { + let {ast, scope, code, src} = dep; + + traverse(ast, { + enter(path) { + let {node} = path; + + if (node._used === 0) { + path.remove(); } - } - }, -}); + }, + }); -traverse(ast, { - enter(path) { - let {node} = path; + const output = generate( + ast, + { + /* options */ + }, + code + ); - if (node._used === 0) { - path.remove(); - } - }, -}); - -const output = generate( - ast, - { - /* options */ - }, - code -); - -writeFile( - path.resolve(__dirname, '../../example/index.shaking.js'), - output.code -); + writeFile( + path.resolve(path.dirname(src), './shaking', path.basename(src)), + output.code + ); + + dep.children.forEach((child) => { + run(child); + }); +} +run(graph.root); // function name(params) { // console.log(m); From dfe5eeacd5061c38ad85b970d25d4727881af206 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Fri, 4 Jun 2021 18:11:29 +0800 Subject: [PATCH 05/20] =?UTF-8?q?feat:=20=E7=AE=80=E5=8D=95=E8=BF=BD?= =?UTF-8?q?=E8=B8=AAimport/export?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/index.js | 40 ++- packages/wxa-cli/example/shaking/index.js | 28 +- packages/wxa-cli/example/shaking/user.js | 8 + packages/wxa-cli/example/user.js | 12 +- packages/wxa-cli/src/tree-shake/index.js | 315 ++++++++++++++++++++-- 5 files changed, 351 insertions(+), 52 deletions(-) diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index e17a713a..da89709d 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -2,6 +2,8 @@ import getMyUser, {getName as getMyName} from './user'; import * as user from './user'; + +console.console.log(getMyUser); let a = {x: 1}, n = 1; let t = a; @@ -28,10 +30,17 @@ if (a) { for (i = 0; i < 100; i++) {} -class myclass {} +class myclass { + [n]=1; + [n]=()=>{ + + } +} export function mm() {} +mm(); + function name(params) { let t = {q: 1}; @@ -47,19 +56,34 @@ let obj = { (function(x, y) {})(); -export default { - x: 1, - t() {}, - m, - age, -}; +// export default { +// x: 1, +// t() {}, +// m, +// age, +// }; export * from './user'; export function getName() { } -export {m as qqqqq, a}; +export {m as qqqqq, a as default}; + // export {x, y} from './a'; /** export default function(){} */ + +export {ss1s}; +// eslint-disable-next-line no-var +let ss1s=1; + +export { + mm as ttttttt, +}; + +export {getName as tttt} from './user'; + + +export * as tttttt from 'user'; + diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index 3d5a18f5..f869cb9e 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -1,5 +1,3 @@ -/* eslint-disable no-var */ - /* eslint-disable one-var */ import './user'; import './user'; @@ -9,8 +7,10 @@ let a = { let t = a; function m(x = 1, y) { + a.x; a = 5; ++a; + t = 9; } m(); @@ -21,22 +21,20 @@ if (a) {} for (i = 0; i < 100; i++) {} -export { m as qqqqq, a }; - -(function (x, y) {})(); +export function mm() {} -export default { - x: 1, +(function (x, y) {})(); // export default { +// x: 1, +// t() {}, +// m, +// age, +// }; - t() {}, - m, - age -}; -export * from './user'; // export {x, y} from './a'; +export * from './user'; +export function getName() {} +export { m as qqqqq, a as default }; // export {x, y} from './a'; /** export default function(){} -*/ - -var qqqqq = 1; \ No newline at end of file +*/ \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index e69de29b..85fd8cb7 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -0,0 +1,8 @@ +export function getName() {} // export default function getUser(params) { +// } + +let a = 1; +export default a; // eslint-disable-next-line one-var + +export let mm1 = 1, + c = function mm2(params) {}; \ No newline at end of file diff --git a/packages/wxa-cli/example/user.js b/packages/wxa-cli/example/user.js index 21b56668..3b5a254a 100644 --- a/packages/wxa-cli/example/user.js +++ b/packages/wxa-cli/example/user.js @@ -2,6 +2,14 @@ export function getName() { } -export default function getUser(params) { +// export default function getUser(params) { -} +// } + +let a =1; +export default a; + +// eslint-disable-next-line one-var +export let mm1 =1, c=function mm2(params) { + +}; diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index a5b7da48..57116144 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -79,6 +79,22 @@ class Graph { return path.resolve(path.dirname(baseSrc), relativeSrc); } + getExpSrc(node, src) { + let expSrc = ''; + + if (node.source) { + expSrc = this.getAbsolutePath(src, node.source.value + '.js'); + } else { + expSrc = src; + } + + return expSrc; + } + + markShakingFlag(node) { + node._shake = 1; + } + analysis(src) { let imports = {}; let exports = {}; @@ -93,7 +109,7 @@ class Graph { identifierNode._skip = true; } - node._used = 0; + node._usedNodes = []; scope.add(node, identifierNode.name, isBlockDeclaration); } @@ -145,21 +161,81 @@ class Graph { addToScope(specifier, 'local', true); }); - let depSrc = this.getAbsolutePath( + let impSrc = this.getAbsolutePath( src, node.source.value + '.js' ); - imports[depSrc] = imports[depSrc] || []; - imports[depSrc] = imports[depSrc].concat([ - ...node.specifiers, - ]); + imports[impSrc] = imports[impSrc] || {}; + node.specifiers.forEach((specifier) => { + let name = + specifier.imported && specifier.imported.name; + if (!name) { + if ( + specifier.type === 'ImportDefaultSpecifier' + ) { + name = 'default'; + } else if ( + specifier.type === + 'ImportNamespaceSpecifier' + ) { + name = '*'; + } + } + imports[impSrc][name] = specifier; + }); break; - // import 的声明 + // export 的声明 case 'ExportNamedDeclaration': - exports[src] = exports[src] || []; - exports[src] = imports[src].concat([ - ...node.specifiers, - ]); + let expSrc = this.getExpSrc(node, src); + + exports[expSrc] = exports[expSrc] || {}; + + if (node.specifiers && node.specifiers.length) { + node.specifiers.forEach((specifier) => { + let name = specifier.exported.name; + exports[expSrc][name] = specifier; + this.markShakingFlag(specifier); + }); + } else { + let declaration = node.declaration; + + if (declaration.type === 'FunctionDeclaration') { + let name = declaration.id.name; + exports[expSrc][name] = declaration; + declaration._shake = 1; + this.markShakingFlag(declaration); + } else if ( + declaration.type === 'VariableDeclaration' + ) { + declaration.declarations.forEach( + (variableDeclarator) => { + let name = variableDeclarator.id.name; + exports[expSrc][name] = + variableDeclarator; + this.markShakingFlag( + variableDeclarator + ); + } + ); + } else if ( + declaration.type === 'ClassDeclaration' + ) { + let name = declaration.id.name; + exports[expSrc][name] = declaration; + this.markShakingFlag(declaration); + } + } + break; + case 'ExportDefaultDeclaration': + exports[src] = exports[src] || {}; + exports[src].default = node; + this.markShakingFlag(node); + break; + case 'ExportAllDeclaration': + let exportSrc = this.getExpSrc(node, src); + exports[exportSrc] = exports[exportSrc] || {}; + exports[exportSrc]['*'] = node; + this.markShakingFlag(node); break; } @@ -178,27 +254,71 @@ class Graph { }, }); + function findScope(node) { + let defineScope = scope.findDefiningScope(node.name); + if (defineScope) { + defineScope.nodes[node.name].forEach((node) => { + node._usedNodes.push(node); + }); + } + } + traverse(ast, { - enter(path) { + enter: (path) => { let {node} = path; if (node._scope) { scope = node._scope; } - // obj.x 类型的属性访问,不算对x变量的使用 - if (t.isMemberExpression(node) && !node.computed) { - path.skip(); - } + // else if (node.type === 'ExportNamedDeclaration') { + // node.specifiers.forEach((specifier) => { + // let nodes = scope.nodes[specifier.local.name]; + // if (nodes) { + // nodes.forEach((node) => { + // this.markShakingFlag(node); + // }); + + // specifier._referenceNodes = nodes; + // } + // }); + // } else if ( + // // export default {} + // node.type === 'ExportDefaultDeclaration' && + // node.declaration.type === 'ObjectExpression' + // ) { + // node.declaration.properties.forEach((p)=>{ + // if (p.computed) { + // let nodes = scope.nodes[p.key.name]; + // if (nodes) { + // node._referenceNodes = nodes; + // } + // } + // // let nodes + // // TODO,如何判断对象属性中对外部变量的引用 + // }); + // } - // TODO,怎么才算变量已经使用 - if (t.isIdentifier(node) && !node._skip) { - let defineScope = scope.findDefiningScope(node.name); - if (defineScope) { - defineScope.nodes[node.name].forEach((node) => { - node._used = 1; - }); - } + // obj.x 类型的属性访问,不算对x变量的使用 + if (node.type === 'MemberExpression') { + !node.computed && path.skip(); + } else if (node.type === 'ObjectProperty') { + // {x:1} 对象属性 + !node.computed && path.skipKey('key'); + } else if ( + [ + 'ClassMethod', + 'ClassPrivateMethod', + 'ClassProperty', + 'ClassDeclaration', + ].includes(node.type) + ) { + !node.computed && path.skipKey('key'); + } else if (t.isIdentifier(node)) { + // TODO,怎么才算变量已经使用 + // 这里的判断不准确,无法判断类似函数a引用函数b,但a并没有没使用到 + // 这里只会去除掉函数a,去除不了函数b + !node._skip && findScope(node); } }, // 退出节点 @@ -211,8 +331,41 @@ class Graph { }); console.log(src); - console.log(imports); - console.log(exports); + console.log('imports', imports); + console.log('exports', exports); + + // import * 和 export * 不包括default + // export * from '' 和 export 本文件冲突,export 本文件优先级更高 + // export * from '' 互相冲突,后export * from '' 优先 + // export {} from '', 从其他文件导出,导出的变量无法在本文件使用 + /** + * imports: { + * [路径]: { + * [name]: ImportSpecifier, + * default: ImportDefaultSpecifier, + * *: ImportNamespaceSpecifier + * } + * } + * + * exports: { + * [本文件路径]: { + * // export function(){} + * [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration + * // export default function(){} | export default{} | export {a as default} | export default a + * default: ExportDefaultDeclaration | ExportSpecifier, + * // export {a as aaa,b,c} + * [name]: ExportSpecifier + * }, + * [其他路径]: { + * // export {a as aaa,b,c} from '' | export * as all from '' + * [name]: ExportSpecifier + * // export {default} from '' | export {a as default} from '' | export * as default from '' + * default: ExportSpecifier, + * // export * from '' + * *: ExportAllDeclaration + * }, + * } + */ let dep = { src, @@ -224,6 +377,8 @@ class Graph { scope, }; + // TODO,只是imports节点不准确 + // export {} from './a' a 文件也是子节点 Object.keys(dep.imports).forEach((childSrc, index) => { dep.children[index] = this.analysis(childSrc); }); @@ -234,6 +389,111 @@ class Graph { let entrySrc = path.resolve(__dirname, '../../example/index.js'); let graph = new Graph(entrySrc); + +/** + * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 + * 输出时,判断export node 的_shake,当等于1时,遍历子节点,看是否有声明节点,如果声明节点未被引用才可以shake掉 + * + */ + +function shake(dep) { + let imports = dep.imports; + + let mark = (dep, usedNames, childSrc) => { + if (usedNames.length) { + let child = dep.children.find((child) => child.src === childSrc); + let exportsArray = Object.entries(child.exports); + let localIndex = exportsArray.findIndex( + ([src]) => src == child.src + ); + let localExports = null; + let externalExports = [...exportsArray]; + if (localIndex !== -1) { + localExports = externalExports.splice(localIndex, 1); + } + + let hasAll = usedNames.some((name) => name === '*'); + let usedExports = {}; + let addUsedExport = (src, node) => { + usedExports[src] = usedExports[src] || {}; + let local = node.local; + if (local) { + usedExports[src][local.name] = node; + } else { + usedExports[src]['*'] = node; + } + }; + if (hasAll) { + let hasDefalut = usedNames.some((name) => name === 'default'); + let markedDefalut = false; + if (localExports) { + localExports.forEach(([src, value]) => { + Object.entries(value).forEach(([name, node]) => { + if (name === 'default') { + if (hasDefalut) { + node._shake = 0; + markedDefalut = true; + } + } else { + node._shake = 0; + } + }); + }); + } + + externalExports.forEach(([src, value]) => { + Object.entries(value).forEach(([name, node]) => { + if ( + (name === 'default' && + hasDefalut && + !markedDefalut) || + name !== 'default' + ) { + node._shake = 0; + addUsedExport(src, node); + } + }); + }); + } else { + usedNames.forEach((name) => { + if (localExports) { + let node = localExports[1][name]; + if (node) { + node._shake = 0; + return; + } + } + + externalExports.forEach(([src, value]) => { + let node = value[name] || value['*']; + if (node) { + node._shake = 0; + addUsedExport(src, node); + } + }); + }); + } + + Object.entries(usedExports).forEach((src, value)=>{ + mark(child, Object.keys(value), src); + }); + } + }; + + Object.entries(imports).forEach(([src, value], index) => { + let usedNames = []; + + Object.entries(value).forEach(([name, node]) => { + if (node._usedNodes && node._usedNodes.length) { + usedNames.push(name); + } + }); + mark(dep, usedNames, src); + }); + + dep.children.forEach((child)=>shake(child)); +} + function run(dep) { let {ast, scope, code, src} = dep; @@ -241,7 +501,7 @@ function run(dep) { enter(path) { let {node} = path; - if (node._used === 0) { + if (node._usedNodes && node._usedNodes.length === 0) { path.remove(); } }, @@ -265,6 +525,7 @@ function run(dep) { }); } +// shake(graph.root); run(graph.root); // function name(params) { From ec42c3ea5ced0a6135681a4c5e0cc3f18803d181 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Sun, 6 Jun 2021 22:52:28 +0800 Subject: [PATCH 06/20] =?UTF-8?q?fix:=20=E4=B8=80=E4=BA=9B=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/src/tree-shake/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 57116144..645cf330 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -387,8 +387,6 @@ class Graph { } } -let entrySrc = path.resolve(__dirname, '../../example/index.js'); -let graph = new Graph(entrySrc); /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 @@ -525,7 +523,9 @@ function run(dep) { }); } -// shake(graph.root); +let entrySrc = path.resolve(__dirname, '../../example/index.js'); +let graph = new Graph(entrySrc); +shake(graph.root); run(graph.root); // function name(params) { From bb6070f6eecc82f58aa8bfbe9df502e631f6aa56 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Mon, 7 Jun 2021 20:04:01 +0800 Subject: [PATCH 07/20] =?UTF-8?q?feat:=20=E5=88=9D=E6=AD=A5=E5=AE=8C?= =?UTF-8?q?=E6=88=90tree-shake?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/index.js | 27 ++- packages/wxa-cli/example/shaking/index.js | 30 ++-- packages/wxa-cli/example/shaking/user.js | 4 +- packages/wxa-cli/src/tree-shake/index.js | 197 ++++++++++++++++------ 4 files changed, 173 insertions(+), 85 deletions(-) diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index da89709d..9b1b41be 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -3,18 +3,17 @@ import getMyUser, {getName as getMyName} from './user'; import * as user from './user'; -console.console.log(getMyUser); +console.log(user); let a = {x: 1}, n = 1; -let t = a; +let t = 10; function m(x = 1, y) { - a.x; a = 5; ++a; t = 9; + t+5; let qqq = 10; } - m(); let ttt = function({x: xxx, y}) {}; @@ -25,12 +24,11 @@ let sss = (a, b) => {}; { } -if (a) { -} + for (i = 0; i < 100; i++) {} -class myclass { +class Myclass { [n]=1; [n]=()=>{ @@ -56,9 +54,12 @@ let obj = { (function(x, y) {})(); + +getName(); // export default { // x: 1, -// t() {}, +// t() { +// }, // m, // age, // }; @@ -66,17 +67,14 @@ export * from './user'; export function getName() { } -export {m as qqqqq, a as default}; +// export {m as qqqqq, a as default}; // export {x, y} from './a'; -/** -export default function(){} -*/ +export default function() {} -export {ss1s}; +export {Myclass}; // eslint-disable-next-line no-var -let ss1s=1; export { mm as ttttttt, @@ -87,3 +85,4 @@ export {getName as tttt} from './user'; export * as tttttt from 'user'; + diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index f869cb9e..508d0dbc 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -1,40 +1,44 @@ /* eslint-disable one-var */ import './user'; -import './user'; +import * as user from './user'; +console.log(user); let a = { - x: 1 + x: 1, }; let t = a; function m(x = 1, y) { - a.x; + // eslint-disable-next-line no-tabs a = 5; ++a; t = 9; } m(); -[1, 2, 3].forEach(function (item) {}); +[1, 2, 3].forEach(function(item) {}); {} -if (a) {} for (i = 0; i < 100; i++) {} export function mm() {} +mm(); + +(function(x, y) {})(); -(function (x, y) {})(); // export default { +getName(); // export default { // x: 1, -// t() {}, +// t() { +// }, // m, // age, // }; +export function getName() {} // export {m as qqqqq, a as default}; +// export {x, y} from './a'; -export * from './user'; -export function getName() {} -export { m as qqqqq, a as default }; // export {x, y} from './a'; +export {}; // eslint-disable-next-line no-var -/** -export default function(){} -*/ \ No newline at end of file +export {}; +export {} from './user'; +export {} from 'user'; diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index 85fd8cb7..af191737 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -1,8 +1,6 @@ export function getName() {} // export default function getUser(params) { // } -let a = 1; -export default a; // eslint-disable-next-line one-var - +// eslint-disable-next-line one-var export let mm1 = 1, c = function mm2(params) {}; \ No newline at end of file diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 645cf330..71559b4a 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -33,6 +33,10 @@ class Scope { this.names = options.params || []; this.nodes = {}; this.isBlockScope = !!options.block; + this.children = []; + if (this.parent) { + this.parent.children.push(this); + } } // 添加变量名 // isBlockDeclaration 是否是块级声明:let const class import @@ -99,17 +103,23 @@ class Graph { let imports = {}; let exports = {}; let code = readFile(src); - let ast = parse(code, {sourceType: 'unambiguous'}); + let ast = parse(code, { + sourceType: 'unambiguous', + plugins: ['classProperties'], + }); let scope = new Scope(); function addToScope(node, attr, isBlockDeclaration = false) { let identifierNode = node[attr]; - if (t.isIdentifier(identifierNode)) { - identifierNode._skip = true; + // 类似于export default function(){} + if (!identifierNode || !identifierNode.name) { + return; } - node._usedNodes = []; + identifierNode._skip = true; + + node._usedByNodes = []; scope.add(node, identifierNode.name, isBlockDeclaration); } @@ -257,8 +267,8 @@ class Graph { function findScope(node) { let defineScope = scope.findDefiningScope(node.name); if (defineScope) { - defineScope.nodes[node.name].forEach((node) => { - node._usedNodes.push(node); + defineScope.nodes[node.name].forEach((declarationNode) => { + declarationNode._usedByNodes.push(node); }); } } @@ -271,34 +281,6 @@ class Graph { scope = node._scope; } - // else if (node.type === 'ExportNamedDeclaration') { - // node.specifiers.forEach((specifier) => { - // let nodes = scope.nodes[specifier.local.name]; - // if (nodes) { - // nodes.forEach((node) => { - // this.markShakingFlag(node); - // }); - - // specifier._referenceNodes = nodes; - // } - // }); - // } else if ( - // // export default {} - // node.type === 'ExportDefaultDeclaration' && - // node.declaration.type === 'ObjectExpression' - // ) { - // node.declaration.properties.forEach((p)=>{ - // if (p.computed) { - // let nodes = scope.nodes[p.key.name]; - // if (nodes) { - // node._referenceNodes = nodes; - // } - // } - // // let nodes - // // TODO,如何判断对象属性中对外部变量的引用 - // }); - // } - // obj.x 类型的属性访问,不算对x变量的使用 if (node.type === 'MemberExpression') { !node.computed && path.skip(); @@ -314,7 +296,7 @@ class Graph { ].includes(node.type) ) { !node.computed && path.skipKey('key'); - } else if (t.isIdentifier(node)) { + } else if (node.type === 'Identifier') { // TODO,怎么才算变量已经使用 // 这里的判断不准确,无法判断类似函数a引用函数b,但a并没有没使用到 // 这里只会去除掉函数a,去除不了函数b @@ -330,14 +312,15 @@ class Graph { }, }); - console.log(src); - console.log('imports', imports); - console.log('exports', exports); + // console.log(src); + // console.log('imports', imports); + // console.log('exports', exports); // import * 和 export * 不包括default // export * from '' 和 export 本文件冲突,export 本文件优先级更高 // export * from '' 互相冲突,后export * from '' 优先 // export {} from '', 从其他文件导出,导出的变量无法在本文件使用 + // export default function(){},导出的函数没有name,不能再本文件使用 /** * imports: { * [路径]: { @@ -387,7 +370,6 @@ class Graph { } } - /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 * 输出时,判断export node 的_shake,当等于1时,遍历子节点,看是否有声明节点,如果声明节点未被引用才可以shake掉 @@ -407,7 +389,7 @@ function shake(dep) { let localExports = null; let externalExports = [...exportsArray]; if (localIndex !== -1) { - localExports = externalExports.splice(localIndex, 1); + localExports = externalExports.splice(localIndex, 1)[0]; } let hasAll = usedNames.some((name) => name === '*'); @@ -425,17 +407,15 @@ function shake(dep) { let hasDefalut = usedNames.some((name) => name === 'default'); let markedDefalut = false; if (localExports) { - localExports.forEach(([src, value]) => { - Object.entries(value).forEach(([name, node]) => { - if (name === 'default') { - if (hasDefalut) { - node._shake = 0; - markedDefalut = true; - } - } else { + Object.entries(localExports[1]).forEach(([name, node]) => { + if (name === 'default') { + if (hasDefalut) { node._shake = 0; + markedDefalut = true; } - }); + } else { + node._shake = 0; + } }); } @@ -472,7 +452,7 @@ function shake(dep) { }); } - Object.entries(usedExports).forEach((src, value)=>{ + Object.entries(usedExports).forEach((src, value) => { mark(child, Object.keys(value), src); }); } @@ -482,24 +462,96 @@ function shake(dep) { let usedNames = []; Object.entries(value).forEach(([name, node]) => { - if (node._usedNodes && node._usedNodes.length) { + if (node._usedByNodes && node._usedByNodes.length) { usedNames.push(name); } }); mark(dep, usedNames, src); }); - dep.children.forEach((child)=>shake(child)); + dep.children.forEach((child) => shake(child)); +} + +function remove(dep) { + let {ast, scope, code, src, exports} = dep; + let loop = true; + let doRemove = (scope) => { + let {nodes: allNodes} = scope; + Object.values(allNodes).forEach((nodes) => { + nodes.forEach((node) => { + if (node._removed === 1) { + return; + } + + if (t.isClassDeclaration(node)) { + console.log('--------------'); + console.log(node._usedByNodes[0]); + } + + if ( + (node._usedByNodes.length === 0 && + (node._shake === 1 || node._shake === undefined)) || + (node._usedByNodes.length !== 0 && + node._usedByNodes.every( + (node) => node._removed || node._shake === 1 + )) + ) { + node._removed = 1; + loop = true; + + traverse(node, { + noScope: true, + enter(path) { + let {node} = path; + node._removed = 1; + }, + }); + } + }); + }); + + scope.children.forEach((childScope) => { + doRemove(childScope); + }); + }; + + while (loop) { + Object.entries(exports).forEach(([src, value]) => { + Object.entries(value).forEach(([name, node]) => { + if ( + node._shake === 1 && + (!node._usedByNodes || + (node._usedByNodes && node._usedByNodes.length === 0)) + ) { + traverse(node, { + noScope: true, + enter(path) { + let {node} = path; + node._shake = 1; + }, + }); + } else { + node._shake = 0; + } + }); + }); + loop = false; + doRemove(scope); + } + + dep.children.forEach((child) => remove(child)); } function run(dep) { - let {ast, scope, code, src} = dep; + let {ast, code, src} = dep; traverse(ast, { enter(path) { let {node} = path; - - if (node._usedNodes && node._usedNodes.length === 0) { + if ( + node._removed === 1 || + (!node._usedByNodes && node._shake === 1) + ) { path.remove(); } }, @@ -523,13 +575,48 @@ function run(dep) { }); } +console.time('end'); let entrySrc = path.resolve(__dirname, '../../example/index.js'); let graph = new Graph(entrySrc); shake(graph.root); +remove(graph.root); run(graph.root); +console.timeEnd('end'); // function name(params) { // console.log(m); // } // name(); + +// let code = `function scopeOnce() { +// var ref = "This is a binding"; +// var xx = 'binding2' + +// if(xx){ +// let oo="binding3" +// } + +// ref + '1'; // This is a reference to a binding + +// function scopeTwo() { +// ref+'2'; // This is a reference to a binding from a lower scope +// } +// }`; +// let ast = parse(code, {sourceType: 'unambiguous'}); +// traverse(ast, { +// enter(path) { +// let {node} =path; +// if (node.type === 'VariableDeclarator') { +// console.log(path.scope); +// } +// }, +// }); + +// console.log(generate( +// ast, +// { +// /* options */ +// }, +// code +// ).code); From 612724c55cf4b7a450f1afedb5a6fbb91a65e99e Mon Sep 17 00:00:00 2001 From: sparklinm Date: Wed, 9 Jun 2021 11:20:23 +0800 Subject: [PATCH 08/20] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/shaking/index.js | 5 +- packages/wxa-cli/src/my.html | 18 + packages/wxa-cli/src/tree-shake/graph.js | 292 +++++++++++++++ packages/wxa-cli/src/tree-shake/index.js | 435 +++------------------- packages/wxa-cli/src/tree-shake/scope.js | 53 +++ packages/wxa-cli/src/tree-shake/util.js | 26 ++ 6 files changed, 453 insertions(+), 376 deletions(-) create mode 100644 packages/wxa-cli/src/my.html create mode 100644 packages/wxa-cli/src/tree-shake/graph.js create mode 100644 packages/wxa-cli/src/tree-shake/util.js diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index 508d0dbc..b64b1d09 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -5,20 +5,19 @@ console.log(user); let a = { x: 1, }; -let t = a; +let t = 10; function m(x = 1, y) { - // eslint-disable-next-line no-tabs a = 5; ++a; t = 9; + t + 5; } m(); [1, 2, 3].forEach(function(item) {}); {} - for (i = 0; i < 100; i++) {} export function mm() {} diff --git a/packages/wxa-cli/src/my.html b/packages/wxa-cli/src/my.html new file mode 100644 index 00000000..ae101b94 --- /dev/null +++ b/packages/wxa-cli/src/my.html @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js new file mode 100644 index 00000000..7ebbe529 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -0,0 +1,292 @@ +const path = require('path'); +const {parse} = require('@babel/parser'); +const traverse = require('@babel/traverse').default; +const {Scope} = require('./scope'); +const {readFile} = require('./util'); + +class Graph { + constructor(entrySrc) { + this.entrySrc = entrySrc; + this.root = this.analysis(entrySrc); + } + + getAbsolutePath(baseSrc, relativeSrc) { + return path.resolve(path.dirname(baseSrc), relativeSrc); + } + + getExpSrc(node, src) { + let expSrc = ''; + + if (node.source) { + expSrc = this.getAbsolutePath(src, node.source.value + '.js'); + } else { + expSrc = src; + } + + return expSrc; + } + + collectDeclaration(path, scope) { + function addToScope(node, attr, isBlockDeclaration = false) { + let identifierNode = node[attr]; + + // 类似于export default function(){} + if (!identifierNode || !identifierNode.name) { + return; + } + + identifierNode._skip = true; + + node._usedByNodes = []; + scope.add(node, identifierNode.name, isBlockDeclaration); + } + + let {node} = path; + let childScope; + + switch (node.type) { + // 函数声明 function a(){} + case 'FunctionDeclaration': + childScope = new Scope({ + parent: scope, + block: false, + }); + addToScope(node, 'id', false); + // 箭头函数 ()=>{} + case 'ArrowFunctionExpression': + // 函数表达式 function(){} + case 'FunctionExpression': + childScope = new Scope({ + parent: scope, + block: false, + }); + break; + // 块级作用域{} + case 'BlockStatement': + childScope = new Scope({ + parent: scope, + block: true, + }); + break; + // 变量声明 + case 'VariableDeclaration': + node.declarations.forEach((variableDeclarator) => { + if (node.kind === 'let' || node.kind === 'const') { + addToScope(variableDeclarator, 'id', true); + } else { + addToScope(variableDeclarator, 'id', false); + } + }); + break; + // 类的声明 + case 'ClassDeclaration': + addToScope(node, 'id', true); + break; + // import 的声明 + case 'ImportDeclaration': + node.specifiers.forEach((specifier) => { + addToScope(specifier, 'local', true); + }); + break; + } + + return childScope; + } + + collectImport(path) { + let {node} = path; + let importInfo = null; + + switch (node.type) { + // import 的声明 + case 'ImportDeclaration': + importInfo = {}; + node.specifiers.forEach((specifier) => { + let name = specifier.imported && specifier.imported.name; + if (!name) { + if (specifier.type === 'ImportDefaultSpecifier') { + name = 'default'; + } else if ( + specifier.type === 'ImportNamespaceSpecifier' + ) { + name = '*'; + } + } + importInfo[name] = specifier; + }); + break; + } + + return importInfo; + } + + collectExport(path) { + let {node} = path; + let exportInfo = null; + + let markShakingFlag = (node) => { + node._shake = 1; + }; + + switch (node.type) { + // export 的声明 + case 'ExportNamedDeclaration': + exportInfo = {}; + if (node.specifiers && node.specifiers.length) { + node.specifiers.forEach((specifier) => { + let name = specifier.exported.name; + exportInfo[name] = specifier; + markShakingFlag(specifier); + }); + } else { + let declaration = node.declaration; + + if (declaration.type === 'FunctionDeclaration') { + let name = declaration.id.name; + exportInfo[name] = declaration; + declaration._shake = 1; + markShakingFlag(declaration); + } else if (declaration.type === 'VariableDeclaration') { + declaration.declarations.forEach( + (variableDeclarator) => { + let name = variableDeclarator.id.name; + exportInfo[name] = variableDeclarator; + markShakingFlag(variableDeclarator); + } + ); + } else if (declaration.type === 'ClassDeclaration') { + let name = declaration.id.name; + exportInfo[name] = declaration; + markShakingFlag(declaration); + } + } + break; + case 'ExportDefaultDeclaration': + exportInfo = {}; + exportInfo.default = node; + markShakingFlag(node); + break; + case 'ExportAllDeclaration': + exportInfo = {}; + exportInfo['*'] = node; + markShakingFlag(node); + break; + } + + return exportInfo; + } + + analysis(src) { + let imports = {}; + let exports = {}; + let code = readFile(src); + let ast = parse(code, { + sourceType: 'unambiguous', + plugins: ['classProperties'], + }); + + let scope = new Scope(); + + traverse(ast, { + enter: (path) => { + let {node} = path; + + let childScope = this.collectDeclaration(path, scope); + if (childScope) { + node._scope = childScope; + scope = childScope; + } + + let importInfo = this.collectImport(path); + if (importInfo) { + let impSrc = this.getAbsolutePath( + src, + node.source.value + '.js' + ); + imports[impSrc] = imports[impSrc] || {}; + imports[impSrc] = {...imports[impSrc], ...importInfo}; + } + + let exportInfo = this.collectExport(path); + if (exportInfo) { + let expSrc = this.getExpSrc(node, src); + exports[expSrc] = exports[expSrc] || {}; + exports[expSrc] = {...exports[expSrc], ...exportInfo}; + } + }, + + // 退出节点 + exit(path) { + let {node} = path; + if (node._scope) { + scope = scope.parent; + } + }, + }); + + // console.log(src); + // console.log('imports', imports); + // console.log('exports', exports); + + // import * 和 export * 不包括default + // export * from '' 和 export 本文件冲突,export 本文件优先级更高 + // export * from '' 互相冲突,后export * from '' 优先 + // export {} from '', 从其他文件导出,导出的变量无法在本文件使用 + // export default function(){},导出的函数没有name,不能在本文件使用 + /** + * imports: { + * [路径]: { + * [name]: ImportSpecifier, + * default: ImportDefaultSpecifier, + * *: ImportNamespaceSpecifier + * } + * } + * + * exports: { + * [本文件路径]: { + * // export function(){} + * [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration + * // export default function(){} | export default{} | export {a as default} | export default a + * default: ExportDefaultDeclaration | ExportSpecifier, + * // export {a as aaa,b,c} + * [name]: ExportSpecifier + * }, + * [其他路径]: { + * // export {a as aaa,b,c} from '' | export * as all from '' + * [name]: ExportSpecifier + * // export {default} from '' | export {a as default} from '' | export * as default from '' + * default: ExportSpecifier, + * // export * from '' + * *: ExportAllDeclaration + * }, + * } + */ + + let dep = { + src, + code, + ast, + imports, + exports, + children: [], + scope, + }; + + Object.keys(dep.imports).forEach((childSrc, index) => { + dep.children.push(this.analysis(childSrc)); + }); + + // export {} from './a' a 文件也是子节点 + Object.keys(dep.exports).forEach((childSrc, index) => { + if (childSrc !== src) { + dep.children.push(this.analysis(childSrc)); + } + }); + + return dep; + } +} + +module.exports = { + Graph, +}; diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 71559b4a..03859a2f 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,278 +1,24 @@ -let fs = require('fs'); let path = require('path'); -let mkdirp = require('mkdirp'); -const {parse} = require('@babel/parser'); const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; -const t = require('@babel/types'); - -function readFile(p) { - let rst = ''; - p = typeof p === 'object' ? path.join(p.dir, p.base) : p; - try { - rst = fs.readFileSync(p, 'utf-8'); - } catch (e) { - rst = null; - } - return rst; -} +let {writeFile} = require('./util'); +let {Graph} = require('./graph'); -function writeFile(p, data) { - let opath = typeof p === 'string' ? path.parse(p) : p; - mkdirp.sync(opath.dir); - fs.writeFileSync(p, data); -} +function collectReferences(dep) { + let {ast, scope} = dep; -class Scope { - constructor(options) { - options = options || {}; - - this.parent = options.parent; - this.depth = this.parent ? this.parent.depth + 1 : 0; - this.names = options.params || []; - this.nodes = {}; - this.isBlockScope = !!options.block; - this.children = []; - if (this.parent) { - this.parent.children.push(this); - } - } - // 添加变量名 - // isBlockDeclaration 是否是块级声明:let const class import - add(node, name, isBlockDeclaration) { - if (!isBlockDeclaration && this.isBlockScope) { - // it's a `var` or function declaration, and this - // is a block scope, so we need to go up - this.parent.add(node, name, isBlockDeclaration); - } else { - this.names.push(name); - // 变量名可能重复,两个var声明同一变量 - if (this.nodes[name]) { - this.nodes[name].push(node); - } else { - this.nodes[name] = [node]; - } - } - } - - contains(name) { - return !!this.findDefiningScope(name); - } - - findDefiningScope(name) { - if (this.names.includes(name)) { - return this; - } - - if (this.parent) { - return this.parent.findDefiningScope(name); - } - - return null; - } -} - -class Graph { - constructor(entrySrc) { - this.entrySrc = entrySrc; - this.root = this.analysis(entrySrc); - } - - getAbsolutePath(baseSrc, relativeSrc) { - return path.resolve(path.dirname(baseSrc), relativeSrc); - } - - getExpSrc(node, src) { - let expSrc = ''; - - if (node.source) { - expSrc = this.getAbsolutePath(src, node.source.value + '.js'); - } else { - expSrc = src; - } - - return expSrc; - } - - markShakingFlag(node) { - node._shake = 1; - } - - analysis(src) { - let imports = {}; - let exports = {}; - let code = readFile(src); - let ast = parse(code, { - sourceType: 'unambiguous', - plugins: ['classProperties'], - }); - - let scope = new Scope(); - function addToScope(node, attr, isBlockDeclaration = false) { - let identifierNode = node[attr]; - - // 类似于export default function(){} - if (!identifierNode || !identifierNode.name) { - return; - } - - identifierNode._skip = true; - - node._usedByNodes = []; - scope.add(node, identifierNode.name, isBlockDeclaration); - } - - traverse(ast, { - enter: (path) => { - let {node} = path; - let childScope; - switch (node.type) { - // 函数声明 function a(){} - case 'FunctionDeclaration': - childScope = new Scope({ - parent: scope, - block: false, - }); - addToScope(node, 'id', false); - // 箭头函数 ()=>{} - case 'ArrowFunctionExpression': - // 函数表达式 function(){} - case 'FunctionExpression': - childScope = new Scope({ - parent: scope, - block: false, - }); - break; - // 块级作用域{} - case 'BlockStatement': - childScope = new Scope({ - parent: scope, - block: true, - }); - break; - // 变量声明 - case 'VariableDeclaration': - node.declarations.forEach((variableDeclarator) => { - if (node.kind === 'let' || node.kind === 'const') { - addToScope(variableDeclarator, 'id', true); - } else { - addToScope(variableDeclarator, 'id', false); - } - }); - break; - // 类的声明 - case 'ClassDeclaration': - addToScope(node, 'id', true); - break; - // import 的声明 - case 'ImportDeclaration': - node.specifiers.forEach((specifier) => { - addToScope(specifier, 'local', true); - }); - - let impSrc = this.getAbsolutePath( - src, - node.source.value + '.js' - ); - imports[impSrc] = imports[impSrc] || {}; - node.specifiers.forEach((specifier) => { - let name = - specifier.imported && specifier.imported.name; - if (!name) { - if ( - specifier.type === 'ImportDefaultSpecifier' - ) { - name = 'default'; - } else if ( - specifier.type === - 'ImportNamespaceSpecifier' - ) { - name = '*'; - } - } - imports[impSrc][name] = specifier; - }); - break; - // export 的声明 - case 'ExportNamedDeclaration': - let expSrc = this.getExpSrc(node, src); - - exports[expSrc] = exports[expSrc] || {}; - - if (node.specifiers && node.specifiers.length) { - node.specifiers.forEach((specifier) => { - let name = specifier.exported.name; - exports[expSrc][name] = specifier; - this.markShakingFlag(specifier); - }); - } else { - let declaration = node.declaration; - - if (declaration.type === 'FunctionDeclaration') { - let name = declaration.id.name; - exports[expSrc][name] = declaration; - declaration._shake = 1; - this.markShakingFlag(declaration); - } else if ( - declaration.type === 'VariableDeclaration' - ) { - declaration.declarations.forEach( - (variableDeclarator) => { - let name = variableDeclarator.id.name; - exports[expSrc][name] = - variableDeclarator; - this.markShakingFlag( - variableDeclarator - ); - } - ); - } else if ( - declaration.type === 'ClassDeclaration' - ) { - let name = declaration.id.name; - exports[expSrc][name] = declaration; - this.markShakingFlag(declaration); - } - } - break; - case 'ExportDefaultDeclaration': - exports[src] = exports[src] || {}; - exports[src].default = node; - this.markShakingFlag(node); - break; - case 'ExportAllDeclaration': - let exportSrc = this.getExpSrc(node, src); - exports[exportSrc] = exports[exportSrc] || {}; - exports[exportSrc]['*'] = node; - this.markShakingFlag(node); - break; - } - - if (childScope) { - node._scope = childScope; - scope = childScope; - } - }, - - // 退出节点 - exit(path) { - let {node} = path; - if (node._scope) { - scope = scope.parent; - } - }, - }); - - function findScope(node) { - let defineScope = scope.findDefiningScope(node.name); - if (defineScope) { - defineScope.nodes[node.name].forEach((declarationNode) => { - declarationNode._usedByNodes.push(node); - }); - } + let findScope = (node) => { + let defineScope = scope.findDefiningScope(node.name); + if (defineScope) { + defineScope.nodes[node.name].forEach((declarationNode) => { + // 该声明语句被哪些identifier节点使用过 + declarationNode._usedByNodes.push(node); + }); } + }; + let collect = () => { traverse(ast, { enter: (path) => { let {node} = path; @@ -298,8 +44,6 @@ class Graph { !node.computed && path.skipKey('key'); } else if (node.type === 'Identifier') { // TODO,怎么才算变量已经使用 - // 这里的判断不准确,无法判断类似函数a引用函数b,但a并没有没使用到 - // 这里只会去除掉函数a,去除不了函数b !node._skip && findScope(node); } }, @@ -311,69 +55,15 @@ class Graph { } }, }); + }; - // console.log(src); - // console.log('imports', imports); - // console.log('exports', exports); - - // import * 和 export * 不包括default - // export * from '' 和 export 本文件冲突,export 本文件优先级更高 - // export * from '' 互相冲突,后export * from '' 优先 - // export {} from '', 从其他文件导出,导出的变量无法在本文件使用 - // export default function(){},导出的函数没有name,不能再本文件使用 - /** - * imports: { - * [路径]: { - * [name]: ImportSpecifier, - * default: ImportDefaultSpecifier, - * *: ImportNamespaceSpecifier - * } - * } - * - * exports: { - * [本文件路径]: { - * // export function(){} - * [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration - * // export default function(){} | export default{} | export {a as default} | export default a - * default: ExportDefaultDeclaration | ExportSpecifier, - * // export {a as aaa,b,c} - * [name]: ExportSpecifier - * }, - * [其他路径]: { - * // export {a as aaa,b,c} from '' | export * as all from '' - * [name]: ExportSpecifier - * // export {default} from '' | export {a as default} from '' | export * as default from '' - * default: ExportSpecifier, - * // export * from '' - * *: ExportAllDeclaration - * }, - * } - */ - - let dep = { - src, - code, - ast, - imports, - exports, - children: [], - scope, - }; - - // TODO,只是imports节点不准确 - // export {} from './a' a 文件也是子节点 - Object.keys(dep.imports).forEach((childSrc, index) => { - dep.children[index] = this.analysis(childSrc); - }); + collect(); - return dep; - } + dep.children.forEach((child) => collectReferences(child)); } /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 - * 输出时,判断export node 的_shake,当等于1时,遍历子节点,看是否有声明节点,如果声明节点未被引用才可以shake掉 - * */ function shake(dep) { @@ -388,11 +78,11 @@ function shake(dep) { ); let localExports = null; let externalExports = [...exportsArray]; + if (localIndex !== -1) { localExports = externalExports.splice(localIndex, 1)[0]; } - let hasAll = usedNames.some((name) => name === '*'); let usedExports = {}; let addUsedExport = (src, node) => { usedExports[src] = usedExports[src] || {}; @@ -403,6 +93,9 @@ function shake(dep) { usedExports[src]['*'] = node; } }; + + let hasAll = usedNames.some((name) => name === '*'); + if (hasAll) { let hasDefalut = usedNames.some((name) => name === 'default'); let markedDefalut = false; @@ -473,8 +166,20 @@ function shake(dep) { } function remove(dep) { - let {ast, scope, code, src, exports} = dep; + let {scope, exports} = dep; let loop = true; + + let markRemoved = (node)=>{ + node._removed = 1; + traverse(node, { + noScope: true, + enter(path) { + let {node} = path; + node._removed = 1; + }, + }); + }; + let doRemove = (scope) => { let {nodes: allNodes} = scope; Object.values(allNodes).forEach((nodes) => { @@ -483,29 +188,14 @@ function remove(dep) { return; } - if (t.isClassDeclaration(node)) { - console.log('--------------'); - console.log(node._usedByNodes[0]); - } - if ( (node._usedByNodes.length === 0 && (node._shake === 1 || node._shake === undefined)) || (node._usedByNodes.length !== 0 && - node._usedByNodes.every( - (node) => node._removed || node._shake === 1 - )) + node._usedByNodes.every((node) => node._removed)) ) { - node._removed = 1; loop = true; - - traverse(node, { - noScope: true, - enter(path) { - let {node} = path; - node._removed = 1; - }, - }); + markRemoved(node); } }); }); @@ -515,26 +205,27 @@ function remove(dep) { }); }; - while (loop) { - Object.entries(exports).forEach(([src, value]) => { - Object.entries(value).forEach(([name, node]) => { - if ( - node._shake === 1 && - (!node._usedByNodes || - (node._usedByNodes && node._usedByNodes.length === 0)) - ) { - traverse(node, { - noScope: true, - enter(path) { - let {node} = path; - node._shake = 1; - }, - }); - } else { - node._shake = 0; - } - }); + /** + * 遍历exports,shake 标志表示该节点是否被外部有效的 import(即import的方法变量被使用过) + * 如果shake=1,表示没有被有效import过 + * _usedByNodes只存在于声明语句上,表示该声明语句被哪些identifier节点使用过。 + * 只有具名导出函数变量(export function(){}),这样的导出节点才会有_usedByNodes + * shake=1且_usedByNodes不存在,表示该export节点即不被外部有效import,也不会被内部使用 + * shake=1且_usedByNodes存在且有值,表示该节点不被外部有效import,但被内部使用 + */ + Object.entries(exports).forEach(([src, value]) => { + Object.entries(value).forEach(([name, node]) => { + if ( + node._shake === 1 && + (!node._usedByNodes || + (node._usedByNodes && node._usedByNodes.length === 0)) + ) { + markRemoved(node); + } }); + }); + + while (loop) { loop = false; doRemove(scope); } @@ -542,22 +233,19 @@ function remove(dep) { dep.children.forEach((child) => remove(child)); } -function run(dep) { +function output(dep) { let {ast, code, src} = dep; traverse(ast, { enter(path) { let {node} = path; - if ( - node._removed === 1 || - (!node._usedByNodes && node._shake === 1) - ) { + if (node._removed === 1) { path.remove(); } }, }); - const output = generate( + const {code: outputCode} = generate( ast, { /* options */ @@ -567,20 +255,21 @@ function run(dep) { writeFile( path.resolve(path.dirname(src), './shaking', path.basename(src)), - output.code + outputCode ); dep.children.forEach((child) => { - run(child); + output(child); }); } console.time('end'); let entrySrc = path.resolve(__dirname, '../../example/index.js'); let graph = new Graph(entrySrc); +collectReferences(graph.root); shake(graph.root); remove(graph.root); -run(graph.root); +output(graph.root); console.timeEnd('end'); // function name(params) { diff --git a/packages/wxa-cli/src/tree-shake/scope.js b/packages/wxa-cli/src/tree-shake/scope.js index e69de29b..3ab6c0df 100644 --- a/packages/wxa-cli/src/tree-shake/scope.js +++ b/packages/wxa-cli/src/tree-shake/scope.js @@ -0,0 +1,53 @@ +class Scope { + constructor(options) { + options = options || {}; + + this.parent = options.parent; + this.depth = this.parent ? this.parent.depth + 1 : 0; + this.names = options.params || []; + this.nodes = {}; + this.isBlockScope = !!options.block; + this.children = []; + + if (this.parent) { + this.parent.children.push(this); + } + } + // 添加变量名 + // isBlockDeclaration 是否是块级声明:let const class import + add(node, name, isBlockDeclaration) { + if (!isBlockDeclaration && this.isBlockScope) { + // it's a `var` or function declaration, and this + // is a block scope, so we need to go up + this.parent.add(node, name, isBlockDeclaration); + } else { + this.names.push(name); + // 变量名可能重复,两个var声明同一变量 + if (this.nodes[name]) { + this.nodes[name].push(node); + } else { + this.nodes[name] = [node]; + } + } + } + + contains(name) { + return !!this.findDefiningScope(name); + } + + findDefiningScope(name) { + if (this.names.includes(name)) { + return this; + } + + if (this.parent) { + return this.parent.findDefiningScope(name); + } + + return null; + } +} + +module.exports = { + Scope, +}; diff --git a/packages/wxa-cli/src/tree-shake/util.js b/packages/wxa-cli/src/tree-shake/util.js new file mode 100644 index 00000000..28e98023 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/util.js @@ -0,0 +1,26 @@ +let fs = require('fs'); +let path = require('path'); +let mkdirp = require('mkdirp'); + +function readFile(p) { + let rst = ''; + p = typeof p === 'object' ? path.join(p.dir, p.base) : p; + try { + rst = fs.readFileSync(p, 'utf-8'); + } catch (e) { + rst = null; + } + + return rst; +} + +function writeFile(p, data) { + let opath = typeof p === 'string' ? path.parse(p) : p; + mkdirp.sync(opath.dir); + fs.writeFileSync(p, data); +} + +module.exports={ + readFile, + writeFile, +}; From 2853a3ab7d0ff4ca571f24b94f8c9968ad0259ac Mon Sep 17 00:00:00 2001 From: sparklinm Date: Fri, 11 Jun 2021 18:10:57 +0800 Subject: [PATCH 09/20] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9Bbugs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/expDFOF/a.js | 13 ++ packages/wxa-cli/example/expDFOF/index.js | 25 ++ packages/wxa-cli/example/index.js | 27 +-- packages/wxa-cli/example/shaking/index.js | 9 +- packages/wxa-cli/example/test.js | 58 +++++ packages/wxa-cli/src/tree-shake/graph.js | 270 +++++++++++++--------- packages/wxa-cli/src/tree-shake/index.js | 150 ++++++++---- packages/wxa-cli/src/tree-shake/util.js | 140 ++++++++++- 8 files changed, 514 insertions(+), 178 deletions(-) create mode 100644 packages/wxa-cli/example/expDFOF/a.js create mode 100644 packages/wxa-cli/example/expDFOF/index.js create mode 100644 packages/wxa-cli/example/test.js diff --git a/packages/wxa-cli/example/expDFOF/a.js b/packages/wxa-cli/example/expDFOF/a.js new file mode 100644 index 00000000..23a0ce7e --- /dev/null +++ b/packages/wxa-cli/example/expDFOF/a.js @@ -0,0 +1,13 @@ +let num1 = 1; +let num2 = 2; +let obj1 ={ + x: 1, +}; + +function name(params) { + +} + +export default { + +}; diff --git a/packages/wxa-cli/example/expDFOF/index.js b/packages/wxa-cli/example/expDFOF/index.js new file mode 100644 index 00000000..47ab447c --- /dev/null +++ b/packages/wxa-cli/example/expDFOF/index.js @@ -0,0 +1,25 @@ + + +export {default} from './a'; + + +/* eslint-disable one-var */ +// 具名导出 +export {a as aa, b, c} from ''; +export * as all from ''; +export function fn1() {} +let o1 = 1, o2=3; +export {o1 as o11, o2}; + +// 默认导出 +// export {default} from '' +// export {a as default} from '' +// export * as default from '' +// export default function() {} +// export default {} +// export {a as default} +// let p1 = 1 +// export default p1 + +// 导出全部 +export * from ''; diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index 9b1b41be..a45ebb81 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -2,7 +2,6 @@ import getMyUser, {getName as getMyName} from './user'; import * as user from './user'; - console.log(user); let a = {x: 1}, n = 1; @@ -11,7 +10,7 @@ function m(x = 1, y) { a = 5; ++a; t = 9; - t+5; + t + 5; let qqq = 10; } m(); @@ -22,24 +21,18 @@ let sss = (a, b) => {}; [1, 2, 3].forEach(function(item) {}); -{ -} - for (i = 0; i < 100; i++) {} class Myclass { - [n]=1; - [n]=()=>{ - - } + [n] = 1; + [n] = () => {}; } export function mm() {} mm(); - function name(params) { let t = {q: 1}; let q = 2; @@ -54,7 +47,6 @@ let obj = { (function(x, y) {})(); - getName(); // export default { // x: 1, @@ -64,9 +56,7 @@ getName(); // age, // }; export * from './user'; -export function getName() { - -} +export function getName() {} // export {m as qqqqq, a as default}; // export {x, y} from './a'; @@ -76,13 +66,8 @@ export default function() {} export {Myclass}; // eslint-disable-next-line no-var -export { - mm as ttttttt, -}; +export {mm as ttttttt}; export {getName as tttt} from './user'; - -export * as tttttt from 'user'; - - +export * as tttttt from './user'; diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index b64b1d09..e7adcf9b 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -3,7 +3,7 @@ import './user'; import * as user from './user'; console.log(user); let a = { - x: 1, + x: 1 }; let t = 10; @@ -15,15 +15,14 @@ function m(x = 1, y) { } m(); -[1, 2, 3].forEach(function(item) {}); -{} +[1, 2, 3].forEach(function (item) {}); for (i = 0; i < 100; i++) {} export function mm() {} mm(); -(function(x, y) {})(); +(function (x, y) {})(); getName(); // export default { // x: 1, @@ -40,4 +39,4 @@ export {}; // eslint-disable-next-line no-var export {}; export {} from './user'; -export {} from 'user'; +export {} from './user'; \ No newline at end of file diff --git a/packages/wxa-cli/example/test.js b/packages/wxa-cli/example/test.js new file mode 100644 index 00000000..d88b550f --- /dev/null +++ b/packages/wxa-cli/example/test.js @@ -0,0 +1,58 @@ +/* eslint-disable one-var */ + +let obj = {x: 1}, + num1 = 1; +let num2 = 10; +let str1 = 'a'; +function m() { + num1 = 5; + ++num2; + let qqq = 10; +} + +m(); + +let fn1 = function() {}; + +let fn2 = () => {}; + +[1, 2, 3].forEach(function(item) {}); + +for (i = 0; i < 100; i++) {} + +class Myclass { + [str1] = 1; + [str1] = () => {}; +} + + +m(); + +function name(params) { + let t = {q: 1}; + let q = 2; + q++; + t.q; +} + + +(function(x, y) {})(); + +getName(); +// export default { +// x: 1, +// t() { +// }, +// m, +// age, +// }; +export * from './user'; +export function getName() {} +// export {m as qqqqq, a as default}; + +// export {x, y} from './a'; + +export default function() {} + +export {Myclass}; +// eslint-disable-next-line no-var diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js index 7ebbe529..9296547a 100644 --- a/packages/wxa-cli/src/tree-shake/graph.js +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -1,24 +1,36 @@ -const path = require('path'); -const {parse} = require('@babel/parser'); const traverse = require('@babel/traverse').default; const {Scope} = require('./scope'); -const {readFile} = require('./util'); +const {readFile, resolveDepSrc, parseESCode} = require('./util'); class Graph { - constructor(entrySrc) { - this.entrySrc = entrySrc; - this.root = this.analysis(entrySrc); + constructor(entries) { + this.entries = entries; + this.analysis(); } - getAbsolutePath(baseSrc, relativeSrc) { - return path.resolve(path.dirname(baseSrc), relativeSrc); + getAbsolutePath(fileSrc, depSrc) { + let s = resolveDepSrc({ + fileSrc, + depSrc, + root: 'src', + alias: {'@': 'src'}, + }); + + if (!s.endsWith('.js')) { + s += '.js'; + } + + // console.log('--------'); + // console.log(s); + + return s; } getExpSrc(node, src) { let expSrc = ''; if (node.source) { - expSrc = this.getAbsolutePath(src, node.source.value + '.js'); + expSrc = this.getAbsolutePath(src, node.source.value); } else { expSrc = src; } @@ -120,12 +132,16 @@ class Graph { return importInfo; } - collectExport(path) { + collectExport(path, isRoot) { let {node} = path; let exportInfo = null; let markShakingFlag = (node) => { - node._shake = 1; + if (isRoot) { + node._shake = 0; + } else { + node._shake = 1; + } }; switch (node.type) { @@ -163,8 +179,15 @@ class Graph { break; case 'ExportDefaultDeclaration': exportInfo = {}; - exportInfo.default = node; - markShakingFlag(node); + let declaration = node.declaration; + + if (declaration) { + exportInfo.default = declaration; + } else { + exportInfo.default = node; + } + + markShakingFlag(exportInfo.default); break; case 'ExportAllDeclaration': exportInfo = {}; @@ -176,114 +199,141 @@ class Graph { return exportInfo; } - analysis(src) { - let imports = {}; - let exports = {}; - let code = readFile(src); - let ast = parse(code, { - sourceType: 'unambiguous', - plugins: ['classProperties'], - }); + analysis() { + let analyzedFile = {}; - let scope = new Scope(); + let doAnalysis = (entry, isRoot) => { + let src = ''; + let content = ''; - traverse(ast, { - enter: (path) => { - let {node} = path; + if (typeof entry === 'string') { + src = entry; + } else { + src = entry.src; + content = entry.content; + } - let childScope = this.collectDeclaration(path, scope); - if (childScope) { - node._scope = childScope; - scope = childScope; - } + // if (src.endsWith('safe-area-inset\\index.js')) { + // console.log('src', src); + // } - let importInfo = this.collectImport(path); - if (importInfo) { - let impSrc = this.getAbsolutePath( - src, - node.source.value + '.js' - ); - imports[impSrc] = imports[impSrc] || {}; - imports[impSrc] = {...imports[impSrc], ...importInfo}; - } + if (analyzedFile[src]) { + return analyzedFile[src]; + } - let exportInfo = this.collectExport(path); - if (exportInfo) { - let expSrc = this.getExpSrc(node, src); - exports[expSrc] = exports[expSrc] || {}; - exports[expSrc] = {...exports[expSrc], ...exportInfo}; - } - }, + let imports = {}; + let exports = {}; + let code = content || readFile(src); + let ast = parseESCode(code); - // 退出节点 - exit(path) { - let {node} = path; - if (node._scope) { - scope = scope.parent; + let scope = new Scope(); + + traverse(ast, { + enter: (path) => { + let {node} = path; + + let childScope = this.collectDeclaration(path, scope); + if (childScope) { + node._scope = childScope; + scope = childScope; + } + + let importInfo = this.collectImport(path); + if (importInfo) { + let impSrc = this.getAbsolutePath( + src, + node.source.value + ); + imports[impSrc] = imports[impSrc] || {}; + imports[impSrc] = {...imports[impSrc], ...importInfo}; + } + + let exportInfo = this.collectExport(path, isRoot); + if (exportInfo) { + let expSrc = this.getExpSrc(node, src); + exports[expSrc] = exports[expSrc] || {}; + exports[expSrc] = {...exports[expSrc], ...exportInfo}; + } + }, + + // 退出节点 + exit(path) { + let {node} = path; + if (node._scope) { + scope = scope.parent; + } + }, + }); + + // console.log(src); + // console.log('imports', imports); + // console.log('exports', exports); + + // import * 和 export * 不包括default + // export * from '' 和 export 本文件冲突,export 本文件优先级更高 + // export * from '' 互相冲突,后export * from '' 优先 + // export {} from '', 从其他文件导出,导出的变量无法在本文件使用 + // export default function(){},导出的函数没有name时,不能在本文件使用 + // 不存在语法 export default let a =1 + /** + * imports: { + * [路径]: { + * [name]: ImportSpecifier, + * default: ImportDefaultSpecifier, + * *: ImportNamespaceSpecifier + * } + * } + * + * exports: { + * [本文件路径]: { + * // export function(){} + * [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration + * // export default function(){} | export default{} | export {a as default} | export default a + * default: ExportDefaultDeclaration | FunctionDeclaration | ClassDeclaration |ExportSpecifier, + * // export {a as aaa,b,c} + * [name]: ExportSpecifier + * }, + * [其他路径]: { + * // export {a as aaa,b,c} from '' | export * as all from '' + * [name]: ExportSpecifier + * // export {default} from '' | export {a as default} from '' | export * as default from '' + * default: ExportSpecifier, + * // export * from '' + * *: ExportAllDeclaration + * }, + * } + */ + + let dep = { + src, + code, + ast, + imports, + exports, + children: [], + scope, + isRoot, + }; + + analyzedFile[src] = dep; + + Object.keys(dep.imports).forEach((childSrc, index) => { + dep.children.push(doAnalysis(childSrc)); + }); + + // export {} from './a' a 文件也是子节点 + Object.keys(dep.exports).forEach((childSrc) => { + if (childSrc !== src) { + dep.children.push(doAnalysis(childSrc)); } - }, - }); + }); - // console.log(src); - // console.log('imports', imports); - // console.log('exports', exports); - - // import * 和 export * 不包括default - // export * from '' 和 export 本文件冲突,export 本文件优先级更高 - // export * from '' 互相冲突,后export * from '' 优先 - // export {} from '', 从其他文件导出,导出的变量无法在本文件使用 - // export default function(){},导出的函数没有name,不能在本文件使用 - /** - * imports: { - * [路径]: { - * [name]: ImportSpecifier, - * default: ImportDefaultSpecifier, - * *: ImportNamespaceSpecifier - * } - * } - * - * exports: { - * [本文件路径]: { - * // export function(){} - * [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration - * // export default function(){} | export default{} | export {a as default} | export default a - * default: ExportDefaultDeclaration | ExportSpecifier, - * // export {a as aaa,b,c} - * [name]: ExportSpecifier - * }, - * [其他路径]: { - * // export {a as aaa,b,c} from '' | export * as all from '' - * [name]: ExportSpecifier - * // export {default} from '' | export {a as default} from '' | export * as default from '' - * default: ExportSpecifier, - * // export * from '' - * *: ExportAllDeclaration - * }, - * } - */ - - let dep = { - src, - code, - ast, - imports, - exports, - children: [], - scope, + return dep; }; - Object.keys(dep.imports).forEach((childSrc, index) => { - dep.children.push(this.analysis(childSrc)); + this.roots = this.entries.map((entry) => { + return doAnalysis(entry, true); }); - - // export {} from './a' a 文件也是子节点 - Object.keys(dep.exports).forEach((childSrc, index) => { - if (childSrc !== src) { - dep.children.push(this.analysis(childSrc)); - } - }); - - return dep; } } diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 03859a2f..bcb061a3 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,4 +1,3 @@ -let path = require('path'); const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; @@ -6,6 +5,10 @@ let {writeFile} = require('./util'); let {Graph} = require('./graph'); function collectReferences(dep) { + if (dep._collcted) { + return; + } + let {ast, scope} = dep; let findScope = (node) => { @@ -29,7 +32,7 @@ function collectReferences(dep) { // obj.x 类型的属性访问,不算对x变量的使用 if (node.type === 'MemberExpression') { - !node.computed && path.skip(); + !node.computed && path.skipKey('property'); } else if (node.type === 'ObjectProperty') { // {x:1} 对象属性 !node.computed && path.skipKey('key'); @@ -58,15 +61,22 @@ function collectReferences(dep) { }; collect(); + dep._collcted = true; dep.children.forEach((child) => collectReferences(child)); } /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 + * 在这里,遍历全局文件树,根据import和export关系,对没使用的export进行标记 + * 但如果用require去引入一个export函数变量,这里并不能分析到这个export函数变量被使用过(所以不能去 require 一个 export) */ function shake(dep) { + if (dep._shook) { + return; + } + let imports = dep.imports; let mark = (dep, usedNames, childSrc) => { @@ -120,8 +130,10 @@ function shake(dep) { !markedDefalut) || name !== 'default' ) { - node._shake = 0; - addUsedExport(src, node); + if (node._shake === 1) { + node._shake = 0; + addUsedExport(src, node); + } } }); }); @@ -138,20 +150,26 @@ function shake(dep) { externalExports.forEach(([src, value]) => { let node = value[name] || value['*']; if (node) { - node._shake = 0; - addUsedExport(src, node); + if (node._shake === 1) { + node._shake = 0; + addUsedExport(src, node); + } } }); }); } + if (childSrc.endsWith('store\\configure.js')) { + console.log('1111'); + } + Object.entries(usedExports).forEach((src, value) => { mark(child, Object.keys(value), src); }); } }; - Object.entries(imports).forEach(([src, value], index) => { + Object.entries(imports).forEach(([src, value]) => { let usedNames = []; Object.entries(value).forEach(([name, node]) => { @@ -162,14 +180,20 @@ function shake(dep) { mark(dep, usedNames, src); }); + dep._shook = true; + dep.children.forEach((child) => shake(child)); } function remove(dep) { + if (dep._removed) { + return; + } + let {scope, exports} = dep; let loop = true; - let markRemoved = (node)=>{ + let markRemoved = (node) => { node._removed = 1; traverse(node, { noScope: true, @@ -209,7 +233,8 @@ function remove(dep) { * 遍历exports,shake 标志表示该节点是否被外部有效的 import(即import的方法变量被使用过) * 如果shake=1,表示没有被有效import过 * _usedByNodes只存在于声明语句上,表示该声明语句被哪些identifier节点使用过。 - * 只有具名导出函数变量(export function(){}),这样的导出节点才会有_usedByNodes + * 在导出语句中: + * 只有类似有name的函数变量(export function a(){} export default function a(){}),这样的导出节点才会有_usedByNodes * shake=1且_usedByNodes不存在,表示该export节点即不被外部有效import,也不会被内部使用 * shake=1且_usedByNodes存在且有值,表示该节点不被外部有效import,但被内部使用 */ @@ -221,7 +246,7 @@ function remove(dep) { (node._usedByNodes && node._usedByNodes.length === 0)) ) { markRemoved(node); - } + } }); }); @@ -230,47 +255,90 @@ function remove(dep) { doRemove(scope); } + dep._removed = true; + dep.children.forEach((child) => remove(child)); } function output(dep) { - let {ast, code, src} = dep; + let contents = {}; - traverse(ast, { - enter(path) { - let {node} = path; - if (node._removed === 1) { - path.remove(); - } - }, + let run = (dep) => { + let {ast, code, src} = dep; + + if (dep._output) { + return; + } + + traverse(ast, { + enter(path) { + let {node} = path; + if (node._removed === 1) { + path.remove(); + } + }, + }); + + const {code: outputCode} = generate( + ast, + { + /* options */ + decoratorsBeforeExport: true, + }, + code + ); + + // writeFile( + // path.resolve(path.dirname(src), './shaking', path.basename(src)), + // outputCode + // ); + + contents[src] = outputCode; + + dep._output = true; + + dep.children.forEach((child) => { + run(child); + }); + }; + + run(dep); + + return contents; +} + +function start(entries) { + let graph = new Graph(entries); + + graph.roots.forEach((root) => { + collectReferences(root); }); - const {code: outputCode} = generate( - ast, - { - /* options */ - }, - code - ); - - writeFile( - path.resolve(path.dirname(src), './shaking', path.basename(src)), - outputCode - ); - - dep.children.forEach((child) => { - output(child); + console.log('collected'); + + graph.roots.forEach((root) => { + shake(root); }); + + console.log('shook'); + + let contents = {}; + graph.roots.forEach((root) => { + remove(root); + contents = {...contents, ...output(root)}; + }); + + return contents; } -console.time('end'); -let entrySrc = path.resolve(__dirname, '../../example/index.js'); -let graph = new Graph(entrySrc); -collectReferences(graph.root); -shake(graph.root); -remove(graph.root); -output(graph.root); -console.timeEnd('end'); +module.exports = { + start, +}; + +// console.time('end'); +// let entrySrc = path.resolve(__dirname, '../../example/index.js'); +// start([entrySrc]); +// console.timeEnd('end'); // function name(params) { // console.log(m); diff --git a/packages/wxa-cli/src/tree-shake/util.js b/packages/wxa-cli/src/tree-shake/util.js index 28e98023..c55305d9 100644 --- a/packages/wxa-cli/src/tree-shake/util.js +++ b/packages/wxa-cli/src/tree-shake/util.js @@ -1,6 +1,8 @@ let fs = require('fs'); let path = require('path'); let mkdirp = require('mkdirp'); +const {parse} = require('@babel/parser'); +let findRoot = require('find-root'); function readFile(p) { let rst = ''; @@ -20,7 +22,143 @@ function writeFile(p, data) { fs.writeFileSync(p, data); } -module.exports={ +function isFile(p) { + p = typeof p === 'object' ? path.join(p.dir, p.base) : p; + if (!fs.existsSync(p)) return false; + return fs.statSync(p).isFile(); +} + +function isDir(p) { + // console.log(isDir, fs.existsSync(p), p); + if (!fs.existsSync(p)) { + return false; + } + + return fs.statSync(p).isDirectory(); +} + +function getPkgConfig(npmSrc, lib) { + let uri = path.join(npmSrc, lib); + let location = findRoot(uri); + let content = readFile(path.join(location, 'package.json')); + try { + content = JSON.parse(content); + } catch (e) { + content = null; + } + + return content; +} + +/** + * import路径: + * "./a", "a", "@/a", "/a" + * + */ + +let cwd = process.cwd(); +function resolveDepSrc({fileSrc, depSrc, root, alias}) { + let getDepAbsoulte = (src) => { + if (isDir(src)) { + return path.join(src, 'index.js'); + } + + if (!src.endsWith('.js')) { + return src + '.js'; + } + + return src; + }; + + if (alias) { + let aliasNames = Object.keys(alias); + let absoluteSrc = ''; + let matched = aliasNames.some((aliasName) => { + if (depSrc.startsWith(aliasName + '/')) { + let aliasSrc = alias[aliasName]; + + absoluteSrc = path.resolve( + cwd, + aliasSrc, + depSrc.replace(aliasName, '.') + ); + return true; + } + }); + + if (matched) { + return getDepAbsoulte(absoluteSrc); + } + } + + if (depSrc.startsWith('/')) { + return getDepAbsoulte(path.resolve(cwd, root, depSrc.replace('/', ''))); + } + + if (depSrc.startsWith('./') || depSrc.startsWith('../')) { + let fileDir = path.dirname(fileSrc); + return getDepAbsoulte(path.resolve(fileDir, depSrc)); + } + + let npmSrc = path.join(cwd, 'node_modules'); + let absoluteSrc = path.join(npmSrc, depSrc); + + if (!absoluteSrc.endsWith('.js')) { + absoluteSrc += '.js'; + } + + if (isFile(absoluteSrc)) { + return absoluteSrc; + } + + let pkg = getPkgConfig(npmSrc, depSrc); + + if (!pkg) { + throw new Error('找不到模块' + depSrc); + } + + let main = pkg.main || 'index.js'; + // 优先使用依赖的 browser 版本 + if (pkg.browser && typeof pkg.browser === 'string') { + main = pkg.browser; + } + + return getDepAbsoulte(path.join(npmSrc, depSrc, main)); +} + +function parseESCode(code, plugins = [], options) { + plugins = [ + ['decorators', {decoratorsBeforeExport: true}], + 'classProperties', + 'jsx', + 'typescript', + 'exportNamespaceFrom', + 'exportDefaultFrom', + 'objectRestSpread', + ...plugins, + ]; + + return parse(code, { + plugins, + sourceType: 'unambiguous', + ...options, + }); +} + +// console.log( +// resolveDepSrc({ +// fileSrc: path.join(cwd, './src/a.js'), +// depSrc: '@/b', +// root: 'src', +// alias: { +// '@': path.join(cwd, '/src/xxx'), +// }, +// }) +// ); + +module.exports = { readFile, writeFile, + resolveDepSrc, + parseESCode, }; From c20832490e14dbd0b2c31b8773b5d0c3ce466fa9 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Mon, 14 Jun 2021 22:54:43 +0800 Subject: [PATCH 10/20] =?UTF-8?q?feat:=20commonjs=20=E8=BD=AC=20es6=20?= =?UTF-8?q?=E5=B0=9D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/package-lock.json | 27 +- packages/wxa-cli/package.json | 1 + packages/wxa-cli/src/tree-shake/index.js | 1 - .../src/tree-shake/tansform-commonJS.js | 454 ++++++++++++++++++ .../src/tree-shake/transform-test-a.js | 245 ++++++++++ .../wxa-cli/src/tree-shake/transform-test.js | 233 +++++++++ 6 files changed, 958 insertions(+), 3 deletions(-) create mode 100644 packages/wxa-cli/src/tree-shake/tansform-commonJS.js create mode 100644 packages/wxa-cli/src/tree-shake/transform-test-a.js create mode 100644 packages/wxa-cli/src/tree-shake/transform-test.js diff --git a/packages/wxa-cli/package-lock.json b/packages/wxa-cli/package-lock.json index de77f699..c4dff9e3 100644 --- a/packages/wxa-cli/package-lock.json +++ b/packages/wxa-cli/package-lock.json @@ -63,6 +63,7 @@ "version": "7.11.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.11.6", @@ -86,6 +87,7 @@ "version": "7.11.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.11.5", @@ -102,6 +104,7 @@ "version": "7.11.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -112,6 +115,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -631,6 +635,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, "requires": { "@babel/template": "^7.10.4", "@babel/traverse": "^7.10.4", @@ -641,6 +646,7 @@ "version": "7.11.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.11.5", @@ -657,6 +663,7 @@ "version": "7.11.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -667,6 +674,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -2475,6 +2483,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -3465,6 +3474,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -3580,7 +3590,8 @@ "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true }, "get-caller-file": { "version": "2.0.5", @@ -4267,6 +4278,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -4299,6 +4311,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -4780,6 +4793,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -4788,6 +4802,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -4795,7 +4810,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "pako": { "version": "1.0.11", @@ -4903,6 +4919,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, "requires": { "find-up": "^3.0.0" } @@ -5249,6 +5266,12 @@ "resolve-from": "^1.0.0" } }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/reserved-words/download/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", + "dev": true + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", diff --git a/packages/wxa-cli/package.json b/packages/wxa-cli/package.json index 324a122d..00639abb 100644 --- a/packages/wxa-cli/package.json +++ b/packages/wxa-cli/package.json @@ -30,6 +30,7 @@ "babel-eslint": "^9.0.0", "eslint": "^4.15.0", "eslint-config-google": "^0.9.1", + "reserved-words": "^0.1.2", "semver": "^5.5.0", "webpack": "^4.28.3", "webpack-cli": "^3.2.0" diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index bcb061a3..8769fc07 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,7 +1,6 @@ const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; -let {writeFile} = require('./util'); let {Graph} = require('./graph'); function collectReferences(dep) { diff --git a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js new file mode 100644 index 00000000..bf74b794 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js @@ -0,0 +1,454 @@ +const traverse = require('@babel/traverse').default; +const generate = require('@babel/generator').default; +let {check} = require('reserved-words'); +const {readFile, writeFile, parseESCode} = require('./util'); +let t = require('@babel/types'); +let path = require('path'); + +const state = { + globals: new Set(), + renamed: new Map(), + identifiers: new Set(), + isCJS: false, +}; + +const enter = (path) => { + let cursor = path; + + // Find the closest function scope or parent. + do { + // Ignore block statements. + if (t.isBlockStatement(cursor.scope.path)) { + continue; + } + + if (t.isFunction(cursor.scope.path) || t.isProgram(cursor.scope.path)) { + break; + } + } while ((cursor = cursor.scope.path.parentPath)); + + if (t.isProgram(cursor.scope.path)) { + const nodes = []; + const inner = []; + + // Break up the program, separate Nodes added by us from the nodes + // created by the user. + cursor.scope.path.node.body.filter((node) => { + // Keep replaced nodes together, these will not be wrapped. + if (node.__replaced) { + nodes.push(node); + } else { + inner.push(node); + } + }); + + const program = t.program([ + ...nodes, + t.expressionStatement( + t.callExpression( + t.memberExpression( + t.functionExpression(null, [], t.blockStatement(inner)), + t.identifier('call') + ), + [t.identifier('module.exports')] + ) + ), + ]); + + cursor.scope.path.replaceWith(program); + state.isCJS = true; + } +}; + +function transform(ast, options = {}) { + traverse(ast, { + Program: { + exit(path) { + path.traverse({ + CallExpression: { + exit(path) { + const {node} = path; + + // Look for `require()` any renaming is assumed to be intentionally + // done to break state kind of check, so we won't look for aliases. + if ( + !options.exportsOnly && + t.isIdentifier(node.callee) && + node.callee.name === 'require' + ) { + // Require must be global for us to consider this a CommonJS + // module. + state.isCJS = true; + + // Check for nested string and template literals. + const isString = t.isStringLiteral( + node.arguments[0] + ); + const isLiteral = t.isTemplateLiteral( + node.arguments[0] + ); + + // Normalize the string value, default to the standard string + // literal format of `{ value: "" }`. + let str = null; + + if (isString) { + str = node.arguments[0]; + } else if (isLiteral) { + str = { + value: node.arguments[0].quasis[0].value + .raw, + }; + } else if (options.synchronousImport) { + const str = node.arguments[0]; + const newNode = t.expressionStatement( + t.callExpression(t.import(), [str]) + ); + + // @ts-ignore + newNode.__replaced = true; + + path.replaceWith(newNode); + + return; + } else { + throw new Error( + `Invalid require signature: ${path.toString()}` + ); + } + + const specifiers = []; + + // Convert to named import. + if ( + t.isObjectPattern(path.parentPath.node.id) + ) { + path.parentPath.node.id.properties.forEach( + (prop) => { + specifiers.push( + t.importSpecifier( + prop.value, + prop.key + ) + ); + + state.globals.add(prop.value.name); + } + ); + + const decl = t.importDeclaration( + specifiers, + t.stringLiteral(str.value) + ); + + // @ts-ignore + decl.__replaced = true; + + path.scope + .getProgramParent() + .path.unshiftContainer('body', decl); + path.parentPath.remove(); + } else if (str) { + // Convert to default import. + + const {parentPath} = path; + const {left} = parentPath.node; + // @ts-ignore + const oldId = !t.isMemberExpression(left) + ? left + : left.id; + + // Default to the closest likely identifier. + let id = oldId; + + // If we can't find an id, generate one from the import path. + if ( + !oldId || + !t.isProgram(parentPath.scope.path.type) + ) { + id = path.scope.generateUidIdentifier( + str.value + ); + } + + // Add state global name to the list. + state.globals.add(id.name); + + // Create an import declaration. + const decl = t.importDeclaration( + [t.importDefaultSpecifier(id)], + t.stringLiteral(str.value) + ); + + // @ts-ignore + decl.__replaced = true; + + // Push the declaration in the root scope. + path.scope + .getProgramParent() + .path.unshiftContainer('body', decl); + + // If we needed to generate or the change the id, then make an + // assignment so the values stay in sync. + if ( + oldId && + !t.isNodesEquivalent(oldId, id) + ) { + const newNode = t.expressionStatement( + t.assignmentExpression( + '=', + oldId, + id + ) + ); + + // @ts-ignore + newNode.__replaced = true; + + path.parentPath.parentPath.replaceWith( + newNode + ); + } else if (!oldId) { + // If we generated a new identifier for state, replace the inline + // call with the variable. + path.replaceWith(id); + } else { + // Otherwise completely remove. + + path.parentPath.remove(); + } + } + } + }, + }, + }); + + const programPath = path.scope.getProgramParent().path; + + // Even though we are pretty sure this isn't a CommonJS file, lets + // do one last sanity check for an `import` or `export` in the + // program path. + if (!state.isCJS) { + const lastImport = programPath + .get('body') + .filter((p) => p.isImportDeclaration()) + .pop(); + + const lastExport = programPath + .get('body') + .filter((p) => p.isExportDeclaration()) + .pop(); + + // Maybe it is a CJS file after-all. + if (!lastImport && !lastExport) { + state.isCJS = true; + } + } + + if (path.node.__replaced || !state.isCJS) { + return; + } + + const exportsAlias = t.variableDeclaration('var', [ + t.variableDeclarator( + t.identifier('exports'), + t.memberExpression( + t.identifier('module'), + t.identifier('exports') + ) + ), + ]); + + const moduleExportsAlias = t.variableDeclaration('var', [ + t.variableDeclarator( + t.identifier('module'), + t.objectExpression([ + t.objectProperty( + t.identifier('exports'), + t.objectExpression([]) + ), + ]) + ), + ]); + + // @ts-ignore + exportsAlias.__replaced = true; + // @ts-ignore + moduleExportsAlias.__replaced = true; + + // Add the `module` and `exports` globals into the program body, + // after the last `import` declaration. + const lastImport = programPath + .get('body') + .filter((p) => p.isImportDeclaration()) + .pop(); + + if (lastImport) { + lastImport.insertAfter(exportsAlias); + lastImport.insertAfter(moduleExportsAlias); + } else { + programPath.unshiftContainer('body', exportsAlias); + programPath.unshiftContainer('body', moduleExportsAlias); + } + + const defaultExport = t.exportDefaultDeclaration( + t.memberExpression( + t.identifier('module'), + t.identifier('exports') + ) + ); + + path.node.__replaced = true; + // @ts-ignore + defaultExport.__replaced = true; + + programPath.pushContainer('body', defaultExport); + }, + }, + ThisExpression: {enter}, + ReturnStatement: {enter}, + + ImportSpecifier: { + enter(path) { + const {name} = path.node.local; + + // If state import was renamed, ensure the source reflects it. + if (state.renamed.has(name)) { + const oldName = t.identifier(name); + const newName = t.identifier(state.renamed.get(name)); + + path.replaceWith(t.importSpecifier(newName, oldName)); + } + }, + }, + + AssignmentExpression: { + enter(path) { + if (path.node.__ignore) { + return; + } + + path.node.__ignore = true; + + // Check for module.exports. + if (t.isMemberExpression(path.node.left)) { + const moduleBinding = path.scope.getBinding('module'); + const exportsBinding = path.scope.getBinding('exports'); + + // Something like `module.exports.namedExport = true;`. + if ( + t.isMemberExpression(path.node.left.object) && + path.node.left.object.object.name === 'module' + ) { + if (!moduleBinding) { + state.isCJS = true; + return; + } + } else if ( + t.isIdentifier(path.node.left.object) && + path.node.left.object.name === 'module' + ) { + if (!moduleBinding) { + state.isCJS = true; + + // Looking at a re-exports, handled above. + if (t.isCallExpression(path.node.right)) { + return; + } + } + } else if (path.node.left.object.name === 'exports') { + // Check for regular exports + const {name} = path.node.left.property; + if ( + exportsBinding || + // If export is named "default" leave as is. + // It is not possible to export "default" as a named export. + // e.g. `export.default = 'a'` + name === 'default' + ) { + return; + } + + state.isCJS = true; + + let prop = path.node.right; + + if ( + (path.scope + .getProgramParent() + .hasBinding(prop.name) || + state.globals.has(prop.name)) && + // Don't rename `undefined`. + prop.name !== 'undefined' + ) { + prop = path.scope.generateUidIdentifier(prop.name); + + const oldName = path.node.right.name; + state.renamed.set(oldName, prop.name); + + // Add this new identifier into the globals and replace the + // right hand side with this replacement. + state.globals.add(prop.name); + path.get('right').replaceWith(prop); + path.scope.rename(oldName, prop.name); + } + + // If we set an invalid name, then abort out. + try { + // Ensure that the scope is clean before we inject new, + // potentially conflicting, variables. + const newName = + path.scope.generateUidIdentifier(name).name; + + path.scope.rename(name, newName); + + // Check if this name is reserved, if so, then bail out. + if (check(name)) { + return; + } + + const decl = t.exportNamedDeclaration( + t.variableDeclaration('let', [ + t.variableDeclarator( + path.node.left.property, + t.memberExpression( + t.identifier('exports'), + path.node.left.property + ) + ), + ]), + [] + ); + + if (!state.identifiers.has(name)) { + path.scope + .getProgramParent() + .path.pushContainer('body', decl); + state.identifiers.add(name); + } + } catch {} + } + } + }, + }, + }); +} + +let code = readFile(path.resolve(__dirname, './transform-test.js')); +let ast = parseESCode(code); + +transform(ast); + +const {code: outputCode} = generate( + ast, + { + /* options */ + decoratorsBeforeExport: true, + }, + code +); + +writeFile( + path.resolve(path.resolve(__dirname, './transform-test-a.js')), + outputCode +); diff --git a/packages/wxa-cli/src/tree-shake/transform-test-a.js b/packages/wxa-cli/src/tree-shake/transform-test-a.js new file mode 100644 index 00000000..f35bc664 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/transform-test-a.js @@ -0,0 +1,245 @@ +'use strict'; + +import _packageJson from "../package.json"; +import _crypto2 from "crypto"; +import _fsCache2 from "./fs-cache"; +import _mkdirp2 from "mkdirp"; +import _path2 from "path"; +import _fs2 from "fs"; +import _chalk2 from "chalk"; +import _babelRuntimeHelpersInteropRequireDefault from "@babel/runtime/helpers/interopRequireDefault"; +var module = { + exports: {} +}; +var exports = module.exports; +let _interopRequireDefault = _babelRuntimeHelpersInteropRequireDefault; +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports.getFiles = _getFiles; // exports.getConfig = getConfig; + +exports.readFile = _readFile; +exports.writeFile = _writeFile; +exports.isFile = _isFile; +exports.isDir = _isDir; +exports.getRelative = _getRelative; +exports.getDistPath = _getDistPath; +exports.copy = _copy; +exports.amazingCache = _amazingCache; +exports.applyPlugins = _applyPlugins; +exports.isEmpty = _isEmpty; +exports.getHash = _getHash; +exports.getHashWithString = _getHashWithString; +exports.promiseSerial = _promiseSerial; +exports.getClassSet = _getClassSet; +exports.addClass = _addClass; +exports.removeClass = _removeClass; + +let _chalk = _interopRequireDefault(_chalk2); + +let _fs = _interopRequireDefault(_fs2); + +let _path = _interopRequireDefault(_path2); + +let _mkdirp = _interopRequireDefault(_mkdirp2); + +let _fsCache = _interopRequireDefault(_fsCache2); + +let _crypto = _interopRequireDefault(_crypto2); + +let current = process.cwd(); +let pkg = _packageJson; + +function _getFiles(dir = process.cwd(), prefix = '') { + dir = _path.default.normalize(dir); + let rst = []; + exports.ttt = 1; + + if (!_fs.default.existsSync(dir)) { + return rst; + } + + let files = _fs.default.readdirSync(dir); + + files.forEach(item => { + let filepath = dir + _path.default.sep + item; + + let stat = _fs.default.statSync(filepath); + + if (stat.isFile()) { + rst.push(prefix + item); + } else if (stat.isDirectory()) { + rst = rst.concat(_getFiles(filepath, _path.default.normalize(prefix + item + _path.default.sep))); + } + }); + return rst; +} // function getConfig() { +// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); +// let config = require(configPath); +// return config; +// } + + +function _readFile(p) { + let rst = ''; + p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; + + try { + rst = _fs.default.readFileSync(p, 'utf-8'); + } catch (e) { + rst = null; + } + + return rst; +} + +function _writeFile(p, data) { + let opath = typeof p === 'string' ? _path.default.parse(p) : p; + + _mkdirp.default.sync(opath.dir); + + _fs.default.writeFileSync(p, data); +} + +function _isFile(p) { + p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; + if (!_fs.default.existsSync(p)) return false; + return _fs.default.statSync(p).isFile(); +} + +function _isDir(p) { + // console.log(isDir, fs.existsSync(p), p); + if (!_fs.default.existsSync(p)) { + return false; + } + + return _fs.default.statSync(p).isDirectory(); +} + +function _getRelative(opath) { + return _path.default.relative(current, _path.default.join(opath.dir, opath.base)); +} + +function _getDistPath(opath, ext, src, dist) { + let relative; + opath = typeof opath === 'string' ? _path.default.parse(opath) : opath; + ext = ext ? ext[0] === '.' ? ext : '.' + ext : opath.ext; + + if (_path.default.relative(current, opath.dir).indexOf('node_modules') === 0) { + relative = _path.default.relative(_path.default.join(current, 'node_modules'), opath.dir); + relative = _path.default.join('npm', relative); + } else { + relative = _path.default.relative(_path.default.join(current, src), opath.dir); + } + + return _path.default.join(current, dist, relative, opath.name + ext); +} + +function _copy(from, to) { + return new Promise((resolve, reject) => { + _mkdirp.default.sync(_path.default.parse(to).dir); + + _fs.default.copyFile(from, to, err => { + if (err) return reject(err); + resolve(); + }); + }); +} + +function _amazingCache(params, needCache) { + let defaultOpts = { + directory: true, + identifier: JSON.stringify({ + '@wxa/cli2': pkg.version, + 'env': process.env.NODE_ENV || 'development' + }) + }; + let cacheParams = Object.assign({}, defaultOpts, params); + + if (needCache) { + return (0, _fsCache.default)(cacheParams); + } else { + let { + source, + transform, + options + } = cacheParams; + return transform(source, options); + } +} + +function _applyPlugins(plugins, compiler) { + if (plugins == null) return; // console.log(plugins); + + if (typeof plugins !== 'object') { + throw new Error('wxa配置文件有误,plugins'); + } + + if (!Array.isArray(plugins)) plugins = [plugins]; + plugins.forEach(plugin => plugin.apply(compiler)); +} + +function _isEmpty(n) { + return n == null || n === ''; +} + +function _getHash(filepath) { + let content = _readFile(filepath); + + return content == null ? Date.now() : _crypto.default.createHash('md5').update(content).digest('hex'); +} + +function _getHashWithString(content) { + return content == null ? Date.now() : _crypto.default.createHash('md5').update(content).digest('hex'); +} + +function _promiseSerial(funs) { + return funs.reduce((promise, fun) => { + return promise.then(result => fun().then(Array.prototype.concat.bind(result))); + }, Promise.resolve([])); +} + +function _getClassSet(classStr) { + let classList = []; + + if (classStr && typeof classStr === 'string') { + classList = classStr.split(' '); + } + + return new Set(classList); +} + +function _addClass(classStr, newClass) { + let classSet = _getClassSet(classStr); + + classSet.add(newClass); + return Array.from(classSet); +} + +function _removeClass(classStr, destClass) { + let classSet = _getClassSet(classStr); + + classSet.delete(destClass); + return Array.from(classSet); +} // # sourceMappingURL=utils.js.map + + +export let getFiles = exports.getFiles; +export let readFile = exports.readFile; +export let writeFile = exports.writeFile; +export let isFile = exports.isFile; +export let isDir = exports.isDir; +export let getRelative = exports.getRelative; +export let getDistPath = exports.getDistPath; +export let copy = exports.copy; +export let amazingCache = exports.amazingCache; +export let applyPlugins = exports.applyPlugins; +export let isEmpty = exports.isEmpty; +export let getHash = exports.getHash; +export let getHashWithString = exports.getHashWithString; +export let promiseSerial = exports.promiseSerial; +export let getClassSet = exports.getClassSet; +export let addClass = exports.addClass; +export let removeClass = exports.removeClass; +export let ttt = exports.ttt; +export default module.exports; \ No newline at end of file diff --git a/packages/wxa-cli/src/tree-shake/transform-test.js b/packages/wxa-cli/src/tree-shake/transform-test.js new file mode 100644 index 00000000..a386ef7a --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/transform-test.js @@ -0,0 +1,233 @@ +'use strict'; + +let _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault'); + +Object.defineProperty(exports, '__esModule', { + value: true, +}); +exports.getFiles = getFiles; +// exports.getConfig = getConfig; +exports.readFile = readFile; +exports.writeFile = writeFile; +exports.isFile = isFile; +exports.isDir = isDir; +exports.getRelative = getRelative; +exports.getDistPath = getDistPath; +exports.copy = copy; +exports.amazingCache = amazingCache; +exports.applyPlugins = applyPlugins; +exports.isEmpty = isEmpty; +exports.getHash = getHash; +exports.getHashWithString = getHashWithString; +exports.promiseSerial = promiseSerial; +exports.getClassSet = getClassSet; +exports.addClass = addClass; +exports.removeClass = removeClass; + +let _chalk = _interopRequireDefault(require('chalk')); + +let _fs = _interopRequireDefault(require('fs')); + +let _path = _interopRequireDefault(require('path')); + +let _mkdirp = _interopRequireDefault(require('mkdirp')); + +let _fsCache = _interopRequireDefault(require('./fs-cache')); + +let _crypto = _interopRequireDefault(require('crypto')); + +let current = process.cwd(); + +let pkg = require('../package.json'); + +function getFiles(dir = process.cwd(), prefix = '') { + dir = _path.default.normalize(dir); + let rst = []; + + exports.ttt= 1; + + if (!_fs.default.existsSync(dir)) { + return rst; + } + + let files = _fs.default.readdirSync(dir); + + files.forEach((item) => { + let filepath = dir + _path.default.sep + item; + + let stat = _fs.default.statSync(filepath); + + if (stat.isFile()) { + rst.push(prefix + item); + } else if (stat.isDirectory()) { + rst = rst.concat( + getFiles( + filepath, + _path.default.normalize(prefix + item + _path.default.sep) + ) + ); + } + }); + return rst; +} + +// function getConfig() { +// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); + +// let config = require(configPath); + +// return config; +// } + +function readFile(p) { + let rst = ''; + p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; + + try { + rst = _fs.default.readFileSync(p, 'utf-8'); + } catch (e) { + rst = null; + } + + return rst; +} + +function writeFile(p, data) { + let opath = typeof p === 'string' ? _path.default.parse(p) : p; + + _mkdirp.default.sync(opath.dir); + + _fs.default.writeFileSync(p, data); +} + +function isFile(p) { + p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; + if (!_fs.default.existsSync(p)) return false; + return _fs.default.statSync(p).isFile(); +} + +function isDir(p) { + // console.log(isDir, fs.existsSync(p), p); + if (!_fs.default.existsSync(p)) { + return false; + } + + return _fs.default.statSync(p).isDirectory(); +} + +function getRelative(opath) { + return _path.default.relative( + current, + _path.default.join(opath.dir, opath.base) + ); +} + +function getDistPath(opath, ext, src, dist) { + let relative; + opath = typeof opath === 'string' ? _path.default.parse(opath) : opath; + ext = ext ? (ext[0] === '.' ? ext : '.' + ext) : opath.ext; + + if ( + _path.default.relative(current, opath.dir).indexOf('node_modules') === 0 + ) { + relative = _path.default.relative( + _path.default.join(current, 'node_modules'), + opath.dir + ); + relative = _path.default.join('npm', relative); + } else { + relative = _path.default.relative( + _path.default.join(current, src), + opath.dir + ); + } + + return _path.default.join(current, dist, relative, opath.name + ext); +} + +function copy(from, to) { + return new Promise((resolve, reject) => { + _mkdirp.default.sync(_path.default.parse(to).dir); + + _fs.default.copyFile(from, to, (err) => { + if (err) return reject(err); + resolve(); + }); + }); +} + +function amazingCache(params, needCache) { + let defaultOpts = { + directory: true, + identifier: JSON.stringify({ + '@wxa/cli2': pkg.version, + 'env': process.env.NODE_ENV || 'development', + }), + }; + let cacheParams = Object.assign({}, defaultOpts, params); + + if (needCache) { + return (0, _fsCache.default)(cacheParams); + } else { + let {source, transform, options} = cacheParams; + return transform(source, options); + } +} + +function applyPlugins(plugins, compiler) { + if (plugins == null) return; // console.log(plugins); + + if (typeof plugins !== 'object') { +throw new Error('wxa配置文件有误,plugins'); +} + if (!Array.isArray(plugins)) plugins = [plugins]; + plugins.forEach((plugin) => plugin.apply(compiler)); +} + +function isEmpty(n) { + return n == null || n === ''; +} + +function getHash(filepath) { + let content = readFile(filepath); + return content == null + ? Date.now() + : _crypto.default.createHash('md5').update(content).digest('hex'); +} + +function getHashWithString(content) { + return content == null + ? Date.now() + : _crypto.default.createHash('md5').update(content).digest('hex'); +} + +function promiseSerial(funs) { + return funs.reduce((promise, fun) => { + return promise.then((result) => + fun().then(Array.prototype.concat.bind(result)) + ); + }, Promise.resolve([])); +} + +function getClassSet(classStr) { + let classList = []; + + if (classStr && typeof classStr === 'string') { + classList = classStr.split(' '); + } + + return new Set(classList); +} + +function addClass(classStr, newClass) { + let classSet = getClassSet(classStr); + classSet.add(newClass); + return Array.from(classSet); +} + +function removeClass(classStr, destClass) { + let classSet = getClassSet(classStr); + classSet.delete(destClass); + return Array.from(classSet); +} +// # sourceMappingURL=utils.js.map From 7df5f3f8f3c7c52f682b2cf2c4d069d52c07646f Mon Sep 17 00:00:00 2001 From: sparklinm Date: Fri, 18 Jun 2021 18:02:05 +0800 Subject: [PATCH 11/20] feat: commonjs shake --- packages/wxa-cli/example/cjs1.js | 144 +++ packages/wxa-cli/example/cjs2.js | 25 + packages/wxa-cli/example/index.js | 11 +- packages/wxa-cli/example/shaking/cjs1.js | 30 + packages/wxa-cli/example/shaking/cjs2.js | 0 packages/wxa-cli/example/shaking/index.js | 29 +- packages/wxa-cli/example/shaking/user.js | 2 +- packages/wxa-cli/src/tree-shake/graph.js | 23 +- packages/wxa-cli/src/tree-shake/index.js | 85 +- .../src/tree-shake/tansform-commonJS.js | 915 ++++++++++-------- .../src/tree-shake/transform-test-a.js | 245 ----- .../wxa-cli/src/tree-shake/transform-test.js | 233 ----- 12 files changed, 843 insertions(+), 899 deletions(-) create mode 100644 packages/wxa-cli/example/cjs1.js create mode 100644 packages/wxa-cli/example/cjs2.js create mode 100644 packages/wxa-cli/example/shaking/cjs1.js create mode 100644 packages/wxa-cli/example/shaking/cjs2.js delete mode 100644 packages/wxa-cli/src/tree-shake/transform-test-a.js delete mode 100644 packages/wxa-cli/src/tree-shake/transform-test.js diff --git a/packages/wxa-cli/example/cjs1.js b/packages/wxa-cli/example/cjs1.js new file mode 100644 index 00000000..b7ff0eec --- /dev/null +++ b/packages/wxa-cli/example/cjs1.js @@ -0,0 +1,144 @@ +let fn1= require('./cjs2').fn1; + + +fn1(); + + +Object.defineProperty(exports, '__esModule', { + value: true, +}); +exports.getFiles = getFiles; +// exports.getConfig = getConfig; +module.exports.readFile = readFile; +exports.writeFile = writeFile; +exports.isFile = isFile; +exports.isDir = isDir; +exports.getRelative = getRelative; +exports.getDistPath = getDistPath; +exports.copy = copy; +exports.amazingCache = amazingCache; +exports.applyPlugins = applyPlugins; +exports.isEmpty = isEmpty; +exports.getHash = getHash; +exports.getHashWithString = getHashWithString; +exports.promiseSerial = promiseSerial; +exports.getClassSet = getClassSet; +exports.addClass = addClass; +exports.removeClass = removeClass; + +module.exports ={getFiles}; + + +function getFiles(dir = process.cwd(), prefix = '') { + let rst = []; + + exports.rst= rst; + + let aaaa= 'aaa'; + // exports[aaaa] = aaaa; + + // let ttt= require('sss'); + + // console.log(ttt); + + // exports.addClass; + // module.exports.removeClass; + // exports[rst]; +} + +// function getConfig() { +// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); + +// let config = require(configPath); + +// return config; +// } + +function readFile(p) { + +} + +function writeFile(p, data) { + +} + +function isFile(p) { + +} + +function isDir(p) { + +} + +function getRelative(opath) { + +} + +function getDistPath(opath, ext, src, dist) { + +} + +function copy(from, to) { + +} + +function amazingCache(params, needCache) { + +} + +function applyPlugins(plugins, compiler) { + if (plugins == null) return; // console.log(plugins); + + if (typeof plugins !== 'object') { +throw new Error('wxa配置文件有误,plugins'); +} + if (!Array.isArray(plugins)) plugins = [plugins]; + plugins.forEach((plugin) => plugin.apply(compiler)); +} + +function isEmpty(n) { + return n == null || n === ''; +} + +function getHash(filepath) { +} + +function getHashWithString(content) { +} + +function promiseSerial(funs) { + return funs.reduce((promise, fun) => { + return promise.then((result) => + fun().then(Array.prototype.concat.bind(result)) + ); + }, Promise.resolve([])); +} + +function getClassSet(classStr) { + let classList = []; + + if (classStr && typeof classStr === 'string') { + classList = classStr.split(' '); + } + + return new Set(classList); +} + +function addClass(classStr, newClass) { + let classSet = getClassSet(classStr); + classSet.add(newClass); + return Array.from(classSet); +} + +function removeClass(classStr, destClass) { + let classSet = getClassSet(classStr); + classSet.delete(destClass); + return Array.from(classSet); +} +// # sourceMappingURL=utils.js.map + +exports.a=function m() { + +}; + + diff --git a/packages/wxa-cli/example/cjs2.js b/packages/wxa-cli/example/cjs2.js new file mode 100644 index 00000000..9fc85ea2 --- /dev/null +++ b/packages/wxa-cli/example/cjs2.js @@ -0,0 +1,25 @@ + + +function fn1(params) { + +} + + +function fn2(params) { + +} + + +function fn3(params) { + +} + + +exports.fn1 = fn1; +exports.fn2 = fn2; +exports.fn3 = fn3; + + +exports.fn4 = function fn4() { + +}; diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index a45ebb81..95802b95 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -1,6 +1,15 @@ /* eslint-disable one-var */ import getMyUser, {getName as getMyName} from './user'; import * as user from './user'; +import {getName as tttqw} from './user'; + +import {writeFile, isFile} from './cjs1'; + +writeFile(); +isFile(); + +getName(); + console.log(user); let a = {x: 1}, @@ -47,7 +56,6 @@ let obj = { (function(x, y) {})(); -getName(); // export default { // x: 1, // t() { @@ -55,7 +63,6 @@ getName(); // m, // age, // }; -export * from './user'; export function getName() {} // export {m as qqqqq, a as default}; diff --git a/packages/wxa-cli/example/shaking/cjs1.js b/packages/wxa-cli/example/shaking/cjs1.js new file mode 100644 index 00000000..8410bbe5 --- /dev/null +++ b/packages/wxa-cli/example/shaking/cjs1.js @@ -0,0 +1,30 @@ +let fn1 = require('./cjs2').fn1; + +fn1(); +Object.defineProperty(exports, '__esModule', { + value: true, +}); +exports.writeFile = writeFile; +exports.isFile = isFile; +module.exports = { + getFiles, +}; + +function getFiles(dir = process.cwd(), prefix = '') { + let rst = []; + exports.rst = rst; // exports[aaaa] = aaaa; + // let ttt= require('sss'); + // console.log(ttt); + // exports.addClass; + // module.exports.removeClass; + // exports[rst]; +} // function getConfig() { +// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); +// let config = require(configPath); +// return config; +// } + + +function writeFile(p, data) {} + +function isFile(p) {} diff --git a/packages/wxa-cli/example/shaking/cjs2.js b/packages/wxa-cli/example/shaking/cjs2.js new file mode 100644 index 00000000..e69de29b diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index e7adcf9b..69184d60 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -1,10 +1,14 @@ /* eslint-disable one-var */ import './user'; import * as user from './user'; +import {writeFile, isFile} from './cjs1'; +writeFile(); +isFile(); console.log(user); let a = { - x: 1 -}; + x: 1, +}, + n = 1; let t = 10; function m(x = 1, y) { @@ -15,16 +19,19 @@ function m(x = 1, y) { } m(); -[1, 2, 3].forEach(function (item) {}); +[1, 2, 3].forEach(function(item) {}); for (i = 0; i < 100; i++) {} +class Myclass { + [n] = 1; + [n] = () => {}; +} + export function mm() {} mm(); -(function (x, y) {})(); - -getName(); // export default { +(function(x, y) {})(); // export default { // x: 1, // t() { // }, @@ -32,11 +39,13 @@ getName(); // export default { // age, // }; + export function getName() {} // export {m as qqqqq, a as default}; // export {x, y} from './a'; -export {}; // eslint-disable-next-line no-var +export default function() {} +export {Myclass}; // eslint-disable-next-line no-var -export {}; -export {} from './user'; -export {} from './user'; \ No newline at end of file +export {mm as ttttttt}; +export {getName as tttt} from './user'; +export * as tttttt from './user'; diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index af191737..8c0a6fbd 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -3,4 +3,4 @@ export function getName() {} // export default function getUser(params) { // eslint-disable-next-line one-var export let mm1 = 1, - c = function mm2(params) {}; \ No newline at end of file + c = function mm2(params) {}; diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js index 9296547a..d5b57acf 100644 --- a/packages/wxa-cli/src/tree-shake/graph.js +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -1,6 +1,7 @@ const traverse = require('@babel/traverse').default; const {Scope} = require('./scope'); const {readFile, resolveDepSrc, parseESCode} = require('./util'); +let {TransformCommonJs} = require('./tansform-commonJS'); class Graph { constructor(entries) { @@ -43,6 +44,7 @@ class Graph { let identifierNode = node[attr]; // 类似于export default function(){} + // 这类声明也不能在本文件内使用,直接忽略 if (!identifierNode || !identifierNode.name) { return; } @@ -97,6 +99,9 @@ class Graph { // import 的声明 case 'ImportDeclaration': node.specifiers.forEach((specifier) => { + if (node.$t_cjs_temp_import) { + return; + } addToScope(specifier, 'local', true); }); break; @@ -186,7 +191,7 @@ class Graph { } else { exportInfo.default = node; } - + markShakingFlag(exportInfo.default); break; case 'ExportAllDeclaration': @@ -221,11 +226,15 @@ class Graph { return analyzedFile[src]; } + // console.log(src); + let imports = {}; let exports = {}; let code = content || readFile(src); let ast = parseESCode(code); + let transformCommonJs = new TransformCommonJs({src, code, ast}); + let scope = new Scope(); traverse(ast, { @@ -304,6 +313,17 @@ class Graph { * } */ + transformCommonJs.state.childScopeRequires.forEach( + (names, requireSrc) => { + let abSrc = this.getAbsolutePath(src, requireSrc); + let info = Array.from(names).map((name) => ({ + name: 'child_scope_require', + })); + imports[abSrc] = imports[abSrc] || {}; + imports[abSrc] = {...imports[abSrc], ...info}; + } + ); + let dep = { src, code, @@ -313,6 +333,7 @@ class Graph { children: [], scope, isRoot, + transformCommonJs, }; analyzedFile[src] = dep; diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 8769fc07..8c676a7b 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,5 +1,6 @@ const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; +const {writeFile} = require('./util'); let {Graph} = require('./graph'); @@ -65,6 +66,7 @@ function collectReferences(dep) { dep.children.forEach((child) => collectReferences(child)); } +const REQUIRE_TO_IMPORT_DEFAULT = 'require_to_import_default'; /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 * 在这里,遍历全局文件树,根据import和export关系,对没使用的export进行标记 @@ -103,10 +105,15 @@ function shake(dep) { } }; - let hasAll = usedNames.some((name) => name === '*'); + let hasAll = usedNames.some( + (name) => name === '*' || name === REQUIRE_TO_IMPORT_DEFAULT + ); if (hasAll) { - let hasDefalut = usedNames.some((name) => name === 'default'); + let hasDefalut = usedNames.some( + (name) => + name === 'default' || name === REQUIRE_TO_IMPORT_DEFAULT + ); let markedDefalut = false; if (localExports) { Object.entries(localExports[1]).forEach(([name, node]) => { @@ -139,6 +146,17 @@ function shake(dep) { } else { usedNames.forEach((name) => { if (localExports) { + // if (name === REQUIRE_TO_IMPORT_DEFAULT) { + // Object.values(localExports[1]).forEach((node) => { + // // exports 转换的 export 节点 + // if (node.$t_cjs_temp_export) { + // node._shake = 0; + // } + // }); + + // return; + // } + let node = localExports[1][name]; if (node) { node._shake = 0; @@ -158,10 +176,6 @@ function shake(dep) { }); } - if (childSrc.endsWith('store\\configure.js')) { - console.log('1111'); - } - Object.entries(usedExports).forEach((src, value) => { mark(child, Object.keys(value), src); }); @@ -172,6 +186,23 @@ function shake(dep) { let usedNames = []; Object.entries(value).forEach(([name, node]) => { + // require 转成的 import default 节点 + // 这些节点默认被本文件使用 + if (node.$t_cjs_temp_default_import) { + usedNames.push(REQUIRE_TO_IMPORT_DEFAULT); + return; + } + + if (node === 'child_scope_require') { + if (name === 'default') { + usedNames.push(REQUIRE_TO_IMPORT_DEFAULT); + } else { + usedNames.push(name); + } + + return; + } + if (node._usedByNodes && node._usedByNodes.length) { usedNames.push(name); } @@ -228,6 +259,9 @@ function remove(dep) { }); }; + let transformCommonJs = dep.transformCommonJs; + transformCommonJs.traverseTransformedModuleDeclaration(markRemoved); + /** * 遍历exports,shake 标志表示该节点是否被外部有效的 import(即import的方法变量被使用过) * 如果shake=1,表示没有被有效import过 @@ -239,6 +273,22 @@ function remove(dep) { */ Object.entries(exports).forEach(([src, value]) => { Object.entries(value).forEach(([name, node]) => { + if (node.$t_cjs_temp_export) { + if ( + !transformCommonJs.state.isDynamicUsedExportsProperty && + node._shake === 1 && + !transformCommonJs.state.usedExports.has(name) + ) { + let cjsExportNode = transformCommonJs.getCJSExport(node); + if (cjsExportNode) { + console.log('111'); + markRemoved(cjsExportNode); + } + } + + return; + } + if ( node._shake === 1 && (!node._usedByNodes || @@ -269,9 +319,15 @@ function output(dep) { return; } + console.log(src); + if (src.endsWith('cjs1.js')) { + console.log('ss'); + } + traverse(ast, { enter(path) { let {node} = path; + // console.log(path.toString()); if (node._removed === 1) { path.remove(); } @@ -287,10 +343,10 @@ function output(dep) { code ); - // writeFile( - // path.resolve(path.dirname(src), './shaking', path.basename(src)), - // outputCode - // ); + writeFile( + path.resolve(path.dirname(src), './shaking', path.basename(src)), + outputCode + ); contents[src] = outputCode; @@ -334,10 +390,11 @@ module.exports = { start, }; -// console.time('end'); -// let entrySrc = path.resolve(__dirname, '../../example/index.js'); -// start([entrySrc]); -// console.timeEnd('end'); +console.time('end'); +let path = require('path'); +let entrySrc = path.resolve(__dirname, '../../example/index.js'); +start([{src: entrySrc}]); +console.timeEnd('end'); // function name(params) { // console.log(m); diff --git a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js index bf74b794..056807af 100644 --- a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js +++ b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js @@ -5,450 +5,579 @@ const {readFile, writeFile, parseESCode} = require('./util'); let t = require('@babel/types'); let path = require('path'); -const state = { - globals: new Set(), - renamed: new Map(), - identifiers: new Set(), - isCJS: false, -}; +let options = {}; + +function getStaticValue(node) { + if (t.isStringLiteral(node) || t.isNumericLiteral(node)) { + return node.value; + } else if ( + t.isTemplateLiteral(node) && + !node.arguments[0].expressions.length + ) { + return node.arguments[0].quasis[0].value.raw; + } -const enter = (path) => { - let cursor = path; + return false; +} - // Find the closest function scope or parent. - do { - // Ignore block statements. - if (t.isBlockStatement(cursor.scope.path)) { - continue; - } +function getStaticMemberProValue(node) { + if (node.computed) { + return getStaticValue(node.property); + } - if (t.isFunction(cursor.scope.path) || t.isProgram(cursor.scope.path)) { - break; + return node.property.name; +} + +class TransformCommonJs { + state = { + globalESMImports: new Map(), + globalESMExports: new Map(), + renamed: new Map(), + identifiers: new Set(), + isCJS: false, + isESM: false, + childScopeRequires: new Map(), + deletedNodes: new Map(), + usedExports: new Set(), + isDynamicUsedExportsProperty: false, + }; + + constructor({src, code, ast}) { + this.src = src; + this.code = code; + this.ast = ast || parseESCode(code); + + let dynamicRequireTargets = options.dynamicRequireTargets || []; + // 如果一个模块被其他模块动态导入 + // 不对这个模块做任何处理 + if (dynamicRequireTargets.includes(src)) { + return {src, code}; } - } while ((cursor = cursor.scope.path.parentPath)); - - if (t.isProgram(cursor.scope.path)) { - const nodes = []; - const inner = []; - - // Break up the program, separate Nodes added by us from the nodes - // created by the user. - cursor.scope.path.node.body.filter((node) => { - // Keep replaced nodes together, these will not be wrapped. - if (node.__replaced) { - nodes.push(node); - } else { - inner.push(node); - } - }); - const program = t.program([ - ...nodes, - t.expressionStatement( - t.callExpression( - t.memberExpression( - t.functionExpression(null, [], t.blockStatement(inner)), - t.identifier('call') - ), - [t.identifier('module.exports')] - ) - ), - ]); - - cursor.scope.path.replaceWith(program); - state.isCJS = true; - } -}; + this.transform(this.ast, options); -function transform(ast, options = {}) { - traverse(ast, { - Program: { - exit(path) { - path.traverse({ - CallExpression: { - exit(path) { - const {node} = path; - - // Look for `require()` any renaming is assumed to be intentionally - // done to break state kind of check, so we won't look for aliases. - if ( - !options.exportsOnly && - t.isIdentifier(node.callee) && - node.callee.name === 'require' - ) { - // Require must be global for us to consider this a CommonJS - // module. - state.isCJS = true; + console.log('childScopeRequires', this.state.childScopeRequires); + console.log('usedExports', this.state.usedExports); + console.log( + 'isDynamicUsedExportsProperty', + this.state.isDynamicUsedExportsProperty + ); - // Check for nested string and template literals. - const isString = t.isStringLiteral( - node.arguments[0] - ); - const isLiteral = t.isTemplateLiteral( - node.arguments[0] - ); + // this.deleteTransformedModuleDeclaration(); + } - // Normalize the string value, default to the standard string - // literal format of `{ value: "" }`. - let str = null; + reset() { + this.state.deletedNodes.forEach((path, node) => { + if (t.isProgram(path)) { + path.node.body.push(node); + } else { + path.insertBefore(node); + } + }); + } - if (isString) { - str = node.arguments[0]; - } else if (isLiteral) { - str = { - value: node.arguments[0].quasis[0].value - .raw, - }; - } else if (options.synchronousImport) { - const str = node.arguments[0]; - const newNode = t.expressionStatement( - t.callExpression(t.import(), [str]) - ); + deleteTransformedModuleDeclaration() { + this.state.globalESMImports.forEach((paths, importPath) => { + importPath.remove(); + }); - // @ts-ignore - newNode.__replaced = true; + this.state.globalESMExports.forEach((paths, exportPath) => { + exportPath.remove(); + }); + } - path.replaceWith(newNode); + traverseTransformedModuleDeclaration(cb) { + this.state.globalESMImports.forEach((paths, importPath) => { + cb(importPath.node); + }); - return; - } else { - throw new Error( - `Invalid require signature: ${path.toString()}` - ); - } + this.state.globalESMExports.forEach((paths, exportPath) => { + cb(exportPath.node); + }); + } - const specifiers = []; - - // Convert to named import. - if ( - t.isObjectPattern(path.parentPath.node.id) - ) { - path.parentPath.node.id.properties.forEach( - (prop) => { - specifiers.push( - t.importSpecifier( - prop.value, - prop.key - ) - ); - - state.globals.add(prop.value.name); - } - ); - - const decl = t.importDeclaration( - specifiers, - t.stringLiteral(str.value) - ); - - // @ts-ignore - decl.__replaced = true; - - path.scope - .getProgramParent() - .path.unshiftContainer('body', decl); - path.parentPath.remove(); - } else if (str) { - // Convert to default import. - - const {parentPath} = path; - const {left} = parentPath.node; - // @ts-ignore - const oldId = !t.isMemberExpression(left) - ? left - : left.id; - - // Default to the closest likely identifier. - let id = oldId; - - // If we can't find an id, generate one from the import path. - if ( - !oldId || - !t.isProgram(parentPath.scope.path.type) - ) { - id = path.scope.generateUidIdentifier( - str.value - ); - } - - // Add state global name to the list. - state.globals.add(id.name); - - // Create an import declaration. - const decl = t.importDeclaration( - [t.importDefaultSpecifier(id)], - t.stringLiteral(str.value) - ); - - // @ts-ignore - decl.__replaced = true; - - // Push the declaration in the root scope. - path.scope - .getProgramParent() - .path.unshiftContainer('body', decl); - - // If we needed to generate or the change the id, then make an - // assignment so the values stay in sync. - if ( - oldId && - !t.isNodesEquivalent(oldId, id) - ) { - const newNode = t.expressionStatement( - t.assignmentExpression( - '=', - oldId, - id - ) - ); - - // @ts-ignore - newNode.__replaced = true; - - path.parentPath.parentPath.replaceWith( - newNode - ); - } else if (!oldId) { - // If we generated a new identifier for state, replace the inline - // call with the variable. - path.replaceWith(id); - } else { - // Otherwise completely remove. - - path.parentPath.remove(); - } - } - } - }, - }, - }); - - const programPath = path.scope.getProgramParent().path; - - // Even though we are pretty sure this isn't a CommonJS file, lets - // do one last sanity check for an `import` or `export` in the - // program path. - if (!state.isCJS) { - const lastImport = programPath - .get('body') - .filter((p) => p.isImportDeclaration()) - .pop(); - - const lastExport = programPath - .get('body') - .filter((p) => p.isExportDeclaration()) - .pop(); - - // Maybe it is a CJS file after-all. - if (!lastImport && !lastExport) { - state.isCJS = true; - } + deleteCJSExport(esmExportNode) { + Array.from(this.state.globalESMExports).some( + ([exportPath, cjsPaths]) => { + if (this.isChildNode(exportPath.node, esmExportNode)) { + cjsPaths.forEach((p) => p.remove()); + return true; } + } + ); + } - if (path.node.__replaced || !state.isCJS) { - return; - } + getCJSExport(esmExportNode) { + let node = null; - const exportsAlias = t.variableDeclaration('var', [ - t.variableDeclarator( - t.identifier('exports'), - t.memberExpression( - t.identifier('module'), - t.identifier('exports') - ) - ), - ]); - - const moduleExportsAlias = t.variableDeclaration('var', [ - t.variableDeclarator( - t.identifier('module'), - t.objectExpression([ - t.objectProperty( - t.identifier('exports'), - t.objectExpression([]) - ), - ]) - ), - ]); - - // @ts-ignore - exportsAlias.__replaced = true; - // @ts-ignore - moduleExportsAlias.__replaced = true; - - // Add the `module` and `exports` globals into the program body, - // after the last `import` declaration. - const lastImport = programPath - .get('body') - .filter((p) => p.isImportDeclaration()) - .pop(); - - if (lastImport) { - lastImport.insertAfter(exportsAlias); - lastImport.insertAfter(moduleExportsAlias); - } else { - programPath.unshiftContainer('body', exportsAlias); - programPath.unshiftContainer('body', moduleExportsAlias); + Array.from(this.state.globalESMExports).some( + ([exportPath, cjsPaths]) => { + if (this.isChildNode(exportPath.node, esmExportNode)) { + node = cjsPaths[0].node; + return true; } + } + ); - const defaultExport = t.exportDefaultDeclaration( - t.memberExpression( - t.identifier('module'), - t.identifier('exports') - ) - ); - - path.node.__replaced = true; - // @ts-ignore - defaultExport.__replaced = true; - - programPath.pushContainer('body', defaultExport); - }, - }, - ThisExpression: {enter}, - ReturnStatement: {enter}, + return node; + } - ImportSpecifier: { + markNodeDeep(node, flag) { + node[flag] = true; + traverse(node, { + noScope: true, enter(path) { - const {name} = path.node.local; + let {node} = path; + node[flag] = true; + }, + }); + } - // If state import was renamed, ensure the source reflects it. - if (state.renamed.has(name)) { - const oldName = t.identifier(name); - const newName = t.identifier(state.renamed.get(name)); + isChildNode(parent, child) { + if (parent === child) { + return true; + } - path.replaceWith(t.importSpecifier(newName, oldName)); - } - }, - }, + let is = false; - AssignmentExpression: { + traverse(parent, { + noScope: true, enter(path) { - if (path.node.__ignore) { - return; + let {node} = path; + if (node === child) { + is = true; + path.stop(); } + }, + }); - path.node.__ignore = true; - - // Check for module.exports. - if (t.isMemberExpression(path.node.left)) { - const moduleBinding = path.scope.getBinding('module'); - const exportsBinding = path.scope.getBinding('exports'); + return is; + } - // Something like `module.exports.namedExport = true;`. + transform(ast, options = {}) { + traverse(ast, { + Program: { + exit: (path) => { + // let allDeletePaths = []; + + // this.state.globalESMImports.forEach((paths) => { + // allDeletePaths = allDeletePaths.concat(paths); + // }); + + // this.state.globalESMExports.forEach((paths) => { + // allDeletePaths = allDeletePaths.concat(paths); + // }); + + // allDeletePaths.forEach((path) => { + // let allNextSiblingPaths = path.getAllNextSiblings(); + + // if (!allNextSiblingPaths.length) { + // this.state.deletedNodes.set( + // path.node, + // path.parentPath + // ); + // path.remove(); + // return; + // } + + // for (let i = 0; i < allNextSiblingPaths.length; i++) { + // let nextPath = allNextSiblingPaths[i]; + // let last = i === allNextSiblingPaths.length - 1; + // let find = + // !allDeletePaths.includes(nextPath) || last; + + // if (last) { + // nextPath = path.parentPath; + // } + + // if (find) { + // this.state.deletedNodes.set( + // path.node, + // nextPath + // ); + // path.remove(); + // break; + // } + // } + // }); + + let globalESMImports = new Map(); + this.state.globalESMImports.forEach((paths, node) => { + this.markNodeDeep(node, '$t_cjs_temp_import'); + let importPath = path.unshiftContainer('body', node)[0]; + globalESMImports.set(importPath, paths); + }); + this.state.globalESMImports = globalESMImports; + + let globalESMExports = new Map(); + this.state.globalESMExports.forEach((paths, node) => { + this.markNodeDeep(node, '$t_cjs_temp_export'); + let exportPath = path.pushContainer('body', node)[0]; + globalESMExports.set(exportPath, paths); + }); + this.state.globalESMExports = globalESMExports; + }, + }, + CallExpression: { + enter: (path) => { + const {node} = path; + // Look for `require()` any renaming is assumed to be intentionally + // done to break state kind of check, so we won't look for aliases. if ( - t.isMemberExpression(path.node.left.object) && - path.node.left.object.object.name === 'module' + t.isIdentifier(node.callee) && + node.callee.name === 'require' ) { - if (!moduleBinding) { - state.isCJS = true; + // Require must be global for us to consider this a CommonJS + // module. + this.state.isCJS = true; + + // Normalize the string value, default to the standard string + // literal format of `{ value: "" }`. + let source = getStaticValue(node.arguments[0]); + + if (source === false) { + console.warn( + `Dynamic requires are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` + ); + return; } - } else if ( - t.isIdentifier(path.node.left.object) && - path.node.left.object.name === 'module' - ) { - if (!moduleBinding) { - state.isCJS = true; - // Looking at a re-exports, handled above. - if (t.isCallExpression(path.node.right)) { - return; + const specifiers = []; + let {parentPath} = path; + let {node: parentNode} = parentPath; + + let childScopeRequireNames = null; + + if (!t.isProgram(path.scope.path)) { + childScopeRequireNames = + this.state.childScopeRequires.get(source); + if (!childScopeRequireNames) { + childScopeRequireNames = new Set(); + this.state.childScopeRequires.set( + source, + childScopeRequireNames + ); } } - } else if (path.node.left.object.name === 'exports') { - // Check for regular exports - const {name} = path.node.left.property; - if ( - exportsBinding || - // If export is named "default" leave as is. - // It is not possible to export "default" as a named export. - // e.g. `export.default = 'a'` - name === 'default' - ) { - return; - } - state.isCJS = true; + // Convert to named import. + // let {a} = require('a') + if (t.isObjectPattern(parentNode.id)) { + if (childScopeRequireNames) { + parentNode.id.properties.forEach((prop) => { + childScopeRequireNames.add(prop.key); + }); + return; + } + + parentNode.id.properties.forEach((prop) => { + specifiers.push( + t.importSpecifier( + t.identifier(prop.value), + t.identifier(prop.key) + ) + ); + }); + } else if (t.isMemberExpression(parentNode)) { + // let a = require('a')[a],属于动态导入 + if (parentNode.computed) { + console.warn( + `Dynamic requires are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` + ); - let prop = path.node.right; + return; + } - if ( - (path.scope - .getProgramParent() - .hasBinding(prop.name) || - state.globals.has(prop.name)) && - // Don't rename `undefined`. - prop.name !== 'undefined' - ) { - prop = path.scope.generateUidIdentifier(prop.name); + if (childScopeRequireNames) { + childScopeRequireNames.add( + parentNode.property.key + ); + return; + } - const oldName = path.node.right.name; - state.renamed.set(oldName, prop.name); + specifiers.push( + t.importSpecifier( + t.identifier(parentNode.property.name), + t.identifier(parentNode.property.name) + ) + ); + } else if (source) { + // Convert to default import. + if (childScopeRequireNames) { + childScopeRequireNames.add('default'); + return; + } - // Add this new identifier into the globals and replace the - // right hand side with this replacement. - state.globals.add(prop.name); - path.get('right').replaceWith(prop); - path.scope.rename(oldName, prop.name); + let declaratorParentPath = path.find((path) => { + return t.isVariableDeclarator(path); + }); + + let name = + (declaratorParentPath.node.id && + declaratorParentPath.node.id.name) || + ''; + let id = name + ? t.identifier(name) + : path.scope.generateUidIdentifier(); + + // 由 require 转换的 import default 节点 + // 标记 + // 当 tree shake 时,对于这类节点: + // 1. 这类节点默认在本文件使用 + // 2. 当找到依赖文件时,依赖文件的 $t_cjs_temp_export(exports 转换的 export 节点)节点默认全部被有效 import + let defaultImportNode = + t.importDefaultSpecifier(id); + + this.markNodeDeep( + defaultImportNode, + '$t_cjs_temp_default_import' + ); + specifiers.push(defaultImportNode); } - // If we set an invalid name, then abort out. - try { - // Ensure that the scope is clean before we inject new, - // potentially conflicting, variables. - const newName = - path.scope.generateUidIdentifier(name).name; + const importDeclaration = t.importDeclaration( + specifiers, + t.stringLiteral(source) + ); - path.scope.rename(name, newName); + this.state.globalESMImports.set(importDeclaration, [ + path.find((path) => { + return t.isProgram(path.parentPath); + }), + ]); + } + }, + }, - // Check if this name is reserved, if so, then bail out. - if (check(name)) { - return; - } + ModuleDeclaration: { + enter: () => { + this.state.isESM = true; + }, + }, + + AssignmentExpression: { + enter: (path) => { + if (path.node.$t_ignore) { + return; + } + + path.node.$t_ignore = true; - const decl = t.exportNamedDeclaration( - t.variableDeclaration('let', [ - t.variableDeclarator( - path.node.left.property, - t.memberExpression( - t.identifier('exports'), - path.node.left.property - ) + let generateExportNode = (path, name) => { + let exportName = name; + let rightNode = path.node.right; + + if (t.isIdentifier(rightNode)) { + let exportNamedDeclaration = + t.exportNamedDeclaration(null, [ + t.exportSpecifier( + t.identifier(rightNode.name), + t.identifier(exportName) ), - ]), - [] + ]); + this.state.globalESMExports.set( + exportNamedDeclaration, + [ + path.find((path) => { + return t.isProgram(path.parentPath); + }), + ] ); + } else { + let id = + path.scope.generateUidIdentifierBasedOnNode( + rightNode, + exportName + ); + let declaration = t.variableDeclaration('let', [ + t.variableDeclarator(id, rightNode), + ]); + let declarationPath = + path.insertBefore(declaration)[0]; + + let rightPath = path.get('right'); + rightPath.replaceWith(id); + + let exportNamedDeclaration = + t.exportNamedDeclaration(null, [ + t.exportSpecifier( + id, + t.identifier(exportName) + ), + ]); + this.state.globalESMExports.set( + exportNamedDeclaration, + [ + path.find((path) => { + return t.isProgram(path.parentPath); + }), + ] + ); + } + }; + + // Check for module.exports. + // 只处理顶级作用域 + // 只处理纯粹的 exports.a=1 语句 + // 即不嵌套在任何其他语句中 + if ( + t.isMemberExpression(path.node.left) && + t.isProgram(path.scope.path) && + t.isProgram(path.parentPath.parentPath) + ) { + const moduleBinding = path.scope.getBinding('module'); + const exportsBinding = path.scope.getBinding('exports'); + + // Something like `module.exports.namedExport = true;`. + if ( + t.isMemberExpression(path.node.left.object) && + path.node.left.object.object.name === 'module' + ) { + if (moduleBinding) { + return; + } + + this.state.isCJS = true; + + if ( + getStaticMemberProValue( + path.node.left.object + ) === 'exports' + ) { + let name = getStaticMemberProValue( + path.node.left + ); + + // 动态导出,不转换 + if (name === false) { + return; + } - if (!state.identifiers.has(name)) { - path.scope - .getProgramParent() - .path.pushContainer('body', decl); - state.identifiers.add(name); + generateExportNode(path, name); + } + } else if (path.node.left.object.name === 'exports') { + // Check for regular exports + let name = getStaticMemberProValue(path.node.left); + if ( + exportsBinding || + // If export is named "default" leave as is. + // It is not possible to export "default" as a named export. + // e.g. `export.default = 'a'` + // 动态导出和默认导出,不转换 + name === 'default' || + name === false + ) { + return; } - } catch {} + + this.state.isCJS = true; + + generateExportNode(path, name); + } } - } + }, }, - }, - }); -} -let code = readFile(path.resolve(__dirname, './transform-test.js')); -let ast = parseESCode(code); + MemberExpression: { + enter: (path) => { + if ( + path.node.$t_ignore2 || + this.state.isDynamicUsedExportsProperty + ) { + return; + } + + path.node.$t_ignore2 = true; + + const moduleBinding = path.scope.getBinding('module'); + const exportsBinding = path.scope.getBinding('exports'); + + let addUsedExports = () => { + let exportsProVal = getStaticMemberProValue(path.node); + + // 动态访问了 exports 上的属性 + if (exportsProVal === false) { + this.state.isDynamicUsedExportsProperty = true; + return; + } + + this.state.usedExports.add(exportsProVal); + }; + + let checkIsAssignmentExpressionLeft = () => { + let parentPath = path.parentPath; + let leftPath = parentPath.get('left'); + return leftPath === path; + }; + + if ( + t.isMemberExpression(path.node.object) && + path.node.object.object.name === 'module' + ) { + if (moduleBinding) { + return; + } + + if (checkIsAssignmentExpressionLeft()) { + return; + } + + let staticModuleProVal = getStaticMemberProValue( + path.node.object + ); + + // 动态访问了module上的属性 + // 无法确切的知道是否访问了exports属性 + // 进而无法知道访问了exports的哪些属性 + if (staticModuleProVal === false) { + this.state.isDynamicUsedExportsProperty = true; + return; + } + + if (staticModuleProVal !== 'exports') { + return; + } + + addUsedExports(); + } else if (path.node.object.name === 'exports') { + if (exportsBinding) { + return; + } -transform(ast); + if (checkIsAssignmentExpressionLeft()) { + return; + } + + addUsedExports(); + } + }, + }, + }); + } +} -const {code: outputCode} = generate( - ast, - { - /* options */ - decoratorsBeforeExport: true, - }, - code -); +module.exports = { + TransformCommonJs, +}; -writeFile( - path.resolve(path.resolve(__dirname, './transform-test-a.js')), - outputCode -); +// let src = path.resolve(__dirname, './transform-test.js'); +// let code = readFile(src); + +// console.time('transform'); +// let tt = new TransformCommonJs({src, code}); +// console.timeEnd('transform'); + +// const {code: outputCode} = generate( +// tt.ast, +// { +// /* options */ +// decoratorsBeforeExport: true, +// }, +// code +// ); + +// writeFile( +// path.resolve(path.resolve(__dirname, './transform-test-a.js')), +// outputCode +// ); diff --git a/packages/wxa-cli/src/tree-shake/transform-test-a.js b/packages/wxa-cli/src/tree-shake/transform-test-a.js deleted file mode 100644 index f35bc664..00000000 --- a/packages/wxa-cli/src/tree-shake/transform-test-a.js +++ /dev/null @@ -1,245 +0,0 @@ -'use strict'; - -import _packageJson from "../package.json"; -import _crypto2 from "crypto"; -import _fsCache2 from "./fs-cache"; -import _mkdirp2 from "mkdirp"; -import _path2 from "path"; -import _fs2 from "fs"; -import _chalk2 from "chalk"; -import _babelRuntimeHelpersInteropRequireDefault from "@babel/runtime/helpers/interopRequireDefault"; -var module = { - exports: {} -}; -var exports = module.exports; -let _interopRequireDefault = _babelRuntimeHelpersInteropRequireDefault; -Object.defineProperty(exports, '__esModule', { - value: true -}); -exports.getFiles = _getFiles; // exports.getConfig = getConfig; - -exports.readFile = _readFile; -exports.writeFile = _writeFile; -exports.isFile = _isFile; -exports.isDir = _isDir; -exports.getRelative = _getRelative; -exports.getDistPath = _getDistPath; -exports.copy = _copy; -exports.amazingCache = _amazingCache; -exports.applyPlugins = _applyPlugins; -exports.isEmpty = _isEmpty; -exports.getHash = _getHash; -exports.getHashWithString = _getHashWithString; -exports.promiseSerial = _promiseSerial; -exports.getClassSet = _getClassSet; -exports.addClass = _addClass; -exports.removeClass = _removeClass; - -let _chalk = _interopRequireDefault(_chalk2); - -let _fs = _interopRequireDefault(_fs2); - -let _path = _interopRequireDefault(_path2); - -let _mkdirp = _interopRequireDefault(_mkdirp2); - -let _fsCache = _interopRequireDefault(_fsCache2); - -let _crypto = _interopRequireDefault(_crypto2); - -let current = process.cwd(); -let pkg = _packageJson; - -function _getFiles(dir = process.cwd(), prefix = '') { - dir = _path.default.normalize(dir); - let rst = []; - exports.ttt = 1; - - if (!_fs.default.existsSync(dir)) { - return rst; - } - - let files = _fs.default.readdirSync(dir); - - files.forEach(item => { - let filepath = dir + _path.default.sep + item; - - let stat = _fs.default.statSync(filepath); - - if (stat.isFile()) { - rst.push(prefix + item); - } else if (stat.isDirectory()) { - rst = rst.concat(_getFiles(filepath, _path.default.normalize(prefix + item + _path.default.sep))); - } - }); - return rst; -} // function getConfig() { -// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); -// let config = require(configPath); -// return config; -// } - - -function _readFile(p) { - let rst = ''; - p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; - - try { - rst = _fs.default.readFileSync(p, 'utf-8'); - } catch (e) { - rst = null; - } - - return rst; -} - -function _writeFile(p, data) { - let opath = typeof p === 'string' ? _path.default.parse(p) : p; - - _mkdirp.default.sync(opath.dir); - - _fs.default.writeFileSync(p, data); -} - -function _isFile(p) { - p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; - if (!_fs.default.existsSync(p)) return false; - return _fs.default.statSync(p).isFile(); -} - -function _isDir(p) { - // console.log(isDir, fs.existsSync(p), p); - if (!_fs.default.existsSync(p)) { - return false; - } - - return _fs.default.statSync(p).isDirectory(); -} - -function _getRelative(opath) { - return _path.default.relative(current, _path.default.join(opath.dir, opath.base)); -} - -function _getDistPath(opath, ext, src, dist) { - let relative; - opath = typeof opath === 'string' ? _path.default.parse(opath) : opath; - ext = ext ? ext[0] === '.' ? ext : '.' + ext : opath.ext; - - if (_path.default.relative(current, opath.dir).indexOf('node_modules') === 0) { - relative = _path.default.relative(_path.default.join(current, 'node_modules'), opath.dir); - relative = _path.default.join('npm', relative); - } else { - relative = _path.default.relative(_path.default.join(current, src), opath.dir); - } - - return _path.default.join(current, dist, relative, opath.name + ext); -} - -function _copy(from, to) { - return new Promise((resolve, reject) => { - _mkdirp.default.sync(_path.default.parse(to).dir); - - _fs.default.copyFile(from, to, err => { - if (err) return reject(err); - resolve(); - }); - }); -} - -function _amazingCache(params, needCache) { - let defaultOpts = { - directory: true, - identifier: JSON.stringify({ - '@wxa/cli2': pkg.version, - 'env': process.env.NODE_ENV || 'development' - }) - }; - let cacheParams = Object.assign({}, defaultOpts, params); - - if (needCache) { - return (0, _fsCache.default)(cacheParams); - } else { - let { - source, - transform, - options - } = cacheParams; - return transform(source, options); - } -} - -function _applyPlugins(plugins, compiler) { - if (plugins == null) return; // console.log(plugins); - - if (typeof plugins !== 'object') { - throw new Error('wxa配置文件有误,plugins'); - } - - if (!Array.isArray(plugins)) plugins = [plugins]; - plugins.forEach(plugin => plugin.apply(compiler)); -} - -function _isEmpty(n) { - return n == null || n === ''; -} - -function _getHash(filepath) { - let content = _readFile(filepath); - - return content == null ? Date.now() : _crypto.default.createHash('md5').update(content).digest('hex'); -} - -function _getHashWithString(content) { - return content == null ? Date.now() : _crypto.default.createHash('md5').update(content).digest('hex'); -} - -function _promiseSerial(funs) { - return funs.reduce((promise, fun) => { - return promise.then(result => fun().then(Array.prototype.concat.bind(result))); - }, Promise.resolve([])); -} - -function _getClassSet(classStr) { - let classList = []; - - if (classStr && typeof classStr === 'string') { - classList = classStr.split(' '); - } - - return new Set(classList); -} - -function _addClass(classStr, newClass) { - let classSet = _getClassSet(classStr); - - classSet.add(newClass); - return Array.from(classSet); -} - -function _removeClass(classStr, destClass) { - let classSet = _getClassSet(classStr); - - classSet.delete(destClass); - return Array.from(classSet); -} // # sourceMappingURL=utils.js.map - - -export let getFiles = exports.getFiles; -export let readFile = exports.readFile; -export let writeFile = exports.writeFile; -export let isFile = exports.isFile; -export let isDir = exports.isDir; -export let getRelative = exports.getRelative; -export let getDistPath = exports.getDistPath; -export let copy = exports.copy; -export let amazingCache = exports.amazingCache; -export let applyPlugins = exports.applyPlugins; -export let isEmpty = exports.isEmpty; -export let getHash = exports.getHash; -export let getHashWithString = exports.getHashWithString; -export let promiseSerial = exports.promiseSerial; -export let getClassSet = exports.getClassSet; -export let addClass = exports.addClass; -export let removeClass = exports.removeClass; -export let ttt = exports.ttt; -export default module.exports; \ No newline at end of file diff --git a/packages/wxa-cli/src/tree-shake/transform-test.js b/packages/wxa-cli/src/tree-shake/transform-test.js deleted file mode 100644 index a386ef7a..00000000 --- a/packages/wxa-cli/src/tree-shake/transform-test.js +++ /dev/null @@ -1,233 +0,0 @@ -'use strict'; - -let _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault'); - -Object.defineProperty(exports, '__esModule', { - value: true, -}); -exports.getFiles = getFiles; -// exports.getConfig = getConfig; -exports.readFile = readFile; -exports.writeFile = writeFile; -exports.isFile = isFile; -exports.isDir = isDir; -exports.getRelative = getRelative; -exports.getDistPath = getDistPath; -exports.copy = copy; -exports.amazingCache = amazingCache; -exports.applyPlugins = applyPlugins; -exports.isEmpty = isEmpty; -exports.getHash = getHash; -exports.getHashWithString = getHashWithString; -exports.promiseSerial = promiseSerial; -exports.getClassSet = getClassSet; -exports.addClass = addClass; -exports.removeClass = removeClass; - -let _chalk = _interopRequireDefault(require('chalk')); - -let _fs = _interopRequireDefault(require('fs')); - -let _path = _interopRequireDefault(require('path')); - -let _mkdirp = _interopRequireDefault(require('mkdirp')); - -let _fsCache = _interopRequireDefault(require('./fs-cache')); - -let _crypto = _interopRequireDefault(require('crypto')); - -let current = process.cwd(); - -let pkg = require('../package.json'); - -function getFiles(dir = process.cwd(), prefix = '') { - dir = _path.default.normalize(dir); - let rst = []; - - exports.ttt= 1; - - if (!_fs.default.existsSync(dir)) { - return rst; - } - - let files = _fs.default.readdirSync(dir); - - files.forEach((item) => { - let filepath = dir + _path.default.sep + item; - - let stat = _fs.default.statSync(filepath); - - if (stat.isFile()) { - rst.push(prefix + item); - } else if (stat.isDirectory()) { - rst = rst.concat( - getFiles( - filepath, - _path.default.normalize(prefix + item + _path.default.sep) - ) - ); - } - }); - return rst; -} - -// function getConfig() { -// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); - -// let config = require(configPath); - -// return config; -// } - -function readFile(p) { - let rst = ''; - p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; - - try { - rst = _fs.default.readFileSync(p, 'utf-8'); - } catch (e) { - rst = null; - } - - return rst; -} - -function writeFile(p, data) { - let opath = typeof p === 'string' ? _path.default.parse(p) : p; - - _mkdirp.default.sync(opath.dir); - - _fs.default.writeFileSync(p, data); -} - -function isFile(p) { - p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p; - if (!_fs.default.existsSync(p)) return false; - return _fs.default.statSync(p).isFile(); -} - -function isDir(p) { - // console.log(isDir, fs.existsSync(p), p); - if (!_fs.default.existsSync(p)) { - return false; - } - - return _fs.default.statSync(p).isDirectory(); -} - -function getRelative(opath) { - return _path.default.relative( - current, - _path.default.join(opath.dir, opath.base) - ); -} - -function getDistPath(opath, ext, src, dist) { - let relative; - opath = typeof opath === 'string' ? _path.default.parse(opath) : opath; - ext = ext ? (ext[0] === '.' ? ext : '.' + ext) : opath.ext; - - if ( - _path.default.relative(current, opath.dir).indexOf('node_modules') === 0 - ) { - relative = _path.default.relative( - _path.default.join(current, 'node_modules'), - opath.dir - ); - relative = _path.default.join('npm', relative); - } else { - relative = _path.default.relative( - _path.default.join(current, src), - opath.dir - ); - } - - return _path.default.join(current, dist, relative, opath.name + ext); -} - -function copy(from, to) { - return new Promise((resolve, reject) => { - _mkdirp.default.sync(_path.default.parse(to).dir); - - _fs.default.copyFile(from, to, (err) => { - if (err) return reject(err); - resolve(); - }); - }); -} - -function amazingCache(params, needCache) { - let defaultOpts = { - directory: true, - identifier: JSON.stringify({ - '@wxa/cli2': pkg.version, - 'env': process.env.NODE_ENV || 'development', - }), - }; - let cacheParams = Object.assign({}, defaultOpts, params); - - if (needCache) { - return (0, _fsCache.default)(cacheParams); - } else { - let {source, transform, options} = cacheParams; - return transform(source, options); - } -} - -function applyPlugins(plugins, compiler) { - if (plugins == null) return; // console.log(plugins); - - if (typeof plugins !== 'object') { -throw new Error('wxa配置文件有误,plugins'); -} - if (!Array.isArray(plugins)) plugins = [plugins]; - plugins.forEach((plugin) => plugin.apply(compiler)); -} - -function isEmpty(n) { - return n == null || n === ''; -} - -function getHash(filepath) { - let content = readFile(filepath); - return content == null - ? Date.now() - : _crypto.default.createHash('md5').update(content).digest('hex'); -} - -function getHashWithString(content) { - return content == null - ? Date.now() - : _crypto.default.createHash('md5').update(content).digest('hex'); -} - -function promiseSerial(funs) { - return funs.reduce((promise, fun) => { - return promise.then((result) => - fun().then(Array.prototype.concat.bind(result)) - ); - }, Promise.resolve([])); -} - -function getClassSet(classStr) { - let classList = []; - - if (classStr && typeof classStr === 'string') { - classList = classStr.split(' '); - } - - return new Set(classList); -} - -function addClass(classStr, newClass) { - let classSet = getClassSet(classStr); - classSet.add(newClass); - return Array.from(classSet); -} - -function removeClass(classStr, destClass) { - let classSet = getClassSet(classStr); - classSet.delete(destClass); - return Array.from(classSet); -} -// # sourceMappingURL=utils.js.map From cb819953f801d9756e603d028eae5bb4b433555e Mon Sep 17 00:00:00 2001 From: sparklinm Date: Sun, 20 Jun 2021 22:09:14 +0800 Subject: [PATCH 12/20] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8path.scope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/expDFOF/index.js | 6 +- packages/wxa-cli/example/index.js | 8 +- packages/wxa-cli/example/shaking/cjs1.js | 6 +- packages/wxa-cli/example/shaking/cjs2.js | 3 + packages/wxa-cli/example/shaking/index.js | 27 +- packages/wxa-cli/example/shaking/user.js | 18 +- packages/wxa-cli/example/user.js | 8 +- packages/wxa-cli/src/tree-shake/graph.js | 389 +++++++++--------- packages/wxa-cli/src/tree-shake/index.js | 197 ++++----- .../src/tree-shake/tansform-commonJS.js | 24 +- packages/wxa-cli/src/tree-shake/util.js | 50 +++ 11 files changed, 390 insertions(+), 346 deletions(-) diff --git a/packages/wxa-cli/example/expDFOF/index.js b/packages/wxa-cli/example/expDFOF/index.js index 47ab447c..6be76333 100644 --- a/packages/wxa-cli/example/expDFOF/index.js +++ b/packages/wxa-cli/example/expDFOF/index.js @@ -15,11 +15,13 @@ export {o1 as o11, o2}; // export {default} from '' // export {a as default} from '' // export * as default from '' -// export default function() {} -// export default {} // export {a as default} // let p1 = 1 // export default p1 +// export default 1 +// export default a=1 +// export default function() {} +// export default {} // 导出全部 export * from ''; diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index 95802b95..ad6a6836 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -10,6 +10,7 @@ isFile(); getName(); +let ssqqww =1; console.log(user); let a = {x: 1}, @@ -21,6 +22,8 @@ function m(x = 1, y) { t = 9; t + 5; let qqq = 10; + let ssqqww =5; + console.log(ssqqww); } m(); @@ -63,12 +66,14 @@ let obj = { // m, // age, // }; + +export let qwe=1, rty=2; export function getName() {} // export {m as qqqqq, a as default}; // export {x, y} from './a'; -export default function() {} +// export default function asf() {}; export {Myclass}; // eslint-disable-next-line no-var @@ -76,5 +81,6 @@ export {Myclass}; export {mm as ttttttt}; export {getName as tttt} from './user'; +export {default} from './user'; export * as tttttt from './user'; diff --git a/packages/wxa-cli/example/shaking/cjs1.js b/packages/wxa-cli/example/shaking/cjs1.js index 8410bbe5..e14a0de4 100644 --- a/packages/wxa-cli/example/shaking/cjs1.js +++ b/packages/wxa-cli/example/shaking/cjs1.js @@ -10,7 +10,7 @@ module.exports = { getFiles, }; -function getFiles(dir = process.cwd(), prefix = '') { +function getFiles() { let rst = []; exports.rst = rst; // exports[aaaa] = aaaa; // let ttt= require('sss'); @@ -25,6 +25,6 @@ function getFiles(dir = process.cwd(), prefix = '') { // } -function writeFile(p, data) {} +function writeFile() {} -function isFile(p) {} +function isFile() {} diff --git a/packages/wxa-cli/example/shaking/cjs2.js b/packages/wxa-cli/example/shaking/cjs2.js index e69de29b..3e913ad3 100644 --- a/packages/wxa-cli/example/shaking/cjs2.js +++ b/packages/wxa-cli/example/shaking/cjs2.js @@ -0,0 +1,3 @@ +function fn1() {} + +exports.fn1 = fn1; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index 69184d60..b01cb479 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -1,9 +1,11 @@ /* eslint-disable one-var */ import './user'; import * as user from './user'; +import './user'; import {writeFile, isFile} from './cjs1'; writeFile(); isFile(); +getName(); console.log(user); let a = { x: 1, @@ -11,15 +13,17 @@ let a = { n = 1; let t = 10; -function m(x = 1, y) { +function m() { a = 5; ++a; t = 9; t + 5; + let ssqqww = 5; + console.log(ssqqww); } m(); -[1, 2, 3].forEach(function(item) {}); +[1, 2, 3].forEach(function() {}); for (i = 0; i < 100; i++) {} @@ -28,10 +32,12 @@ class Myclass { [n] = () => {}; } -export function mm() {} +function mm() {} + +export {mm}; mm(); -(function(x, y) {})(); // export default { +(function() {})(); // export default { // x: 1, // t() { // }, @@ -40,12 +46,19 @@ mm(); // }; -export function getName() {} // export {m as qqqqq, a as default}; -// export {x, y} from './a'; +let qwe = 1, + rty = 2; +export {qwe, rty}; -export default function() {} +function getName() {} + +export {getName}; +// export {m as qqqqq, a as default}; +// export {x, y} from './a'; +// export default function asf() {}; export {Myclass}; // eslint-disable-next-line no-var export {mm as ttttttt}; export {getName as tttt} from './user'; +export {default} from './user'; export * as tttttt from './user'; diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index 8c0a6fbd..30abbdf1 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -1,6 +1,16 @@ -export function getName() {} // export default function getUser(params) { +function getName() {} + +export {getName}; +// export default function getUser(params) { // } +let a = 1; +export default a; // eslint-disable-next-line one-var + +let mm1 = 1, + c = function mm2() {}; + +export {mm1, c}; + +function fn2() {} -// eslint-disable-next-line one-var -export let mm1 = 1, - c = function mm2(params) {}; +export {fn2}; diff --git a/packages/wxa-cli/example/user.js b/packages/wxa-cli/example/user.js index 3b5a254a..1a9d9326 100644 --- a/packages/wxa-cli/example/user.js +++ b/packages/wxa-cli/example/user.js @@ -11,5 +11,11 @@ export default a; // eslint-disable-next-line one-var export let mm1 =1, c=function mm2(params) { - }; + +function fn2(params) { + +} + +export {fn2}; + diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js index d5b57acf..fccae28b 100644 --- a/packages/wxa-cli/src/tree-shake/graph.js +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -1,6 +1,6 @@ const traverse = require('@babel/traverse').default; -const {Scope} = require('./scope'); -const {readFile, resolveDepSrc, parseESCode} = require('./util'); +const t = require('@babel/types'); +const {readFile, resolveDepSrc, parseESCode, dceDeclaration} = require('./util'); let {TransformCommonJs} = require('./tansform-commonJS'); class Graph { @@ -21,9 +21,6 @@ class Graph { s += '.js'; } - // console.log('--------'); - // console.log(s); - return s; } @@ -39,169 +36,172 @@ class Graph { return expSrc; } - collectDeclaration(path, scope) { - function addToScope(node, attr, isBlockDeclaration = false) { - let identifierNode = node[attr]; - - // 类似于export default function(){} - // 这类声明也不能在本文件内使用,直接忽略 - if (!identifierNode || !identifierNode.name) { - return; - } - - identifierNode._skip = true; - - node._usedByNodes = []; - scope.add(node, identifierNode.name, isBlockDeclaration); - } - - let {node} = path; - let childScope; - - switch (node.type) { - // 函数声明 function a(){} - case 'FunctionDeclaration': - childScope = new Scope({ - parent: scope, - block: false, - }); - addToScope(node, 'id', false); - // 箭头函数 ()=>{} - case 'ArrowFunctionExpression': - // 函数表达式 function(){} - case 'FunctionExpression': - childScope = new Scope({ - parent: scope, - block: false, - }); - break; - // 块级作用域{} - case 'BlockStatement': - childScope = new Scope({ - parent: scope, - block: true, - }); - break; - // 变量声明 - case 'VariableDeclaration': - node.declarations.forEach((variableDeclarator) => { - if (node.kind === 'let' || node.kind === 'const') { - addToScope(variableDeclarator, 'id', true); - } else { - addToScope(variableDeclarator, 'id', false); - } - }); - break; - // 类的声明 - case 'ClassDeclaration': - addToScope(node, 'id', true); - break; - // import 的声明 - case 'ImportDeclaration': - node.specifiers.forEach((specifier) => { - if (node.$t_cjs_temp_import) { - return; - } - addToScope(specifier, 'local', true); - }); - break; - } - - return childScope; - } + collectImport(src) { + let imports = {}; + let store = (name, path, node) => { + let impSrc = this.getAbsolutePath(src, node.source.value); + imports[impSrc] = imports[impSrc] || {}; + imports[impSrc][name] = path; + }; - collectImport(path) { - let {node} = path; - let importInfo = null; - - switch (node.type) { - // import 的声明 - case 'ImportDeclaration': - importInfo = {}; - node.specifiers.forEach((specifier) => { - let name = specifier.imported && specifier.imported.name; - if (!name) { - if (specifier.type === 'ImportDefaultSpecifier') { - name = 'default'; - } else if ( - specifier.type === 'ImportNamespaceSpecifier' - ) { - name = '*'; + let visitor = { + ImportDeclaration: { + enter: (path) => { + let {node} = path; + let specifierPaths = path.get('specifiers'); + specifierPaths.forEach((specifierPath) => { + let specifierNode = specifierPath.node; + let name = + specifierNode.imported && + specifierNode.imported.name; + + if (!name) { + if ( + specifierNode.type === 'ImportDefaultSpecifier' + ) { + name = 'default'; + } else if ( + specifierNode.type === + 'ImportNamespaceSpecifier' + ) { + name = '*'; + } } - } - importInfo[name] = specifier; - }); - break; - } + store(name, specifierPath, node); + }); + }, + }, + }; - return importInfo; + return {visitor, imports}; } - collectExport(path, isRoot) { - let {node} = path; - let exportInfo = null; + collectExport(src, isRoot) { + let exports = {}; - let markShakingFlag = (node) => { + let store = (name, path, node) => { if (isRoot) { - node._shake = 0; + path._shake = 0; } else { - node._shake = 1; + path._shake = 1; } + let expSrc = this.getExpSrc(node, src); + exports[expSrc] = exports[expSrc] || {}; + exports[expSrc][name] = path; }; - switch (node.type) { - // export 的声明 - case 'ExportNamedDeclaration': - exportInfo = {}; - if (node.specifiers && node.specifiers.length) { - node.specifiers.forEach((specifier) => { - let name = specifier.exported.name; - exportInfo[name] = specifier; - markShakingFlag(specifier); - }); - } else { - let declaration = node.declaration; - - if (declaration.type === 'FunctionDeclaration') { - let name = declaration.id.name; - exportInfo[name] = declaration; - declaration._shake = 1; - markShakingFlag(declaration); - } else if (declaration.type === 'VariableDeclaration') { - declaration.declarations.forEach( - (variableDeclarator) => { - let name = variableDeclarator.id.name; - exportInfo[name] = variableDeclarator; - markShakingFlag(variableDeclarator); - } + let storeSpecifiers = (path, node) => { + let specifierPaths = path.get('specifiers'); + specifierPaths.forEach((specifierPath) => { + let name = specifierPath.node.exported.name; + store(name, specifierPath, node); + }); + }; + + let transformExportDeclarationToSpecifiers = (path) => { + let declarationPath = path.get('declaration'); + let declarationNode = declarationPath.node; + let specifiers = []; + + if (declarationNode.type === 'FunctionDeclaration') { + let name = declarationNode.id.name; + specifiers.push( + t.exportSpecifier(t.identifier(name), t.identifier(name)) + ); + } else if (declarationNode.type === 'VariableDeclaration') { + let declarationPaths = declarationPath.get('declarations'); + declarationPaths.forEach((variableDeclaratorPath) => { + let name = variableDeclaratorPath.node.id.name; + specifiers.push( + t.exportSpecifier( + t.identifier(name), + t.identifier(name) + ) + ); + }); + } else if (declarationNode.type === 'ClassDeclaration') { + let name = declarationNode.id.name; + specifiers.push( + t.exportSpecifier(t.identifier(name), t.identifier(name)) + ); + } + + return {specifiers, declarationNode}; + }; + + let visitor = { + ExportNamedDeclaration: { + enter: (path) => { + let {node} = path; + + if (node.specifiers && node.specifiers.length) { + storeSpecifiers(path, node); + } else { + let {specifiers, declarationNode} = + transformExportDeclarationToSpecifiers(path); + + path.insertBefore(declarationNode); + let exportNamedDeclaration = t.exportNamedDeclaration( + null, + specifiers ); - } else if (declaration.type === 'ClassDeclaration') { - let name = declaration.id.name; - exportInfo[name] = declaration; - markShakingFlag(declaration); + let newExportPath = path.insertAfter( + exportNamedDeclaration + )[0]; + path.remove(); + + storeSpecifiers(newExportPath, node); + } + }, + }, + ExportDefaultDeclaration: { + enter: (path) => { + let {node} = path; + let declarationNode = node.declaration; + let exportPath = path; + + // TODO,未处理 export default a=1 这类表达式 + // 类似于export default function mm(){} + // 单独声明mm,并export default {mm} + if (declarationNode.id && declarationNode.id.name) { + path.insertBefore(declarationNode); + let exportDefaultNode = t.exportDefaultDeclaration( + t.objectExpression([ + t.objectProperty( + t.identifier(declarationNode.id.name), + t.identifier(declarationNode.id.name) + ), + ]) + ); + exportPath = path.insertAfter(exportDefaultNode)[0]; + path.remove(); } - } - break; - case 'ExportDefaultDeclaration': - exportInfo = {}; - let declaration = node.declaration; - - if (declaration) { - exportInfo.default = declaration; - } else { - exportInfo.default = node; - } - markShakingFlag(exportInfo.default); - break; - case 'ExportAllDeclaration': - exportInfo = {}; - exportInfo['*'] = node; - markShakingFlag(node); - break; - } + store('default', exportPath, node); + }, + }, + ExportAllDeclaration: { + enter: (path) => { + let {node} = path; + store('*', path, node); + }, + }, + }; + + return {visitor, exports}; + } - return exportInfo; + dceDeclaration(ast) { + let currentScope = null; + traverse(ast, { + enter: (path) => { + let scope = path.scope; + if (currentScope !== scope) { + currentScope = scope; + dceDeclaration(currentScope); + } + }, + }); } analysis() { @@ -218,60 +218,39 @@ class Graph { content = entry.content; } - // if (src.endsWith('safe-area-inset\\index.js')) { + // if (src.endsWith('user.js')) { // console.log('src', src); + // this.debug = true; // } if (analyzedFile[src]) { return analyzedFile[src]; } + + console.log('---'); + console.log(src); - // console.log(src); - - let imports = {}; - let exports = {}; let code = content || readFile(src); let ast = parseESCode(code); - let transformCommonJs = new TransformCommonJs({src, code, ast}); + this.dceDeclaration(ast); - let scope = new Scope(); + let topScope = null; + let transformCommonJs = new TransformCommonJs({src, code, ast}); + let {visitor: exportVisitor, exports} = this.collectExport( + src, + isRoot + ); + let {visitor: importVisitor, imports} = this.collectImport(src); traverse(ast, { - enter: (path) => { - let {node} = path; - - let childScope = this.collectDeclaration(path, scope); - if (childScope) { - node._scope = childScope; - scope = childScope; - } - - let importInfo = this.collectImport(path); - if (importInfo) { - let impSrc = this.getAbsolutePath( - src, - node.source.value - ); - imports[impSrc] = imports[impSrc] || {}; - imports[impSrc] = {...imports[impSrc], ...importInfo}; - } - - let exportInfo = this.collectExport(path, isRoot); - if (exportInfo) { - let expSrc = this.getExpSrc(node, src); - exports[expSrc] = exports[expSrc] || {}; - exports[expSrc] = {...exports[expSrc], ...exportInfo}; - } - }, - - // 退出节点 - exit(path) { - let {node} = path; - if (node._scope) { - scope = scope.parent; - } + Program: { + enter: (path) => { + topScope = path.scope; + }, }, + ...exportVisitor, + ...importVisitor, }); // console.log(src); @@ -296,7 +275,7 @@ class Graph { * exports: { * [本文件路径]: { * // export function(){} - * [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration + * // [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration * // export default function(){} | export default{} | export {a as default} | export default a * default: ExportDefaultDeclaration | FunctionDeclaration | ClassDeclaration |ExportSpecifier, * // export {a as aaa,b,c} @@ -331,11 +310,31 @@ class Graph { imports, exports, children: [], - scope, + topScope, isRoot, transformCommonJs, }; + // const generate = require('@babel/generator').default; + // const {writeFile} = require('./util'); + // let path = require('path'); + // const {code: outputCode} = generate( + // ast, + // { + // /* options */ + // decoratorsBeforeExport: true, + // }, + // code + // ); + // writeFile( + // path.resolve( + // path.dirname(src), + // './shaking', + // path.basename(src) + // ), + // outputCode + // ); + analyzedFile[src] = dep; Object.keys(dep.imports).forEach((childSrc, index) => { diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 8c676a7b..54bff025 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,6 +1,6 @@ const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; -const {writeFile} = require('./util'); +const {writeFile, dceDeclaration} = require('./util'); let {Graph} = require('./graph'); @@ -66,6 +66,34 @@ function collectReferences(dep) { dep.children.forEach((child) => collectReferences(child)); } +// 判断两个path是否互相包含 +function checkTwoPathContainMutually(pathA, pathB) { + let is = false; + + let doCheck = (_pathA, _pathB) => { + traverse( + _pathA.node, + { + enter(path) { + if (path === _pathB) { + is = true; + path.stop(); + } + }, + }, + _pathA.scope + ); + }; + + doCheck(pathA, pathB); + + if (!is) { + doCheck(pathB, pathA); + } + + return is; +} + const REQUIRE_TO_IMPORT_DEFAULT = 'require_to_import_default'; /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 @@ -78,7 +106,7 @@ function shake(dep) { return; } - let imports = dep.imports; + let {imports, exports, isRoot} = dep; let mark = (dep, usedNames, childSrc) => { if (usedNames.length) { @@ -95,13 +123,13 @@ function shake(dep) { } let usedExports = {}; - let addUsedExport = (src, node) => { + let addUsedExport = (src, path) => { usedExports[src] = usedExports[src] || {}; - let local = node.local; + let local = path.node.local; if (local) { - usedExports[src][local.name] = node; + usedExports[src][local.name] = path; } else { - usedExports[src]['*'] = node; + usedExports[src]['*'] = path; } }; @@ -116,29 +144,29 @@ function shake(dep) { ); let markedDefalut = false; if (localExports) { - Object.entries(localExports[1]).forEach(([name, node]) => { + Object.entries(localExports[1]).forEach(([name, path]) => { if (name === 'default') { if (hasDefalut) { - node._shake = 0; + path._shake = 0; markedDefalut = true; } } else { - node._shake = 0; + path._shake = 0; } }); } externalExports.forEach(([src, value]) => { - Object.entries(value).forEach(([name, node]) => { + Object.entries(value).forEach(([name, path]) => { if ( (name === 'default' && hasDefalut && !markedDefalut) || name !== 'default' ) { - if (node._shake === 1) { - node._shake = 0; - addUsedExport(src, node); + if (path._shake === 1) { + path._shake = 0; + addUsedExport(src, path); } } }); @@ -146,30 +174,19 @@ function shake(dep) { } else { usedNames.forEach((name) => { if (localExports) { - // if (name === REQUIRE_TO_IMPORT_DEFAULT) { - // Object.values(localExports[1]).forEach((node) => { - // // exports 转换的 export 节点 - // if (node.$t_cjs_temp_export) { - // node._shake = 0; - // } - // }); - - // return; - // } - - let node = localExports[1][name]; - if (node) { - node._shake = 0; + let path = localExports[1][name]; + if (path) { + path._shake = 0; return; } } externalExports.forEach(([src, value]) => { - let node = value[name] || value['*']; - if (node) { - if (node._shake === 1) { - node._shake = 0; - addUsedExport(src, node); + let path = value[name] || value['*']; + if (path) { + if (path._shake === 1) { + path._shake = 0; + addUsedExport(src, path); } } }); @@ -185,15 +202,15 @@ function shake(dep) { Object.entries(imports).forEach(([src, value]) => { let usedNames = []; - Object.entries(value).forEach(([name, node]) => { + Object.entries(value).forEach(([name, path]) => { // require 转成的 import default 节点 // 这些节点默认被本文件使用 - if (node.$t_cjs_temp_default_import) { + if (path.node.$t_cjs_temp_default_import) { usedNames.push(REQUIRE_TO_IMPORT_DEFAULT); return; } - if (node === 'child_scope_require') { + if (path.node === 'child_scope_require') { if (name === 'default') { usedNames.push(REQUIRE_TO_IMPORT_DEFAULT); } else { @@ -203,13 +220,25 @@ function shake(dep) { return; } - if (node._usedByNodes && node._usedByNodes.length) { - usedNames.push(name); - } + usedNames.push(name); }); mark(dep, usedNames, src); }); + // 根节点的export语句默认全部保留 + // 所以还需要处理根节点的export语句(export {} from '') + if (isRoot) { + Object.entries(exports).forEach(([src, value]) => { + if (src !== dep.src) { + let usedNames = []; + Object.entries(value).forEach(([name]) => { + usedNames.push(name); + }); + mark(dep, usedNames, src); + } + }); + } + dep._shook = true; dep.children.forEach((child) => shake(child)); @@ -220,47 +249,9 @@ function remove(dep) { return; } - let {scope, exports} = dep; - let loop = true; - - let markRemoved = (node) => { - node._removed = 1; - traverse(node, { - noScope: true, - enter(path) { - let {node} = path; - node._removed = 1; - }, - }); - }; - - let doRemove = (scope) => { - let {nodes: allNodes} = scope; - Object.values(allNodes).forEach((nodes) => { - nodes.forEach((node) => { - if (node._removed === 1) { - return; - } - - if ( - (node._usedByNodes.length === 0 && - (node._shake === 1 || node._shake === undefined)) || - (node._usedByNodes.length !== 0 && - node._usedByNodes.every((node) => node._removed)) - ) { - loop = true; - markRemoved(node); - } - }); - }); - - scope.children.forEach((childScope) => { - doRemove(childScope); - }); - }; + let {topScope, exports, src} = dep; let transformCommonJs = dep.transformCommonJs; - transformCommonJs.traverseTransformedModuleDeclaration(markRemoved); /** * 遍历exports,shake 标志表示该节点是否被外部有效的 import(即import的方法变量被使用过) @@ -271,38 +262,31 @@ function remove(dep) { * shake=1且_usedByNodes不存在,表示该export节点即不被外部有效import,也不会被内部使用 * shake=1且_usedByNodes存在且有值,表示该节点不被外部有效import,但被内部使用 */ + Object.entries(exports).forEach(([src, value]) => { - Object.entries(value).forEach(([name, node]) => { - if (node.$t_cjs_temp_export) { + Object.entries(value).forEach(([name, path]) => { + if (path.node.$t_cjs_temp_export) { if ( !transformCommonJs.state.isDynamicUsedExportsProperty && - node._shake === 1 && + path._shake === 1 && !transformCommonJs.state.usedExports.has(name) ) { - let cjsExportNode = transformCommonJs.getCJSExport(node); - if (cjsExportNode) { - console.log('111'); - markRemoved(cjsExportNode); - } + transformCommonJs.deleteCJSExport(path); } return; } - if ( - node._shake === 1 && - (!node._usedByNodes || - (node._usedByNodes && node._usedByNodes.length === 0)) - ) { - markRemoved(node); + if (path._shake === 1) { + path.remove(); } }); }); - while (loop) { - loop = false; - doRemove(scope); - } + transformCommonJs.deleteTransformedModuleDeclaration(); + + + dceDeclaration(topScope, true); dep._removed = true; @@ -319,21 +303,6 @@ function output(dep) { return; } - console.log(src); - if (src.endsWith('cjs1.js')) { - console.log('ss'); - } - - traverse(ast, { - enter(path) { - let {node} = path; - // console.log(path.toString()); - if (node._removed === 1) { - path.remove(); - } - }, - }); - const {code: outputCode} = generate( ast, { @@ -365,11 +334,11 @@ function output(dep) { function start(entries) { let graph = new Graph(entries); - graph.roots.forEach((root) => { - collectReferences(root); - }); + // graph.roots.forEach((root) => { + // collectReferences(root); + // }); - console.log('collected'); + // console.log('collected'); graph.roots.forEach((root) => { shake(root); diff --git a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js index 056807af..f3708ac5 100644 --- a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js +++ b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js @@ -96,10 +96,10 @@ class TransformCommonJs { }); } - deleteCJSExport(esmExportNode) { + deleteCJSExport(esmExportPath) { Array.from(this.state.globalESMExports).some( ([exportPath, cjsPaths]) => { - if (this.isChildNode(exportPath.node, esmExportNode)) { + if (this.isChildNode(exportPath.node, esmExportPath.node)) { cjsPaths.forEach((p) => p.remove()); return true; } @@ -107,21 +107,6 @@ class TransformCommonJs { ); } - getCJSExport(esmExportNode) { - let node = null; - - Array.from(this.state.globalESMExports).some( - ([exportPath, cjsPaths]) => { - if (this.isChildNode(exportPath.node, esmExportNode)) { - node = cjsPaths[0].node; - return true; - } - } - ); - - return node; - } - markNodeDeep(node, flag) { node[flag] = true; traverse(node, { @@ -203,16 +188,16 @@ class TransformCommonJs { let globalESMImports = new Map(); this.state.globalESMImports.forEach((paths, node) => { - this.markNodeDeep(node, '$t_cjs_temp_import'); let importPath = path.unshiftContainer('body', node)[0]; + this.markNodeDeep(node, '$t_cjs_temp_import'); globalESMImports.set(importPath, paths); }); this.state.globalESMImports = globalESMImports; let globalESMExports = new Map(); this.state.globalESMExports.forEach((paths, node) => { - this.markNodeDeep(node, '$t_cjs_temp_export'); let exportPath = path.pushContainer('body', node)[0]; + this.markNodeDeep(node, '$t_cjs_temp_export'); globalESMExports.set(exportPath, paths); }); this.state.globalESMExports = globalESMExports; @@ -395,6 +380,7 @@ class TransformCommonJs { ]); let declarationPath = path.insertBefore(declaration)[0]; + path.scope.registerBinding('let', declarationPath); let rightPath = path.get('right'); rightPath.replaceWith(id); diff --git a/packages/wxa-cli/src/tree-shake/util.js b/packages/wxa-cli/src/tree-shake/util.js index c55305d9..52dadc2b 100644 --- a/packages/wxa-cli/src/tree-shake/util.js +++ b/packages/wxa-cli/src/tree-shake/util.js @@ -2,6 +2,7 @@ let fs = require('fs'); let path = require('path'); let mkdirp = require('mkdirp'); const {parse} = require('@babel/parser'); +const t = require('@babel/types'); let findRoot = require('find-root'); function readFile(p) { @@ -145,6 +146,54 @@ function parseESCode(code, plugins = [], options) { }); } +function dceDeclaration(scope, trackReferences = false) { + let hasRemoved = false; + Object.entries(scope.bindings).forEach(([name, binding]) => { + // 类似于let a = function ff(){} + // ff 是函数内部作用域的binding,ff不应该被删除 + if (t.isFunctionExpression(binding.path)) { + return; + } + + if (!binding.referenced) { + scope.removeOwnBinding(name); + binding.path.remove(); + hasRemoved = true; + return; + } + + // 使用path.remove删除节点后 + // 并不会让 scope 中的 binding.referenced 等信息更新 + // 即使重新遍历也不会更新 + if (trackReferences) { + let canRemove = binding.referencePaths.every((reference) => { + let parentPath = reference; + while (parentPath) { + if (!parentPath.node) { + return true; + } + + parentPath = parentPath.parentPath; + } + + return false; + }); + + if (canRemove) { + scope.removeOwnBinding(name); + binding.path.remove(); + hasRemoved = true; + } + } + }); + + // 处理声明之间循环引用 + // 当一个声明未被使用时,那该声明所引用的其他声明不算真正使用 + if (hasRemoved) { + dceDeclaration(scope, true); + } +} + // console.log( // resolveDepSrc({ // fileSrc: path.join(cwd, './src/a.js'), @@ -161,4 +210,5 @@ module.exports = { writeFile, resolveDepSrc, parseESCode, + dceDeclaration, }; From 73b186299ef83c5c26feef99a4a5721d6f7bfcc5 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Sat, 10 Jul 2021 10:28:09 +0800 Subject: [PATCH 13/20] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=20commonjs=20s?= =?UTF-8?q?hake?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/index.js | 59 ++- packages/wxa-cli/example/shaking/cjs1.js | 15 +- packages/wxa-cli/example/shaking/cjs2.js | 6 +- packages/wxa-cli/example/shaking/index.js | 109 +++- packages/wxa-cli/example/shaking/user.js | 19 +- packages/wxa-cli/example/user.js | 8 +- packages/wxa-cli/src/tree-shake/config.js | 40 ++ packages/wxa-cli/src/tree-shake/graph.js | 126 +++-- packages/wxa-cli/src/tree-shake/index.js | 400 +++++++------- .../src/tree-shake/tansform-commonJS.js | 499 ++++++++---------- packages/wxa-cli/src/tree-shake/test.js | 25 + packages/wxa-cli/src/tree-shake/util.js | 173 ++++-- 12 files changed, 867 insertions(+), 612 deletions(-) create mode 100644 packages/wxa-cli/src/tree-shake/config.js create mode 100644 packages/wxa-cli/src/tree-shake/test.js diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js index ad6a6836..abf3bdb1 100644 --- a/packages/wxa-cli/example/index.js +++ b/packages/wxa-cli/example/index.js @@ -1,5 +1,5 @@ /* eslint-disable one-var */ -import getMyUser, {getName as getMyName} from './user'; +import getAge, {getName as getMyName} from './user'; import * as user from './user'; import {getName as tttqw} from './user'; @@ -12,7 +12,9 @@ getName(); let ssqqww =1; -console.log(user); +// console.log(user); +console.log(getAge); + let a = {x: 1}, n = 1; let t = 10; @@ -27,6 +29,13 @@ function m(x = 1, y) { } m(); +try { + let a = 1; + console.log(a); +} catch (error) { + +} + let ttt = function({x: xxx, y}) {}; let sss = (a, b) => {}; @@ -41,7 +50,36 @@ class Myclass { [n] = () => {}; } -export function mm() {} +let [zz, xx, cc] = [1, 2, 3]; +let {x: x1} = {x: 1, y2: 2}; + +let {detail: {code, code1}} = {detail: {code: 1}}; + + +let o22=1; +let o11 = o22 =3; + +console.log(o22); + + +let clearErrorMsg = function({p1, p2}, {currentTarget: {dataset: {rule, as, name, opts={}}}}, [asq, ttqw], ppp) { + let asdf='p'; +}; + + +function aaa({p1, p2}) { + let asdwqe='p'; + + function att() { + + } +}; + +aaa(); + + +clearErrorMsg(); + mm(); @@ -52,6 +90,11 @@ function name(params) { t.q; } + +function aaas() { + name(); +} + let obj = { x: 1, t() {}, @@ -69,18 +112,20 @@ let obj = { export let qwe=1, rty=2; export function getName() {} +export function mm() {} + // export {m as qqqqq, a as default}; // export {x, y} from './a'; -// export default function asf() {}; +export default class asf {}; export {Myclass}; // eslint-disable-next-line no-var export {mm as ttttttt}; -export {getName as tttt} from './user'; -export {default} from './user'; +// export {getName as tttt} from './user'; +// export {default} from './user'; -export * as tttttt from './user'; +// export * as tttttt from './user'; diff --git a/packages/wxa-cli/example/shaking/cjs1.js b/packages/wxa-cli/example/shaking/cjs1.js index e14a0de4..7aac95b8 100644 --- a/packages/wxa-cli/example/shaking/cjs1.js +++ b/packages/wxa-cli/example/shaking/cjs1.js @@ -2,17 +2,18 @@ let fn1 = require('./cjs2').fn1; fn1(); Object.defineProperty(exports, '__esModule', { - value: true, + value: true }); exports.writeFile = writeFile; exports.isFile = isFile; module.exports = { - getFiles, + getFiles }; -function getFiles() { +function getFiles(dir = process.cwd(), prefix = '') { let rst = []; - exports.rst = rst; // exports[aaaa] = aaaa; + exports.rst = rst; + let aaaa = 'aaa'; // exports[aaaa] = aaaa; // let ttt= require('sss'); // console.log(ttt); // exports.addClass; @@ -25,6 +26,8 @@ function getFiles() { // } -function writeFile() {} +function writeFile(p, data) {} -function isFile() {} +function isFile(p) {} + +let _m = function m() {}; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/cjs2.js b/packages/wxa-cli/example/shaking/cjs2.js index 3e913ad3..faf6661a 100644 --- a/packages/wxa-cli/example/shaking/cjs2.js +++ b/packages/wxa-cli/example/shaking/cjs2.js @@ -1,3 +1,5 @@ -function fn1() {} +function fn1(params) {} -exports.fn1 = fn1; \ No newline at end of file +exports.fn1 = fn1; + +let _fn = function fn4() {}; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index b01cb479..327a1ba9 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -1,29 +1,45 @@ /* eslint-disable one-var */ +import getAge from './user'; import './user'; -import * as user from './user'; import './user'; -import {writeFile, isFile} from './cjs1'; +import { writeFile, isFile } from './cjs1'; writeFile(); isFile(); getName(); -console.log(user); +let ssqqww = 1; // console.log(user); + +console.log(getAge); let a = { - x: 1, + x: 1 }, n = 1; let t = 10; -function m() { +function m(x = 1, y) { a = 5; ++a; t = 9; t + 5; + let qqq = 10; let ssqqww = 5; console.log(ssqqww); } m(); -[1, 2, 3].forEach(function() {}); + +try { + let a = 1; + console.log(a); +} catch (error) {} + +let ttt = function ({ + x: xxx, + y +}) {}; + +let sss = (a, b) => {}; + +[1, 2, 3].forEach(function (item) {}); for (i = 0; i < 100; i++) {} @@ -32,12 +48,62 @@ class Myclass { [n] = () => {}; } -function mm() {} +let [zz, xx, cc] = [1, 2, 3]; +let { + x: x1 +} = { + x: 1, + y2: 2 +}; +let { + detail: { + code, + code1 + } +} = { + detail: { + code: 1 + } +}; +let o22 = 1; +let o11 = o22 = 3; +console.log(o22); -export {mm}; +let clearErrorMsg = function ({ + p1, + p2 +}, { + currentTarget: { + dataset: { + rule, + as, + name, + opts = {} + } + } +}, [asq, ttqw], ppp) { + let asdf = 'p'; +}; + +function aaa({ + p1, + p2 +}) { + let asdwqe = 'p'; +} + +; +aaa(); +clearErrorMsg(); mm(); +let obj = { + x: 1, + + t() {} -(function() {})(); // export default { +}; + +(function (x, y) {})(); // export default { // x: 1, // t() { // }, @@ -48,17 +114,22 @@ mm(); let qwe = 1, rty = 2; -export {qwe, rty}; +export { qwe, rty }; function getName() {} -export {getName}; -// export {m as qqqqq, a as default}; -// export {x, y} from './a'; -// export default function asf() {}; -export {Myclass}; // eslint-disable-next-line no-var +export { getName }; + +function mm() {} + +export { mm }; + +class asf {} + +export default asf; +; +export { Myclass }; // eslint-disable-next-line no-var -export {mm as ttttttt}; -export {getName as tttt} from './user'; -export {default} from './user'; -export * as tttttt from './user'; +export { mm as ttttttt }; // export {getName as tttt} from './user'; +// export {default} from './user'; +// export * as tttttt from './user'; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index 30abbdf1..58f0c873 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -1,16 +1,11 @@ -function getName() {} +export {}; -export {getName}; -// export default function getUser(params) { -// } -let a = 1; -export default a; // eslint-disable-next-line one-var +function getAge(params) {} -let mm1 = 1, - c = function mm2() {}; - -export {mm1, c}; +export default getAge; -function fn2() {} +let mm1 = 1, + c = function mm2(params) {}; -export {fn2}; +export {}; +export {}; \ No newline at end of file diff --git a/packages/wxa-cli/example/user.js b/packages/wxa-cli/example/user.js index 1a9d9326..cfcf9a94 100644 --- a/packages/wxa-cli/example/user.js +++ b/packages/wxa-cli/example/user.js @@ -2,12 +2,12 @@ export function getName() { } -// export default function getUser(params) { +export default function getAge(params) { -// } +} -let a =1; -export default a; +// let a =1; +// export default a; // eslint-disable-next-line one-var export let mm1 =1, c=function mm2(params) { diff --git a/packages/wxa-cli/src/tree-shake/config.js b/packages/wxa-cli/src/tree-shake/config.js new file mode 100644 index 00000000..5ed7e593 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/config.js @@ -0,0 +1,40 @@ +module.exports = { + entry: [ + { + // 路径 + src: '', + // 文件内容(可选) + content: '', + }, + ], + resolveSrc: { + // '/a/b/c',绝对路径根目录 + // 例如src, '/a/b/c' 转换为 /src/a/b/b + root: '', + // {'@': 'src'},路径别名 + alias: {}, + npm: 'node_modules', + }, + commonJS: { + enable: false, + // 无法追踪动态引入的模块 + // 如果有模块被动态引入,需要在这里设置该模块路径 + // 将跳过对该模块的 cjs 转 esm + dynamicRequireTargets: [], + // 设置 exports 上的哪些属性不会被转换为 esm + // 默认值有 '__esModule' + ingoreKeys: [], + }, + parseOptions: { + plugins: [ + ['decorators', {decoratorsBeforeExport: true}], + 'classProperties', + 'jsx', + 'typescript', + 'exportNamespaceFrom', + 'exportDefaultFrom', + 'objectRestSpread', + ], + sourceType: 'unambiguous', + }, +}; diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js index fccae28b..7a7a09d3 100644 --- a/packages/wxa-cli/src/tree-shake/graph.js +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -1,11 +1,17 @@ const traverse = require('@babel/traverse').default; const t = require('@babel/types'); -const {readFile, resolveDepSrc, parseESCode, dceDeclaration} = require('./util'); +const { + readFile, + resolveDepSrc, + parseESCode, + dceDeclaration, +} = require('./util'); +let config = require('./config'); let {TransformCommonJs} = require('./tansform-commonJS'); class Graph { constructor(entries) { - this.entries = entries; + this.entries = config.entry; this.analysis(); } @@ -13,8 +19,7 @@ class Graph { let s = resolveDepSrc({ fileSrc, depSrc, - root: 'src', - alias: {'@': 'src'}, + ...config.resolveSrc, }); if (!s.endsWith('.js')) { @@ -41,6 +46,9 @@ class Graph { let store = (name, path, node) => { let impSrc = this.getAbsolutePath(src, node.source.value); imports[impSrc] = imports[impSrc] || {}; + if (name === '' || path === '') { + return; + } imports[impSrc][name] = path; }; @@ -49,26 +57,32 @@ class Graph { enter: (path) => { let {node} = path; let specifierPaths = path.get('specifiers'); - specifierPaths.forEach((specifierPath) => { - let specifierNode = specifierPath.node; - let name = - specifierNode.imported && - specifierNode.imported.name; - - if (!name) { - if ( - specifierNode.type === 'ImportDefaultSpecifier' - ) { - name = 'default'; - } else if ( - specifierNode.type === - 'ImportNamespaceSpecifier' - ) { - name = '*'; + if (specifierPaths && specifierPaths.length) { + specifierPaths.forEach((specifierPath) => { + let specifierNode = specifierPath.node; + let name = + specifierNode.imported && + specifierNode.imported.name; + + if (!name) { + if ( + specifierNode.type === + 'ImportDefaultSpecifier' + ) { + name = 'default'; + } else if ( + specifierNode.type === + 'ImportNamespaceSpecifier' + ) { + name = '*'; + } } - } - store(name, specifierPath, node); - }); + store(name, specifierPath, node); + }); + } else { + // import './a' + store('', '', node); + } }, }, }; @@ -81,9 +95,9 @@ class Graph { let store = (name, path, node) => { if (isRoot) { - path._shake = 0; + path.$extReferences = ['root']; } else { - path._shake = 1; + path.$extReferences = []; } let expSrc = this.getExpSrc(node, src); exports[expSrc] = exports[expSrc] || {}; @@ -126,7 +140,7 @@ class Graph { ); } - return {specifiers, declarationNode}; + return {specifiers, declarationPath}; }; let visitor = { @@ -137,10 +151,12 @@ class Graph { if (node.specifiers && node.specifiers.length) { storeSpecifiers(path, node); } else { - let {specifiers, declarationNode} = + let {specifiers, declarationPath} = transformExportDeclarationToSpecifiers(path); - path.insertBefore(declarationNode); + let newDeclarationPath = path.insertBefore( + declarationPath.node + )[0]; let exportNamedDeclaration = t.exportNamedDeclaration( null, specifiers @@ -148,7 +164,13 @@ class Graph { let newExportPath = path.insertAfter( exportNamedDeclaration )[0]; + // 删除声明节点会同时删除相应binding path.remove(); + // 注册binding + // 注册binding是根据path来注册 + // path.scope.registerBinding(declarationPath.node.kind || 'hoisted', newDeclarationPath); + // 注册binding,并不会自动更新相应binding的referencePaths等信息,调用crawl更新 + // path.scope.crawl(); storeSpecifiers(newExportPath, node); } @@ -162,19 +184,18 @@ class Graph { // TODO,未处理 export default a=1 这类表达式 // 类似于export default function mm(){} - // 单独声明mm,并export default {mm} + // 单独声明mm,并export default mm if (declarationNode.id && declarationNode.id.name) { - path.insertBefore(declarationNode); + let newDeclarationPath = + path.insertBefore(declarationNode)[0]; let exportDefaultNode = t.exportDefaultDeclaration( - t.objectExpression([ - t.objectProperty( - t.identifier(declarationNode.id.name), - t.identifier(declarationNode.id.name) - ), - ]) + t.identifier(declarationNode.id.name) ); exportPath = path.insertAfter(exportDefaultNode)[0]; path.remove(); + // 注册binding + // path.scope.registerBinding( declarationNode.kind || 'hoisted', newDeclarationPath); + // path.scope.crawl(); } store('default', exportPath, node); @@ -226,9 +247,8 @@ class Graph { if (analyzedFile[src]) { return analyzedFile[src]; } - - console.log('---'); - console.log(src); + + console.log('graph', src); let code = content || readFile(src); let ast = parseESCode(code); @@ -236,7 +256,9 @@ class Graph { this.dceDeclaration(ast); let topScope = null; + let transformCommonJs = new TransformCommonJs({src, code, ast}); + let {visitor: exportVisitor, exports} = this.collectExport( src, isRoot @@ -274,10 +296,8 @@ class Graph { * * exports: { * [本文件路径]: { - * // export function(){} - * // [name]: FunctionDeclaration|VariableDeclaration|ClassDeclaration * // export default function(){} | export default{} | export {a as default} | export default a - * default: ExportDefaultDeclaration | FunctionDeclaration | ClassDeclaration |ExportSpecifier, + * default: ExportDefaultDeclaration, * // export {a as aaa,b,c} * [name]: ExportSpecifier * }, @@ -292,17 +312,29 @@ class Graph { * } */ - transformCommonJs.state.childScopeRequires.forEach( + transformCommonJs.state.cjsRequireModules.forEach( (names, requireSrc) => { let abSrc = this.getAbsolutePath(src, requireSrc); - let info = Array.from(names).map((name) => ({ - name: 'child_scope_require', - })); + imports[abSrc] = imports[abSrc] || {}; - imports[abSrc] = {...imports[abSrc], ...info}; + Array.from(names).forEach((name) => { + if (name === 'default') { + imports[abSrc].default = 'custom_import_name'; + imports[abSrc]['*'] = 'custom_import_name'; + return; + } + + imports[abSrc][name] = 'custom_import_name'; + }); } ); + transformCommonJs.state.cjsExportModules.forEach((path, name) => { + exports[src] = imports[src] || {}; + exports[src][name] = path; + path.$isCjsExport = true; + }); + let dep = { src, code, diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 54bff025..05a255b1 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,115 +1,51 @@ -const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; const {writeFile, dceDeclaration} = require('./util'); +let config = require('./config'); let {Graph} = require('./graph'); -function collectReferences(dep) { - if (dep._collcted) { - return; - } - - let {ast, scope} = dep; - - let findScope = (node) => { - let defineScope = scope.findDefiningScope(node.name); - if (defineScope) { - defineScope.nodes[node.name].forEach((declarationNode) => { - // 该声明语句被哪些identifier节点使用过 - declarationNode._usedByNodes.push(node); - }); - } - }; - - let collect = () => { - traverse(ast, { - enter: (path) => { - let {node} = path; - - if (node._scope) { - scope = node._scope; - } - - // obj.x 类型的属性访问,不算对x变量的使用 - if (node.type === 'MemberExpression') { - !node.computed && path.skipKey('property'); - } else if (node.type === 'ObjectProperty') { - // {x:1} 对象属性 - !node.computed && path.skipKey('key'); - } else if ( - [ - 'ClassMethod', - 'ClassPrivateMethod', - 'ClassProperty', - 'ClassDeclaration', - ].includes(node.type) - ) { - !node.computed && path.skipKey('key'); - } else if (node.type === 'Identifier') { - // TODO,怎么才算变量已经使用 - !node._skip && findScope(node); - } - }, - // 退出节点 - exit(path) { - let {node} = path; - if (node._scope) { - scope = scope.parent; - } - }, - }); - }; - - collect(); - dep._collcted = true; - - dep.children.forEach((child) => collectReferences(child)); -} - -// 判断两个path是否互相包含 -function checkTwoPathContainMutually(pathA, pathB) { - let is = false; - - let doCheck = (_pathA, _pathB) => { - traverse( - _pathA.node, - { - enter(path) { - if (path === _pathB) { - is = true; - path.stop(); - } - }, - }, - _pathA.scope - ); - }; - - doCheck(pathA, pathB); - - if (!is) { - doCheck(pathB, pathA); - } - - return is; -} - -const REQUIRE_TO_IMPORT_DEFAULT = 'require_to_import_default'; /** * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 * 在这里,遍历全局文件树,根据import和export关系,对没使用的export进行标记 * 但如果用require去引入一个export函数变量,这里并不能分析到这个export函数变量被使用过(所以不能去 require 一个 export) */ +let chain = {}; + function shake(dep) { if (dep._shook) { return; } - let {imports, exports, isRoot} = dep; + let {imports, exports, isRoot, src: depSrc} = dep; + + console.log('---'); + console.log('shake src', depSrc); + + let fileExportChain = []; + chain[depSrc] = fileExportChain; + let nameInExport = new Map(); + + // let markExport = (fileExportChain) => { + // Object.values(fileExportChain).forEach(([name, chainInfo]) => {}); + // }; + + let collectExportChain = (dep, childSrc, currentChain) => { + if (currentChain.length) { + let nextChain = []; + + let setCurrentChain = (chainNode, childName, path) => { + let childChainNode = { + name: childName, + path, + children: [], + parent: chainNode, + }; + chainNode.children.push(childChainNode); + nextChain.push(childChainNode); + path.$chain + }; - let mark = (dep, usedNames, childSrc) => { - if (usedNames.length) { let child = dep.children.find((child) => child.src === childSrc); let exportsArray = Object.entries(child.exports); let localIndex = exportsArray.findIndex( @@ -123,121 +59,173 @@ function shake(dep) { } let usedExports = {}; - let addUsedExport = (src, path) => { - usedExports[src] = usedExports[src] || {}; + + let getExportLocalName = (path) => { let local = path.node.local; if (local) { - usedExports[src][local.name] = path; + return local.name; + } + + return '*'; + }; + + let addUsedExport = (src, name, path) => { + usedExports[src] = usedExports[src] || {}; + + if (name) { + usedExports[src][name] = path; + } + }; + + let collect = (chainNode, path, src, defaultLocalName) => { + let localName = ''; + let name = chainNode.name; + + if (defaultLocalName) { + localName = defaultLocalName; + } else { + localName = getExportLocalName(path); + } + + let names = nameInExport.get(path); + + if (names && names.has(localName)) { + return; + } + + if (names) { + names.add(localName); } else { - usedExports[src]['*'] = path; + names = new Set(); + names.add(localName); } + + setCurrentChain(chainNode, localName, path); + addUsedExport(src, localName, path); }; - let hasAll = usedNames.some( - (name) => name === '*' || name === REQUIRE_TO_IMPORT_DEFAULT + let importAllChainNode = currentChain.find( + (node) => node.name === '*' ); - if (hasAll) { - let hasDefalut = usedNames.some( - (name) => - name === 'default' || name === REQUIRE_TO_IMPORT_DEFAULT + if (importAllChainNode) { + let importDefaultChainNode = currentChain.find( + (node) => node.name === 'default' ); + let markedDefalut = false; if (localExports) { Object.entries(localExports[1]).forEach(([name, path]) => { if (name === 'default') { - if (hasDefalut) { - path._shake = 0; + if (importDefaultChainNode) { markedDefalut = true; + setCurrentChain( + importDefaultChainNode, + 'dafault', + path + ); } } else { - path._shake = 0; + let localName = getExportLocalName(path); + setCurrentChain( + importAllChainNode, + localName, + path + ); } }); } - externalExports.forEach(([src, value]) => { - Object.entries(value).forEach(([name, path]) => { + externalExports.forEach(([src, exportInfo]) => { + Object.entries(exportInfo).forEach(([name, path]) => { if ( - (name === 'default' && - hasDefalut && - !markedDefalut) || - name !== 'default' + name === 'default' && + importDefaultChainNode && + !markedDefalut ) { - if (path._shake === 1) { - path._shake = 0; - addUsedExport(src, path); - } + collect(importDefaultChainNode, path, src); + } else if (name !== 'default') { + collect(importAllChainNode, path, src); } }); }); } else { - usedNames.forEach((name) => { + currentChain.forEach((chainNode) => { + let name = chainNode.name; if (localExports) { let path = localExports[1][name]; + if (path) { - path._shake = 0; + if (name === 'default') { + setCurrentChain(chainNode, 'dafault', path); + } else { + let localName = getExportLocalName(path); + setCurrentChain(chainNode, localName, path); + } return; } } - externalExports.forEach(([src, value]) => { - let path = value[name] || value['*']; + externalExports.forEach(([src, exportInfo]) => { + let path = exportInfo[name]; + if (path) { - if (path._shake === 1) { - path._shake = 0; - addUsedExport(src, path); - } + collect(chainNode, path, src); + } + + path = exportInfo['*']; + + if (path) { + collect(chainNode, path, src, name); } }); }); } Object.entries(usedExports).forEach((src, value) => { - mark(child, Object.keys(value), src); + let childUsedNames = Object.keys(value); + let childChain = childUsedNames.map((n) => { + return nextChain.find((chainNode) =>chainNode.name === n); + }); + + collectExportChain(child, src, childChain); }); } }; + // if (depSrc.endsWith('ZY\\models\\index.js')) { + // console.log('ssssss'); + // } + Object.entries(imports).forEach(([src, value]) => { let usedNames = []; Object.entries(value).forEach(([name, path]) => { - // require 转成的 import default 节点 - // 这些节点默认被本文件使用 - if (path.node.$t_cjs_temp_default_import) { - usedNames.push(REQUIRE_TO_IMPORT_DEFAULT); - return; - } - - if (path.node === 'child_scope_require') { - if (name === 'default') { - usedNames.push(REQUIRE_TO_IMPORT_DEFAULT); - } else { - usedNames.push(name); - } - - return; - } - usedNames.push(name); + fileExportChain.push({ + parent: null, + name, + path, + children: [], + }); }); - mark(dep, usedNames, src); + + collectExportChain(dep, src, fileExportChain); }); // 根节点的export语句默认全部保留 // 所以还需要处理根节点的export语句(export {} from '') - if (isRoot) { - Object.entries(exports).forEach(([src, value]) => { - if (src !== dep.src) { - let usedNames = []; - Object.entries(value).forEach(([name]) => { - usedNames.push(name); - }); - mark(dep, usedNames, src); - } - }); - } + // if (isRoot) { + // Object.entries(exports).forEach(([src, exportInfo]) => { + // if (src !== dep.src) { + // let usedNames = []; + // Object.entries(exportInfo).forEach(([name]) => { + // usedNames.push(name); + // }); + // collectExportChain(dep, usedNames, src); + // } + // }); + // } dep._shook = true; @@ -253,6 +241,12 @@ function remove(dep) { let transformCommonJs = dep.transformCommonJs; + console.log('remove', src); + + // if (src.endsWith('ZY\\models\\applyCenter.model.js')) { + // console.log('ss'); + // } + /** * 遍历exports,shake 标志表示该节点是否被外部有效的 import(即import的方法变量被使用过) * 如果shake=1,表示没有被有效import过 @@ -265,28 +259,16 @@ function remove(dep) { Object.entries(exports).forEach(([src, value]) => { Object.entries(value).forEach(([name, path]) => { - if (path.node.$t_cjs_temp_export) { - if ( - !transformCommonJs.state.isDynamicUsedExportsProperty && - path._shake === 1 && - !transformCommonJs.state.usedExports.has(name) - ) { - transformCommonJs.deleteCJSExport(path); - } - - return; - } - if (path._shake === 1) { + if (path.$isCjsExport) { + transformCommonJs.deleteCJSExport(name); + } path.remove(); } }); }); - transformCommonJs.deleteTransformedModuleDeclaration(); - - - dceDeclaration(topScope, true); + dceDeclaration(topScope); dep._removed = true; @@ -331,14 +313,47 @@ function output(dep) { return contents; } -function start(entries) { - let graph = new Graph(entries); +function setConfig(options) { + if ( + !options.entry || + !Array.isArray(options.entry) || + !options.entry.length + ) { + throw new Error('Options entry is required'); + } + + config.entry = options.entry; + + if (options.resolveSrc) { + Object.assign(config.resolveSrc, options.resolveSrc); + } + + if (options.commonJS) { + Object.assign(config.commonJS, options.commonJS); + config.commonJS.ingoreKeys.push('__esModule'); + } + + if (options.parseOptions) { + if (options.parseOptions.plugins) { + config.parseOptions.plugins = [ + ...config.parseOptions.plugins, + ...options.parseOptions.plugins, + ]; - // graph.roots.forEach((root) => { - // collectReferences(root); - // }); + delete options.parseOptions.plugins; + } + + config.parseOptions = { + ...config.parseOptions, + ...options.parseOptions, + }; + } +} - // console.log('collected'); +function treeShake(options = {}) { + setConfig(options); + + let graph = new Graph(); graph.roots.forEach((root) => { shake(root); @@ -356,13 +371,13 @@ function start(entries) { } module.exports = { - start, + treeShake, }; console.time('end'); let path = require('path'); let entrySrc = path.resolve(__dirname, '../../example/index.js'); -start([{src: entrySrc}]); +treeShake([{src: entrySrc}]); console.timeEnd('end'); // function name(params) { @@ -370,28 +385,15 @@ console.timeEnd('end'); // } // name(); - -// let code = `function scopeOnce() { -// var ref = "This is a binding"; -// var xx = 'binding2' - -// if(xx){ -// let oo="binding3" -// } - -// ref + '1'; // This is a reference to a binding - -// function scopeTwo() { -// ref+'2'; // This is a reference to a binding from a lower scope -// } -// }`; +// const generate = require('@babel/generator').default; +// const traverse = require('@babel/traverse').default; +// const {parse} = require('@babel/parser'); +// let code = `exports.x=1;let t =exports`; // let ast = parse(code, {sourceType: 'unambiguous'}); // traverse(ast, { // enter(path) { -// let {node} =path; -// if (node.type === 'VariableDeclarator') { -// console.log(path.scope); -// } +// console.log(path.scope) + // }, // }); diff --git a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js index f3708ac5..b530ca53 100644 --- a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js +++ b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js @@ -1,9 +1,16 @@ +let path = require('path'); + const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; -let {check} = require('reserved-words'); -const {readFile, writeFile, parseESCode} = require('./util'); +const { + readFile, + writeFile, + parseESCode, + isChildNode, + unique, +} = require('./util'); let t = require('@babel/types'); -let path = require('path'); +const config = require('./config'); let options = {}; @@ -20,7 +27,8 @@ function getStaticValue(node) { return false; } -function getStaticMemberProValue(node) { +// node: MemberExpression +function getStaticMemberPro(node) { if (node.computed) { return getStaticValue(node.property); } @@ -30,16 +38,22 @@ function getStaticMemberProValue(node) { class TransformCommonJs { state = { - globalESMImports: new Map(), - globalESMExports: new Map(), + // { + // moduleName: exports Path + // } + cjsExportModules: new Map(), + // { + // src: [moduleName] + // } + cjsRequireModules: new Map(), renamed: new Map(), identifiers: new Set(), isCJS: false, isESM: false, - childScopeRequires: new Map(), deletedNodes: new Map(), usedExports: new Set(), isDynamicUsedExportsProperty: false, + isUsedExportsObject: false, }; constructor({src, code, ast}) { @@ -47,23 +61,24 @@ class TransformCommonJs { this.code = code; this.ast = ast || parseESCode(code); - let dynamicRequireTargets = options.dynamicRequireTargets || []; + let dynamicRequireTargets = config.commonJS.dynamicRequireTargets || []; // 如果一个模块被其他模块动态导入 // 不对这个模块做任何处理 - if (dynamicRequireTargets.includes(src)) { + if (dynamicRequireTargets.includes(src) || !config.commonJS.enable) { return {src, code}; } + this.ingorekeys = config.commonJS.ingoreKeys; + this.transform(this.ast, options); - console.log('childScopeRequires', this.state.childScopeRequires); + console.log('cjsRequireModules', this.state.cjsRequireModules); console.log('usedExports', this.state.usedExports); console.log( 'isDynamicUsedExportsProperty', this.state.isDynamicUsedExportsProperty ); - - // this.deleteTransformedModuleDeclaration(); + console.log('isUsedExportsObject', this.state.isUsedExportsObject); } reset() { @@ -76,35 +91,21 @@ class TransformCommonJs { }); } - deleteTransformedModuleDeclaration() { - this.state.globalESMImports.forEach((paths, importPath) => { - importPath.remove(); - }); - - this.state.globalESMExports.forEach((paths, exportPath) => { - exportPath.remove(); - }); - } - - traverseTransformedModuleDeclaration(cb) { - this.state.globalESMImports.forEach((paths, importPath) => { - cb(importPath.node); - }); - - this.state.globalESMExports.forEach((paths, exportPath) => { - cb(exportPath.node); - }); - } + deleteCJSExport(exportName) { + if ( + this.state.isDynamicUsedExportsProperty || + this.state.usedExports.has(name) || + this.state.isUsedExportsObject + ) { + return; + } - deleteCJSExport(esmExportPath) { - Array.from(this.state.globalESMExports).some( - ([exportPath, cjsPaths]) => { - if (this.isChildNode(exportPath.node, esmExportPath.node)) { - cjsPaths.forEach((p) => p.remove()); - return true; - } + Array.from(this.state.cjsExportModules).some(([name, cjsPath]) => { + if (exportName === name) { + cjsPath.remove(); + return true; } - ); + }); } markNodeDeep(node, flag) { @@ -118,219 +119,116 @@ class TransformCommonJs { }); } - isChildNode(parent, child) { - if (parent === child) { - return true; - } - - let is = false; - - traverse(parent, { - noScope: true, - enter(path) { - let {node} = path; - if (node === child) { - is = true; - path.stop(); - } - }, - }); - - return is; - } - transform(ast, options = {}) { + let that = this; traverse(ast, { - Program: { - exit: (path) => { - // let allDeletePaths = []; - - // this.state.globalESMImports.forEach((paths) => { - // allDeletePaths = allDeletePaths.concat(paths); - // }); - - // this.state.globalESMExports.forEach((paths) => { - // allDeletePaths = allDeletePaths.concat(paths); - // }); - - // allDeletePaths.forEach((path) => { - // let allNextSiblingPaths = path.getAllNextSiblings(); - - // if (!allNextSiblingPaths.length) { - // this.state.deletedNodes.set( - // path.node, - // path.parentPath - // ); - // path.remove(); - // return; - // } - - // for (let i = 0; i < allNextSiblingPaths.length; i++) { - // let nextPath = allNextSiblingPaths[i]; - // let last = i === allNextSiblingPaths.length - 1; - // let find = - // !allDeletePaths.includes(nextPath) || last; - - // if (last) { - // nextPath = path.parentPath; - // } - - // if (find) { - // this.state.deletedNodes.set( - // path.node, - // nextPath - // ); - // path.remove(); - // break; - // } - // } - // }); - - let globalESMImports = new Map(); - this.state.globalESMImports.forEach((paths, node) => { - let importPath = path.unshiftContainer('body', node)[0]; - this.markNodeDeep(node, '$t_cjs_temp_import'); - globalESMImports.set(importPath, paths); - }); - this.state.globalESMImports = globalESMImports; - - let globalESMExports = new Map(); - this.state.globalESMExports.forEach((paths, node) => { - let exportPath = path.pushContainer('body', node)[0]; - this.markNodeDeep(node, '$t_cjs_temp_export'); - globalESMExports.set(exportPath, paths); - }); - this.state.globalESMExports = globalESMExports; - }, - }, CallExpression: { enter: (path) => { const {node} = path; - // Look for `require()` any renaming is assumed to be intentionally - // done to break state kind of check, so we won't look for aliases. + if ( t.isIdentifier(node.callee) && node.callee.name === 'require' ) { - // Require must be global for us to consider this a CommonJS - // module. this.state.isCJS = true; - // Normalize the string value, default to the standard string - // literal format of `{ value: "" }`. let source = getStaticValue(node.arguments[0]); if (source === false) { console.warn( - `Dynamic requires are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` + `Dynamic cjsRequireModules are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` ); return; } - const specifiers = []; let {parentPath} = path; let {node: parentNode} = parentPath; - let childScopeRequireNames = null; - - if (!t.isProgram(path.scope.path)) { - childScopeRequireNames = - this.state.childScopeRequires.get(source); - if (!childScopeRequireNames) { - childScopeRequireNames = new Set(); - this.state.childScopeRequires.set( - source, - childScopeRequireNames - ); - } + let requireNames = + this.state.cjsRequireModules.get(source); + if (!requireNames) { + requireNames = new Set(); + this.state.cjsRequireModules.set( + source, + requireNames + ); } - // Convert to named import. // let {a} = require('a') - if (t.isObjectPattern(parentNode.id)) { - if (childScopeRequireNames) { - parentNode.id.properties.forEach((prop) => { - childScopeRequireNames.add(prop.key); - }); - return; - } - - parentNode.id.properties.forEach((prop) => { - specifiers.push( - t.importSpecifier( - t.identifier(prop.value), - t.identifier(prop.key) - ) - ); - }); + let objectPatternPath = path.findParent((parent) => { + return t.isObjectPattern(parent.node.id); + }); + + if (objectPatternPath) { + objectPatternPath.node.properties.forEach( + (prop) => { + requireNames.add(prop.key); + } + ); } else if (t.isMemberExpression(parentNode)) { + // require('a').a + let name = getStaticMemberPro(parentNode); + // let a = require('a')[a],属于动态导入 - if (parentNode.computed) { + if (name === false) { console.warn( - `Dynamic requires are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` + `Dynamic cjsRequireModules are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` ); return; } - if (childScopeRequireNames) { - childScopeRequireNames.add( - parentNode.property.key - ); - return; - } - - specifiers.push( - t.importSpecifier( - t.identifier(parentNode.property.name), - t.identifier(parentNode.property.name) - ) - ); + requireNames.add(name); } else if (source) { - // Convert to default import. - if (childScopeRequireNames) { - childScopeRequireNames.add('default'); - return; - } - + // require('./a') + // 声明语句才有:let a = require('./a') let declaratorParentPath = path.find((path) => { return t.isVariableDeclarator(path); }); - let name = - (declaratorParentPath.node.id && + (declaratorParentPath && + declaratorParentPath.node.id && declaratorParentPath.node.id.name) || ''; - let id = name - ? t.identifier(name) - : path.scope.generateUidIdentifier(); - - // 由 require 转换的 import default 节点 - // 标记 - // 当 tree shake 时,对于这类节点: - // 1. 这类节点默认在本文件使用 - // 2. 当找到依赖文件时,依赖文件的 $t_cjs_temp_export(exports 转换的 export 节点)节点默认全部被有效 import - let defaultImportNode = - t.importDefaultSpecifier(id); - - this.markNodeDeep( - defaultImportNode, - '$t_cjs_temp_default_import' - ); - specifiers.push(defaultImportNode); - } + let usedNames = []; - const importDeclaration = t.importDeclaration( - specifiers, - t.stringLiteral(source) - ); + if (name) { + let binding = path.scope.getBinding(name); + + binding.referencePaths.every((rPath) => { + let {parent} = rPath; + + if (!t.isMemberExpression(parent)) { + usedNames = []; + return; + } else { + let proKey = getStaticMemberPro(parent); + + if (proKey === false) { + usedNames = []; + return; + } - this.state.globalESMImports.set(importDeclaration, [ - path.find((path) => { - return t.isProgram(path.parentPath); - }), - ]); + usedNames.push(proKey); + return true; + } + }); + + usedNames = unique(usedNames); + usedNames = usedNames.filter( + (n) => n !== 'default' + ); + } + + if (usedNames.length) { + usedNames.forEach((n) => { + requireNames.add(n); + }); + } else { + requireNames.add('default'); + } + } } }, }, @@ -343,62 +241,34 @@ class TransformCommonJs { AssignmentExpression: { enter: (path) => { - if (path.node.$t_ignore) { - return; - } - - path.node.$t_ignore = true; - let generateExportNode = (path, name) => { let exportName = name; let rightNode = path.node.right; if (t.isIdentifier(rightNode)) { - let exportNamedDeclaration = - t.exportNamedDeclaration(null, [ - t.exportSpecifier( - t.identifier(rightNode.name), - t.identifier(exportName) - ), - ]); - this.state.globalESMExports.set( - exportNamedDeclaration, - [ - path.find((path) => { - return t.isProgram(path.parentPath); - }), - ] + this.state.cjsExportModules.set( + exportName, + path.find((path) => { + return t.isProgram(path.parentPath); + }) ); } else { let id = - path.scope.generateUidIdentifierBasedOnNode( - rightNode, - exportName - ); + path.scope.generateUidIdentifier(exportName); let declaration = t.variableDeclaration('let', [ t.variableDeclarator(id, rightNode), ]); - let declarationPath = - path.insertBefore(declaration)[0]; - path.scope.registerBinding('let', declarationPath); + + path.insertBefore(declaration); let rightPath = path.get('right'); rightPath.replaceWith(id); - let exportNamedDeclaration = - t.exportNamedDeclaration(null, [ - t.exportSpecifier( - id, - t.identifier(exportName) - ), - ]); - this.state.globalESMExports.set( - exportNamedDeclaration, - [ - path.find((path) => { - return t.isProgram(path.parentPath); - }), - ] + this.state.cjsExportModules.set( + exportName, + path.find((path) => { + return t.isProgram(path.parentPath); + }) ); } }; @@ -415,7 +285,7 @@ class TransformCommonJs { const moduleBinding = path.scope.getBinding('module'); const exportsBinding = path.scope.getBinding('exports'); - // Something like `module.exports.namedExport = true;`. + // module.exports.x = 1; 不包含子属性 module.exports.x.y = 1; if ( t.isMemberExpression(path.node.left.object) && path.node.left.object.object.name === 'module' @@ -424,27 +294,28 @@ class TransformCommonJs { return; } - this.state.isCJS = true; - if ( - getStaticMemberProValue( - path.node.left.object - ) === 'exports' + getStaticMemberPro(path.node.left.object) === + 'exports' ) { - let name = getStaticMemberProValue( - path.node.left - ); + let name = getStaticMemberPro(path.node.left); // 动态导出,不转换 if (name === false) { return; } + if (this.ingorekeys.includes(name)) { + return; + } + + this.state.isCJS = true; + generateExportNode(path, name); } } else if (path.node.left.object.name === 'exports') { - // Check for regular exports - let name = getStaticMemberProValue(path.node.left); + // exports.x = 1; 不包含子属性 exports.x.y = 1; + let name = getStaticMemberPro(path.node.left); if ( exportsBinding || // If export is named "default" leave as is. @@ -457,6 +328,10 @@ class TransformCommonJs { return; } + if (this.ingorekeys.includes(name)) { + return; + } + this.state.isCJS = true; generateExportNode(path, name); @@ -468,19 +343,17 @@ class TransformCommonJs { MemberExpression: { enter: (path) => { if ( - path.node.$t_ignore2 || - this.state.isDynamicUsedExportsProperty + this.state.isDynamicUsedExportsProperty || + this.state.isUsedExportsObject ) { return; } - path.node.$t_ignore2 = true; - const moduleBinding = path.scope.getBinding('module'); const exportsBinding = path.scope.getBinding('exports'); let addUsedExports = () => { - let exportsProVal = getStaticMemberProValue(path.node); + let exportsProVal = getStaticMemberPro(path.node); // 动态访问了 exports 上的属性 if (exportsProVal === false) { @@ -491,12 +364,21 @@ class TransformCommonJs { this.state.usedExports.add(exportsProVal); }; + // 连等情况 + // let a = exports.x = 1,返回true,不算对x的引用,可直接删除exports.x + // let a = exports.x.y = 1, 返回false,算对x的引用,不会删除exports.x let checkIsAssignmentExpressionLeft = () => { let parentPath = path.parentPath; + + if (!t.isAssignmentExpression(parentPath)) { + return false; + } + let leftPath = parentPath.get('left'); return leftPath === path; }; + // module.exports.x if ( t.isMemberExpression(path.node.object) && path.node.object.object.name === 'module' @@ -509,7 +391,7 @@ class TransformCommonJs { return; } - let staticModuleProVal = getStaticMemberProValue( + let staticModuleProVal = getStaticMemberPro( path.node.object ); @@ -527,6 +409,7 @@ class TransformCommonJs { addUsedExports(); } else if (path.node.object.name === 'exports') { + // exports.x if (exportsBinding) { return; } @@ -536,11 +419,93 @@ class TransformCommonJs { } addUsedExports(); + } else if (path.node.object.name === 'module') { + // 直接使用 module.exports 对象整体 + if (moduleBinding) { + return; + } + + let staticModuleProVal = getStaticMemberPro(path.node); + + if (staticModuleProVal !== 'exports') { + return; + } + + // module.exports.x 情况 + // 不算对 module.exports 整体的使用 + if (t.isMemberExpression(path.parentPath)) { + return; + } + + // 到这里该语句一定严格是 module.exports + // 判断是否使用 + if (!that.checkUsed(path)) { + return; + } + + this.state.isUsedExportsObject = true; + } + }, + }, + + Identifier: { + enter: (path) => { + if ( + this.state.isDynamicUsedExportsProperty || + this.state.isUsedExportsObject + ) { + return; + } + + // 直接使用 exports 对象整体 + if ( + // 是exports + path.node.name === 'exports' && + // 父节点不是对象属性访问,例如:module.exports + !t.isMemberExpression(path.parentPath) && + // 作用域无 binding exports + !path.scope.getBinding('exports') && + that.checkUsed(path) + ) { + this.state.isUsedExportsObject = true; } }, }, }); } + + // 检查是否赋值给其他变量 + checkUsed(path) { + let parentPath = path.parentPath; + + // 处于等式左边,且右边不为 Identifier + // 即语句类似于:exports = {} + + // 且该语句没有赋值给其他语句,例如: + // let a = exports = {} + // a = exports = {} + // {a: exports = {}} + // [exports = {}] 等等 + + // 这里没有去一一判断,而是作了简单处理 + // 判断 exports = {} 的父节点为作用域语句,例如: + // function(){exports = {}} + // if(a){exports = {}} + // 但这会造成漏判,例如: + // if(exports = {}){} + // 并没有将 exports 赋值给其他变量,但这里拦截不了 + if ( + t.isAssignmentExpression(parentPath) && + parentPath.get('left') === path && + !t.isIdentifier(parentPath.get('right')) && + // 父节点是赋值语句,且父节点直接在作用域语句中 + t.isScopable(parentPath.parentPath) + ) { + return false; + } + + return true; + } } module.exports = { diff --git a/packages/wxa-cli/src/tree-shake/test.js b/packages/wxa-cli/src/tree-shake/test.js new file mode 100644 index 00000000..e1a47575 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/test.js @@ -0,0 +1,25 @@ +const generate = require('@babel/generator').default; +const traverse = require('@babel/traverse').default; +const {parse} = require('@babel/parser'); +let code = ``; + +code = ` +let a = require('/a'); + +a.x; +a.y; +a.default.u + +let n ='n'; +a[n]; + +let b = a;`; + +let ast = parse(code, {sourceType: 'unambiguous'}); +traverse(ast, { + enter(path) { + let scope = path.scope; + console.log(path.scope); + }, +}); + diff --git a/packages/wxa-cli/src/tree-shake/util.js b/packages/wxa-cli/src/tree-shake/util.js index 52dadc2b..68b89f51 100644 --- a/packages/wxa-cli/src/tree-shake/util.js +++ b/packages/wxa-cli/src/tree-shake/util.js @@ -3,7 +3,9 @@ let path = require('path'); let mkdirp = require('mkdirp'); const {parse} = require('@babel/parser'); const t = require('@babel/types'); +const traverse = require('@babel/traverse').default; let findRoot = require('find-root'); +let config = require('./config'); function readFile(p) { let rst = ''; @@ -58,7 +60,7 @@ function getPkgConfig(npmSrc, lib) { */ let cwd = process.cwd(); -function resolveDepSrc({fileSrc, depSrc, root, alias}) { +function resolveDepSrc({fileSrc, depSrc, root, alias, npm}) { let getDepAbsoulte = (src) => { if (isDir(src)) { return path.join(src, 'index.js'); @@ -101,7 +103,7 @@ function resolveDepSrc({fileSrc, depSrc, root, alias}) { return getDepAbsoulte(path.resolve(fileDir, depSrc)); } - let npmSrc = path.join(cwd, 'node_modules'); + let npmSrc = path.join(cwd, npm); let absoluteSrc = path.join(npmSrc, depSrc); if (!absoluteSrc.endsWith('.js')) { @@ -127,70 +129,137 @@ function resolveDepSrc({fileSrc, depSrc, root, alias}) { return getDepAbsoulte(path.join(npmSrc, depSrc, main)); } -function parseESCode(code, plugins = [], options) { - plugins = [ - ['decorators', {decoratorsBeforeExport: true}], - 'classProperties', - 'jsx', - 'typescript', - 'exportNamespaceFrom', - 'exportDefaultFrom', - 'objectRestSpread', - ...plugins, - ]; - - return parse(code, { - plugins, - sourceType: 'unambiguous', - ...options, +function parseESCode(code) { + return parse(code, config.parseOptions); +} + +function isChildNode(parent, child) { + if (parent === child) { + return true; + } + + let is = false; + + traverse(parent, { + noScope: true, + enter(path) { + let {node} = path; + if (node === child) { + is = true; + path.stop(); + } + }, }); + + return is; } -function dceDeclaration(scope, trackReferences = false) { +function dceDeclaration(scope) { let hasRemoved = false; - Object.entries(scope.bindings).forEach(([name, binding]) => { - // 类似于let a = function ff(){} - // ff 是函数内部作用域的binding,ff不应该被删除 - if (t.isFunctionExpression(binding.path)) { - return; - } - if (!binding.referenced) { - scope.removeOwnBinding(name); - binding.path.remove(); - hasRemoved = true; - return; - } + // 删除节点并不会自动更新相关binding的referenced等信息 + // 这里是重新收集bindings信息 + scope.crawl(); - // 使用path.remove删除节点后 - // 并不会让 scope 中的 binding.referenced 等信息更新 - // 即使重新遍历也不会更新 - if (trackReferences) { - let canRemove = binding.referencePaths.every((reference) => { - let parentPath = reference; - while (parentPath) { - if (!parentPath.node) { - return true; + let removeObjectPattern = (binding) => { + let proPath = null; + + traverse(binding.path.node, { + noScope: true, + ObjectProperty: { + enter: (path) => { + if (path.node.value === binding.identifier) { + proPath = path; + path.stop(); } + }, + }, + }); - parentPath = parentPath.parentPath; - } + return proPath; + }; + + let remove = (name, scope, binding) => { + // console.log(name); + let removedPath = binding.path; + let bindingPath = binding.path; - return false; - }); + // let {x: x1} = {x: 1, y2: 2}; + if (t.isVariableDeclarator(bindingPath)) { + let id = bindingPath.node.id; - if (canRemove) { - scope.removeOwnBinding(name); - binding.path.remove(); - hasRemoved = true; + if (t.isObjectPattern(id)) { + removedPath = removeObjectPattern(binding) || removedPath; } } + + removedPath.remove(); + scope.removeOwnBinding(name); + hasRemoved = true; + }; + + Object.entries(scope.bindings).forEach(([name, binding]) => { + if (binding.referenced) { + return; + } + + let bindingPath = binding.path; + + // 类似于let a = function ff(){} + // ff 是函数内部作用域的binding,ff不应该被删除 + // if (t.isFunctionExpression(bindingPath)) { + // return; + // } + + // // try...catch(e),e没访问到时不该删除整个catch语句 + // if (t.isCatchClause(bindingPath)) { + // return; + // } + + // // function(a, b) {}; + // // let t = function({dataset: {name, opts={}}}, [asq, ttqw]) {}; + // // 函数的参数 + // if ( + // t.isFunctionExpression(bindingPath.parentPath) || + // t.isFunctionDeclaration(bindingPath.parentPath) + // ) { + // return; + // } + + // // let [zz, xx, cc] = [1, 2, 3]; + // // let {x: x1} = {x: 1, y2: 2}; + // if ( + // t.isVariableDeclarator(bindingPath) && + // t.isArrayPattern(bindingPath.node.id) + // ) { + // return; + // } + + // // 未知 + // if (t.isArrayPattern(bindingPath)) { + // return; + // } + + if ( + // 过滤 let [zz, xx, cc] = [1, 2, 3]; + // 变量声明语句可能有副作用,不能简单去除 + // 例如:let a = obj.x,obj.x 可能有访问器属性。其他连等情况等等 + // (t.isVariableDeclarator(bindingPath) && + // !t.isArrayPattern(bindingPath.node.id)) || + t.isClassDeclaration(bindingPath) || + t.isFunctionDeclaration(bindingPath) || + t.isImportDefaultSpecifier(bindingPath) || + t.isImportNamespaceSpecifier(bindingPath) || + t.isImportSpecifier(bindingPath) + ) { + remove(name, scope, binding); + } }); // 处理声明之间循环引用 // 当一个声明未被使用时,那该声明所引用的其他声明不算真正使用 if (hasRemoved) { - dceDeclaration(scope, true); + dceDeclaration(scope); } } @@ -205,10 +274,16 @@ function dceDeclaration(scope, trackReferences = false) { // }) // ); +function unique(ary) { + return [...new Set(ary)]; +} + module.exports = { readFile, writeFile, resolveDepSrc, parseESCode, dceDeclaration, + isChildNode, + unique, }; From e3a0f002fd4f51da0c86ca7a552bd9fa68db678d Mon Sep 17 00:00:00 2001 From: sparklinm Date: Sun, 11 Jul 2021 22:33:14 +0800 Subject: [PATCH 14/20] =?UTF-8?q?feat:=20=E9=87=8D=E5=86=99tree=20shake?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/cjs1.js | 67 ++--- packages/wxa-cli/example/shaking/cjs1.js | 12 +- packages/wxa-cli/example/shaking/user.js | 5 +- packages/wxa-cli/example/shaking/user2.js | 2 + packages/wxa-cli/example/user.js | 20 +- packages/wxa-cli/example/user2.js | 8 + packages/wxa-cli/src/tree-shake/graph.js | 53 ++-- packages/wxa-cli/src/tree-shake/index.js | 249 ++++++++++++------ .../src/tree-shake/tansform-commonJS.js | 27 +- packages/wxa-cli/src/tree-shake/util.js | 205 +++++++------- 10 files changed, 378 insertions(+), 270 deletions(-) create mode 100644 packages/wxa-cli/example/shaking/user2.js create mode 100644 packages/wxa-cli/example/user2.js diff --git a/packages/wxa-cli/example/cjs1.js b/packages/wxa-cli/example/cjs1.js index b7ff0eec..f2fbbafe 100644 --- a/packages/wxa-cli/example/cjs1.js +++ b/packages/wxa-cli/example/cjs1.js @@ -1,12 +1,10 @@ -let fn1= require('./cjs2').fn1; - +let fn1 = require('./cjs2').fn1; fn1(); - -Object.defineProperty(exports, '__esModule', { - value: true, -}); +// Object.defineProperty(exports, '__esModule', { +// value: true, +// }); exports.getFiles = getFiles; // exports.getConfig = getConfig; module.exports.readFile = readFile; @@ -26,17 +24,16 @@ exports.getClassSet = getClassSet; exports.addClass = addClass; exports.removeClass = removeClass; -module.exports ={getFiles}; - +module.exports = {getFiles}; function getFiles(dir = process.cwd(), prefix = '') { let rst = []; - exports.rst= rst; + exports.rst = rst; - let aaaa= 'aaa'; + let aaaa = 'aaa'; // exports[aaaa] = aaaa; - + // let ttt= require('sss'); // console.log(ttt); @@ -54,44 +51,28 @@ function getFiles(dir = process.cwd(), prefix = '') { // return config; // } -function readFile(p) { - -} - -function writeFile(p, data) { - -} - -function isFile(p) { - -} - -function isDir(p) { +function readFile(p) {} -} +function writeFile(p, data) {} -function getRelative(opath) { - -} +function isFile(p) {} -function getDistPath(opath, ext, src, dist) { +function isDir(p) {} -} +function getRelative(opath) {} -function copy(from, to) { - -} +function getDistPath(opath, ext, src, dist) {} -function amazingCache(params, needCache) { +function copy(from, to) {} -} +function amazingCache(params, needCache) {} function applyPlugins(plugins, compiler) { if (plugins == null) return; // console.log(plugins); if (typeof plugins !== 'object') { -throw new Error('wxa配置文件有误,plugins'); -} + throw new Error('wxa配置文件有误,plugins'); + } if (!Array.isArray(plugins)) plugins = [plugins]; plugins.forEach((plugin) => plugin.apply(compiler)); } @@ -100,11 +81,9 @@ function isEmpty(n) { return n == null || n === ''; } -function getHash(filepath) { -} +function getHash(filepath) {} -function getHashWithString(content) { -} +function getHashWithString(content) {} function promiseSerial(funs) { return funs.reduce((promise, fun) => { @@ -137,8 +116,4 @@ function removeClass(classStr, destClass) { } // # sourceMappingURL=utils.js.map -exports.a=function m() { - -}; - - +exports.a = function m() {}; diff --git a/packages/wxa-cli/example/shaking/cjs1.js b/packages/wxa-cli/example/shaking/cjs1.js index 7aac95b8..5e016891 100644 --- a/packages/wxa-cli/example/shaking/cjs1.js +++ b/packages/wxa-cli/example/shaking/cjs1.js @@ -1,13 +1,13 @@ let fn1 = require('./cjs2').fn1; -fn1(); -Object.defineProperty(exports, '__esModule', { - value: true -}); +fn1(); // Object.defineProperty(exports, '__esModule', { +// value: true, +// }); + exports.writeFile = writeFile; exports.isFile = isFile; module.exports = { - getFiles + getFiles, }; function getFiles(dir = process.cwd(), prefix = '') { @@ -30,4 +30,4 @@ function writeFile(p, data) {} function isFile(p) {} -let _m = function m() {}; \ No newline at end of file +let _a = function m() {}; diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index 58f0c873..59320064 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -1,3 +1,4 @@ +import './user2'; export {}; function getAge(params) {} @@ -8,4 +9,6 @@ let mm1 = 1, c = function mm2(params) {}; export {}; -export {}; \ No newline at end of file +export {}; +export {}; +export {} from './user2'; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/user2.js b/packages/wxa-cli/example/shaking/user2.js new file mode 100644 index 00000000..f4e5405f --- /dev/null +++ b/packages/wxa-cli/example/shaking/user2.js @@ -0,0 +1,2 @@ +export {}; +export {}; \ No newline at end of file diff --git a/packages/wxa-cli/example/user.js b/packages/wxa-cli/example/user.js index cfcf9a94..fd96d1ef 100644 --- a/packages/wxa-cli/example/user.js +++ b/packages/wxa-cli/example/user.js @@ -1,21 +1,19 @@ -export function getName() { - -} +import {fn1 as fn11} from './user2'; -export default function getAge(params) { - -} +export function getName() {} + +export default function getAge(params) {} // let a =1; // export default a; // eslint-disable-next-line one-var -export let mm1 =1, c=function mm2(params) { -}; +export let mm1 = 1, + c = function mm2(params) {}; -function fn2(params) { - -} +function fn2(params) {} export {fn2}; +export {fn11}; +export {fn2 as fn22} from './user2'; diff --git a/packages/wxa-cli/example/user2.js b/packages/wxa-cli/example/user2.js new file mode 100644 index 00000000..3d3f9131 --- /dev/null +++ b/packages/wxa-cli/example/user2.js @@ -0,0 +1,8 @@ +export function fn1() { + +} + +export function fn2() { + +} + diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js index 7a7a09d3..7a32eee1 100644 --- a/packages/wxa-cli/src/tree-shake/graph.js +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -95,9 +95,9 @@ class Graph { let store = (name, path, node) => { if (isRoot) { - path.$extReferences = ['root']; + path.$extReferences = new Set().add('root'); } else { - path.$extReferences = []; + path.$extReferences = new Set(); } let expSrc = this.getExpSrc(node, src); exports[expSrc] = exports[expSrc] || {}; @@ -312,28 +312,39 @@ class Graph { * } */ - transformCommonJs.state.cjsRequireModules.forEach( - (names, requireSrc) => { - let abSrc = this.getAbsolutePath(src, requireSrc); + if (transformCommonJs) { + transformCommonJs.state.cjsRequireModules.forEach( + (names, requireSrc) => { + let abSrc = this.getAbsolutePath(src, requireSrc); + + imports[abSrc] = imports[abSrc] || {}; + Array.from(names).forEach((name) => { + if (name === 'default') { + imports[abSrc].default = 'custom_import_name'; + imports[abSrc]['*'] = 'custom_import_name'; + return; + } - imports[abSrc] = imports[abSrc] || {}; - Array.from(names).forEach((name) => { - if (name === 'default') { - imports[abSrc].default = 'custom_import_name'; - imports[abSrc]['*'] = 'custom_import_name'; - return; - } + imports[abSrc][name] = 'custom_import_name'; + }); + } + ); - imports[abSrc][name] = 'custom_import_name'; - }); - } - ); + transformCommonJs.state.cjsExportModules.forEach( + (path, name) => { + exports[src] = exports[src] || {}; + exports[src][name] = path; + path.$isCjsExport = true; + if (isRoot) { + path.$extReferences = new Set().add('root'); + } else { + path.$extReferences = new Set(); + } - transformCommonJs.state.cjsExportModules.forEach((path, name) => { - exports[src] = imports[src] || {}; - exports[src][name] = path; - path.$isCjsExport = true; - }); + // console.log('s:', name, path.toString()); + } + ); + } let dep = { src, diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 05a255b1..d6d7dd49 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -10,7 +10,7 @@ let {Graph} = require('./graph'); * 但如果用require去引入一个export函数变量,这里并不能分析到这个export函数变量被使用过(所以不能去 require 一个 export) */ -let chain = {}; +let chains = {}; function shake(dep) { if (dep._shook) { @@ -23,29 +23,10 @@ function shake(dep) { console.log('shake src', depSrc); let fileExportChain = []; - chain[depSrc] = fileExportChain; - let nameInExport = new Map(); - - // let markExport = (fileExportChain) => { - // Object.values(fileExportChain).forEach(([name, chainInfo]) => {}); - // }; + chains[depSrc] = fileExportChain; let collectExportChain = (dep, childSrc, currentChain) => { if (currentChain.length) { - let nextChain = []; - - let setCurrentChain = (chainNode, childName, path) => { - let childChainNode = { - name: childName, - path, - children: [], - parent: chainNode, - }; - chainNode.children.push(childChainNode); - nextChain.push(childChainNode); - path.$chain - }; - let child = dep.children.find((child) => child.src === childSrc); let exportsArray = Object.entries(child.exports); let localIndex = exportsArray.findIndex( @@ -59,8 +40,28 @@ function shake(dep) { } let usedExports = {}; + let nextChain = []; + + let setCurrentChain = (chainNode, childName, path) => { + let childChainNode = { + name: childName, + path, + children: [], + parent: chainNode, + dep: child, + }; + chainNode.children.push(childChainNode); + nextChain.push(childChainNode); + path.$chain = { + [childName]: childChainNode, + }; + }; + + let getExportLocalName = (path, defaultName) => { + if (path.$isCjsExport) { + return defaultName; + } - let getExportLocalName = (path) => { let local = path.node.local; if (local) { return local.name; @@ -79,7 +80,6 @@ function shake(dep) { let collect = (chainNode, path, src, defaultLocalName) => { let localName = ''; - let name = chainNode.name; if (defaultLocalName) { localName = defaultLocalName; @@ -87,19 +87,11 @@ function shake(dep) { localName = getExportLocalName(path); } - let names = nameInExport.get(path); - - if (names && names.has(localName)) { + if (path.$chain && path.$chain[localName]) { + chainNode.children.push(path.$chain[localName]); return; } - if (names) { - names.add(localName); - } else { - names = new Set(); - names.add(localName); - } - setCurrentChain(chainNode, localName, path); addUsedExport(src, localName, path); }; @@ -126,7 +118,7 @@ function shake(dep) { ); } } else { - let localName = getExportLocalName(path); + let localName = getExportLocalName(path, name); setCurrentChain( importAllChainNode, localName, @@ -159,7 +151,7 @@ function shake(dep) { if (name === 'default') { setCurrentChain(chainNode, 'dafault', path); } else { - let localName = getExportLocalName(path); + let localName = getExportLocalName(path, name); setCurrentChain(chainNode, localName, path); } return; @@ -185,7 +177,7 @@ function shake(dep) { Object.entries(usedExports).forEach((src, value) => { let childUsedNames = Object.keys(value); let childChain = childUsedNames.map((n) => { - return nextChain.find((chainNode) =>chainNode.name === n); + return nextChain.find((chainNode) => chainNode.name === n); }); collectExportChain(child, src, childChain); @@ -198,81 +190,170 @@ function shake(dep) { // } Object.entries(imports).forEach(([src, value]) => { - let usedNames = []; + let currentChain = []; Object.entries(value).forEach(([name, path]) => { - usedNames.push(name); - fileExportChain.push({ + let chainNode = { parent: null, name, path, children: [], - }); + dep, + }; + fileExportChain.push(chainNode); + currentChain.push(chainNode); }); - collectExportChain(dep, src, fileExportChain); + collectExportChain(dep, src, currentChain); }); // 根节点的export语句默认全部保留 // 所以还需要处理根节点的export语句(export {} from '') - // if (isRoot) { - // Object.entries(exports).forEach(([src, exportInfo]) => { - // if (src !== dep.src) { - // let usedNames = []; - // Object.entries(exportInfo).forEach(([name]) => { - // usedNames.push(name); - // }); - // collectExportChain(dep, usedNames, src); - // } - // }); - // } + if (isRoot) { + Object.entries(exports).forEach(([src, exportInfo]) => { + if (src !== dep.src) { + let currentChain = []; + + Object.entries(exportInfo).forEach(([name, path]) => { + let chainNode = { + parent: null, + name, + path, + children: [], + dep, + }; + fileExportChain.push(chainNode); + currentChain.push(chainNode); + }); - dep._shook = true; + collectExportChain(dep, src, currentChain); + } + }); + } + + let markExport = () => { + let visitedChainNodes = []; + + let findLastChainNode = (chainNode) => { + // 循环依赖 + if (visitedChainNodes.includes(chainNode)) { + return; + } + + visitedChainNodes.push(chainNode); + + if (!chainNode.children.length) { + let exportPath = chainNode.path; + + if (exportPath.node && !exportPath.node.source) { + visitedChainNodes.forEach((visitedNode, index) => { + // 第一个节点是import节点或者root的export节点 + // 跳过 + if (index === 0) { + return; + } + + let {path} = visitedNode; + + path.$extReferences.add(visitedChainNodes[0].path); + }); + } + } else { + chainNode.children.forEach((child) => { + findLastChainNode(child); + }); + } + + visitedChainNodes.pop(); + }; + + fileExportChain.forEach((chainNode) => { + findLastChainNode(chainNode); + }); + }; + + markExport(); + dep._shook = true; dep.children.forEach((child) => shake(child)); } -function remove(dep) { - if (dep._removed) { +let noReferencedExports = []; + +function collectNotReferencedExports(dep) { + if (dep._colletced) { return; } - let {topScope, exports, src} = dep; - - let transformCommonJs = dep.transformCommonJs; - - console.log('remove', src); + let {exports, src} = dep; + console.log('colletced', src); // if (src.endsWith('ZY\\models\\applyCenter.model.js')) { // console.log('ss'); // } - /** - * 遍历exports,shake 标志表示该节点是否被外部有效的 import(即import的方法变量被使用过) - * 如果shake=1,表示没有被有效import过 - * _usedByNodes只存在于声明语句上,表示该声明语句被哪些identifier节点使用过。 - * 在导出语句中: - * 只有类似有name的函数变量(export function a(){} export default function a(){}),这样的导出节点才会有_usedByNodes - * shake=1且_usedByNodes不存在,表示该export节点即不被外部有效import,也不会被内部使用 - * shake=1且_usedByNodes存在且有值,表示该节点不被外部有效import,但被内部使用 - */ - Object.entries(exports).forEach(([src, value]) => { Object.entries(value).forEach(([name, path]) => { - if (path._shake === 1) { - if (path.$isCjsExport) { - transformCommonJs.deleteCJSExport(name); - } - path.remove(); + if (!path.$extReferences.size) { + noReferencedExports.push({path, dep, name}); } }); }); - dceDeclaration(topScope); + dep._colletced = true; - dep._removed = true; + dep.children.forEach((child) => collectNotReferencedExports(child)); +} - dep.children.forEach((child) => remove(child)); +function remove() { + let visitedChainNodes = []; + let removeExtReference = (chainNode, importPath) => { + // 循环依赖 + if (visitedChainNodes.includes(chainNode)) { + return; + } + + visitedChainNodes.push(chainNode); + chainNode.children.forEach((childNode) => { + childNode.path.$extReferences.delete(importPath); + + if (childNode.path.$extReferences.size === 0) { + noReferencedExports.push({ + path: childNode.path, + dep: childNode.dep, + name: childNode.name, + }); + } + + removeExtReference(childNode, importPath); + }); + visitedChainNodes.pop(); + }; + + for (let i = 0; i < noReferencedExports.length; i++) { + const {path: exportPath, dep, name} = noReferencedExports[i]; + let {transformCommonJs, topScope, src} = dep; + + if (exportPath.$isCjsExport) { + transformCommonJs.deleteCJSExport(name); + } else { + exportPath.remove(); + } + + let importPaths = dceDeclaration(topScope); + + if (importPaths.length) { + let chain = chains[src]; + + importPaths.forEach((importPath) => { + let chainNode = chain.find( + (chainNode) => chainNode.path === importPath + ); + + removeExtReference(chainNode, importPath); + }); + } + } } function output(dep) { @@ -361,9 +442,14 @@ function treeShake(options = {}) { console.log('shook'); + graph.roots.forEach((root) => { + collectNotReferencedExports(root); + }); + + remove(); + let contents = {}; graph.roots.forEach((root) => { - remove(root); contents = {...contents, ...output(root)}; }); @@ -377,7 +463,10 @@ module.exports = { console.time('end'); let path = require('path'); let entrySrc = path.resolve(__dirname, '../../example/index.js'); -treeShake([{src: entrySrc}]); +treeShake({ + entry: [{src: entrySrc}], + commonJS: {enable: true}, +}); console.timeEnd('end'); // function name(params) { diff --git a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js index b530ca53..3ff503c9 100644 --- a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js +++ b/packages/wxa-cli/src/tree-shake/tansform-commonJS.js @@ -65,20 +65,25 @@ class TransformCommonJs { // 如果一个模块被其他模块动态导入 // 不对这个模块做任何处理 if (dynamicRequireTargets.includes(src) || !config.commonJS.enable) { - return {src, code}; + return; } this.ingorekeys = config.commonJS.ingoreKeys; this.transform(this.ast, options); - console.log('cjsRequireModules', this.state.cjsRequireModules); - console.log('usedExports', this.state.usedExports); - console.log( - 'isDynamicUsedExportsProperty', - this.state.isDynamicUsedExportsProperty - ); - console.log('isUsedExportsObject', this.state.isUsedExportsObject); + if (this.state.isCJS) { + console.log('---------'); + console.log('cjsRequireModules', this.state.cjsRequireModules); + console.log('usedExports', this.state.usedExports); + console.log( + 'isDynamicUsedExportsProperty', + this.state.isDynamicUsedExportsProperty + ); + console.log('isUsedExportsObject', this.state.isUsedExportsObject); + // console.log('cjsExportModules', this.state.cjsExportModules); + console.log('---------'); + } } reset() { @@ -94,12 +99,14 @@ class TransformCommonJs { deleteCJSExport(exportName) { if ( this.state.isDynamicUsedExportsProperty || - this.state.usedExports.has(name) || + this.state.usedExports.has(exportName) || this.state.isUsedExportsObject ) { return; } + console.log(exportName); + Array.from(this.state.cjsExportModules).some(([name, cjsPath]) => { if (exportName === name) { cjsPath.remove(); @@ -499,7 +506,7 @@ class TransformCommonJs { parentPath.get('left') === path && !t.isIdentifier(parentPath.get('right')) && // 父节点是赋值语句,且父节点直接在作用域语句中 - t.isScopable(parentPath.parentPath) + t.isScopable(parentPath.parentPath.parentPath) ) { return false; } diff --git a/packages/wxa-cli/src/tree-shake/util.js b/packages/wxa-cli/src/tree-shake/util.js index 68b89f51..ad64f99a 100644 --- a/packages/wxa-cli/src/tree-shake/util.js +++ b/packages/wxa-cli/src/tree-shake/util.js @@ -155,112 +155,127 @@ function isChildNode(parent, child) { } function dceDeclaration(scope) { - let hasRemoved = false; - - // 删除节点并不会自动更新相关binding的referenced等信息 - // 这里是重新收集bindings信息 - scope.crawl(); - - let removeObjectPattern = (binding) => { - let proPath = null; - - traverse(binding.path.node, { - noScope: true, - ObjectProperty: { - enter: (path) => { - if (path.node.value === binding.identifier) { - proPath = path; - path.stop(); - } + let importPaths = []; + + let doDce = (scope) => { + let hasRemoved = false; + + // 删除节点并不会自动更新相关binding的referenced等信息 + // 这里是重新收集bindings信息 + scope.crawl(); + + let removeObjectPattern = (binding) => { + let proPath = null; + + traverse(binding.path.node, { + noScope: true, + ObjectProperty: { + enter: (path) => { + if (path.node.value === binding.identifier) { + proPath = path; + path.stop(); + } + }, }, - }, - }); + }); - return proPath; - }; + return proPath; + }; - let remove = (name, scope, binding) => { - // console.log(name); - let removedPath = binding.path; - let bindingPath = binding.path; + let remove = (name, scope, binding) => { + let removedPath = binding.path; + let bindingPath = binding.path; + + if ( + t.isImportDefaultSpecifier(bindingPath) || + t.isImportNamespaceSpecifier(bindingPath) || + t.isImportSpecifier(bindingPath) + ) { + importPaths.push(bindingPath); + } - // let {x: x1} = {x: 1, y2: 2}; - if (t.isVariableDeclarator(bindingPath)) { - let id = bindingPath.node.id; + // let {x: x1} = {x: 1, y2: 2}; + if (t.isVariableDeclarator(bindingPath)) { + let id = bindingPath.node.id; - if (t.isObjectPattern(id)) { - removedPath = removeObjectPattern(binding) || removedPath; + if (t.isObjectPattern(id)) { + removedPath = removeObjectPattern(binding) || removedPath; + } } - } - removedPath.remove(); - scope.removeOwnBinding(name); - hasRemoved = true; - }; + removedPath.remove(); + scope.removeOwnBinding(name); + hasRemoved = true; + }; - Object.entries(scope.bindings).forEach(([name, binding]) => { - if (binding.referenced) { - return; - } + Object.entries(scope.bindings).forEach(([name, binding]) => { + if (binding.referenced) { + return; + } - let bindingPath = binding.path; - - // 类似于let a = function ff(){} - // ff 是函数内部作用域的binding,ff不应该被删除 - // if (t.isFunctionExpression(bindingPath)) { - // return; - // } - - // // try...catch(e),e没访问到时不该删除整个catch语句 - // if (t.isCatchClause(bindingPath)) { - // return; - // } - - // // function(a, b) {}; - // // let t = function({dataset: {name, opts={}}}, [asq, ttqw]) {}; - // // 函数的参数 - // if ( - // t.isFunctionExpression(bindingPath.parentPath) || - // t.isFunctionDeclaration(bindingPath.parentPath) - // ) { - // return; - // } - - // // let [zz, xx, cc] = [1, 2, 3]; - // // let {x: x1} = {x: 1, y2: 2}; - // if ( - // t.isVariableDeclarator(bindingPath) && - // t.isArrayPattern(bindingPath.node.id) - // ) { - // return; - // } - - // // 未知 - // if (t.isArrayPattern(bindingPath)) { - // return; - // } - - if ( - // 过滤 let [zz, xx, cc] = [1, 2, 3]; - // 变量声明语句可能有副作用,不能简单去除 - // 例如:let a = obj.x,obj.x 可能有访问器属性。其他连等情况等等 - // (t.isVariableDeclarator(bindingPath) && - // !t.isArrayPattern(bindingPath.node.id)) || - t.isClassDeclaration(bindingPath) || - t.isFunctionDeclaration(bindingPath) || - t.isImportDefaultSpecifier(bindingPath) || - t.isImportNamespaceSpecifier(bindingPath) || - t.isImportSpecifier(bindingPath) - ) { - remove(name, scope, binding); + let bindingPath = binding.path; + + // 类似于let a = function ff(){} + // ff 是函数内部作用域的binding,ff不应该被删除 + // if (t.isFunctionExpression(bindingPath)) { + // return; + // } + + // // try...catch(e),e没访问到时不该删除整个catch语句 + // if (t.isCatchClause(bindingPath)) { + // return; + // } + + // // function(a, b) {}; + // // let t = function({dataset: {name, opts={}}}, [asq, ttqw]) {}; + // // 函数的参数 + // if ( + // t.isFunctionExpression(bindingPath.parentPath) || + // t.isFunctionDeclaration(bindingPath.parentPath) + // ) { + // return; + // } + + // // let [zz, xx, cc] = [1, 2, 3]; + // // let {x: x1} = {x: 1, y2: 2}; + // if ( + // t.isVariableDeclarator(bindingPath) && + // t.isArrayPattern(bindingPath.node.id) + // ) { + // return; + // } + + // // 未知 + // if (t.isArrayPattern(bindingPath)) { + // return; + // } + + if ( + // 过滤 let [zz, xx, cc] = [1, 2, 3]; + // 变量声明语句可能有副作用,不能简单去除 + // 例如:let a = obj.x,obj.x 可能有访问器属性。其他连等情况等等 + // (t.isVariableDeclarator(bindingPath) && + // !t.isArrayPattern(bindingPath.node.id)) || + t.isClassDeclaration(bindingPath) || + t.isFunctionDeclaration(bindingPath) || + t.isImportDefaultSpecifier(bindingPath) || + t.isImportNamespaceSpecifier(bindingPath) || + t.isImportSpecifier(bindingPath) + ) { + remove(name, scope, binding); + } + }); + + // 处理声明之间循环引用 + // 当一个声明未被使用时,那该声明所引用的其他声明不算真正使用 + if (hasRemoved) { + doDce(scope); } - }); + }; - // 处理声明之间循环引用 - // 当一个声明未被使用时,那该声明所引用的其他声明不算真正使用 - if (hasRemoved) { - dceDeclaration(scope); - } + doDce(scope); + + return importPaths; } // console.log( From 7ad7b1cfdcbff813e2863feb11e7e3aa2b501fda Mon Sep 17 00:00:00 2001 From: sparklinm Date: Wed, 14 Jul 2021 19:12:53 +0800 Subject: [PATCH 15/20] =?UTF-8?q?feat:=20=E6=95=B4=E7=90=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/shaking/cjs1.js | 9 +- packages/wxa-cli/example/shaking/cjs2.js | 4 +- packages/wxa-cli/example/shaking/index.js | 21 +- packages/wxa-cli/example/shaking/user.js | 7 +- packages/wxa-cli/package.json | 3 +- packages/wxa-cli/src/schedule.js | 62 ++- packages/wxa-cli/src/tree-shake/config.js | 27 +- packages/wxa-cli/src/tree-shake/graph.js | 145 +++--- packages/wxa-cli/src/tree-shake/index.js | 492 +----------------- .../{tansform-commonJS.js => shake-cjs.js} | 166 +++--- packages/wxa-cli/src/tree-shake/tree-shake.js | 441 ++++++++++++++++ packages/wxa-cli/src/tree-shake/util.js | 67 ++- 12 files changed, 735 insertions(+), 709 deletions(-) rename packages/wxa-cli/src/tree-shake/{tansform-commonJS.js => shake-cjs.js} (83%) create mode 100644 packages/wxa-cli/src/tree-shake/tree-shake.js diff --git a/packages/wxa-cli/example/shaking/cjs1.js b/packages/wxa-cli/example/shaking/cjs1.js index 5e016891..0bb3741a 100644 --- a/packages/wxa-cli/example/shaking/cjs1.js +++ b/packages/wxa-cli/example/shaking/cjs1.js @@ -7,13 +7,12 @@ fn1(); // Object.defineProperty(exports, '__esModule', { exports.writeFile = writeFile; exports.isFile = isFile; module.exports = { - getFiles, + getFiles }; function getFiles(dir = process.cwd(), prefix = '') { let rst = []; - exports.rst = rst; - let aaaa = 'aaa'; // exports[aaaa] = aaaa; + exports.rst = rst; // exports[aaaa] = aaaa; // let ttt= require('sss'); // console.log(ttt); // exports.addClass; @@ -28,6 +27,4 @@ function getFiles(dir = process.cwd(), prefix = '') { function writeFile(p, data) {} -function isFile(p) {} - -let _a = function m() {}; +function isFile(p) {} \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/cjs2.js b/packages/wxa-cli/example/shaking/cjs2.js index faf6661a..f6a7929f 100644 --- a/packages/wxa-cli/example/shaking/cjs2.js +++ b/packages/wxa-cli/example/shaking/cjs2.js @@ -1,5 +1,3 @@ function fn1(params) {} -exports.fn1 = fn1; - -let _fn = function fn4() {}; \ No newline at end of file +exports.fn1 = fn1; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js index 327a1ba9..1e3e28b4 100644 --- a/packages/wxa-cli/example/shaking/index.js +++ b/packages/wxa-cli/example/shaking/index.js @@ -6,8 +6,7 @@ import { writeFile, isFile } from './cjs1'; writeFile(); isFile(); getName(); -let ssqqww = 1; // console.log(user); - +// console.log(user); console.log(getAge); let a = { x: 1 @@ -20,7 +19,6 @@ function m(x = 1, y) { ++a; t = 9; t + 5; - let qqq = 10; let ssqqww = 5; console.log(ssqqww); } @@ -32,13 +30,6 @@ try { console.log(a); } catch (error) {} -let ttt = function ({ - x: xxx, - y -}) {}; - -let sss = (a, b) => {}; - [1, 2, 3].forEach(function (item) {}); for (i = 0; i < 100; i++) {} @@ -81,16 +72,12 @@ let clearErrorMsg = function ({ opts = {} } } -}, [asq, ttqw], ppp) { - let asdf = 'p'; -}; +}, [asq, ttqw], ppp) {}; function aaa({ p1, p2 -}) { - let asdwqe = 'p'; -} +}) {} ; aaa(); @@ -126,6 +113,8 @@ export { mm }; class asf {} +// export {m as qqqqq, a as default}; +// export {x, y} from './a'; export default asf; ; export { Myclass }; // eslint-disable-next-line no-var diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js index 59320064..dce4848e 100644 --- a/packages/wxa-cli/example/shaking/user.js +++ b/packages/wxa-cli/example/shaking/user.js @@ -3,10 +3,9 @@ export {}; function getAge(params) {} -export default getAge; - -let mm1 = 1, - c = function mm2(params) {}; +export default getAge; // let a =1; +// export default a; +// eslint-disable-next-line one-var export {}; export {}; diff --git a/packages/wxa-cli/package.json b/packages/wxa-cli/package.json index 00639abb..ce86f769 100644 --- a/packages/wxa-cli/package.json +++ b/packages/wxa-cli/package.json @@ -70,7 +70,8 @@ "shelljs": "^0.8.3", "tapable": "^1.0.0", "valid-url": "^1.0.9", - "source-map": "^0.7.3" + "source-map": "^0.7.3", + "lodash": "^4.17.21" }, "publishConfig": { "access": "public" diff --git a/packages/wxa-cli/src/schedule.js b/packages/wxa-cli/src/schedule.js index 0c3a9d2c..69adf0ac 100644 --- a/packages/wxa-cli/src/schedule.js +++ b/packages/wxa-cli/src/schedule.js @@ -18,6 +18,7 @@ import ProgressTextBar from './helpers/progressTextBar'; import Preformance, {wxaPerformance} from './helpers/performance'; import simplify from './helpers/simplifyObj'; import {isIgnoreFile} from './helpers/pathParser'; +import {treeShake} from './tree-shake/index'; let debug = debugPKG('WXA:Schedule'); @@ -90,6 +91,7 @@ class Schedule { // if is mounting compiler, all task will be blocked. this.$isMountingCompiler = false; this.progress = new ProgressTextBar(this.current, wxaConfigs); + this.$depJsPending = []; // save all app configurations for compile time. // such as global components. @@ -135,17 +137,28 @@ class Schedule { async $doDPA() { let tasks = []; + while (this.$depPending.length) { let dep = this.$depPending.shift(); + if (!this.cmdOptions.watch && dep.src.endsWith('.js')) { + this.$depJsPending.push(dep); + } else { + tasks.push(this.$parse(dep)); + } + // debug('file to parse %O', dep); - tasks.push(this.$parse(dep)); } let succ = await Promise.all(tasks); if (this.$depPending.length === 0) { // dependencies resolve complete + if (!this.cmdOptions.watch) { + let sub = await this.$dojsDPA(); + return succ.concat(sub); + } + this.progress.clean(); return succ; } else { @@ -154,6 +167,53 @@ class Schedule { } } + async $dojsDPA() { + this.$depPending = this.$depJsPending; + this.$depJsPending = []; + let entries = this.$depPending.map((item)=>({src: item.src, content: item.content})); + console.time('shake'); + let contents = treeShake( + { + entry: entries, + resolveSrc: { + root: 'src', + alias: this.wxaConfigs.resolve.alias, + }, + commonJS: { + enable: true, + }, + } + ); + console.timeEnd('shake'); + + let run = async () => { + let tasks = []; + + while (this.$depPending.length) { + let dep = this.$depPending.shift(); + let content = contents[dep.src] && contents[dep.src].formattedCode; + if (content) { + dep.content = content; + } + + tasks.push(this.$parse(dep)); + } + + let succ = await Promise.all(tasks); + + if (this.$depPending.length === 0) { + // dependencies resolve complete + this.progress.clean(); + return succ; + } else { + let sub = await run(); + return succ.concat(sub); + } + }; + + return run(); + } + async $parse(dep) { if (dep.color === COLOR.COMPILED) return dep; if (dep.color === COLOR.CHANGED) dep.code = void(0); diff --git a/packages/wxa-cli/src/tree-shake/config.js b/packages/wxa-cli/src/tree-shake/config.js index 5ed7e593..8c3cb25a 100644 --- a/packages/wxa-cli/src/tree-shake/config.js +++ b/packages/wxa-cli/src/tree-shake/config.js @@ -1,16 +1,13 @@ module.exports = { - entry: [ - { - // 路径 - src: '', - // 文件内容(可选) - content: '', - }, - ], + // { + // src: '', // 路径 + // content: '', // 文件内容(可选) + // }, + entry: [], resolveSrc: { // '/a/b/c',绝对路径根目录 // 例如src, '/a/b/c' 转换为 /src/a/b/b - root: '', + root: 'src', // {'@': 'src'},路径别名 alias: {}, npm: 'node_modules', @@ -18,23 +15,25 @@ module.exports = { commonJS: { enable: false, // 无法追踪动态引入的模块 - // 如果有模块被动态引入,需要在这里设置该模块路径 - // 将跳过对该模块的 cjs 转 esm + // 如果有模块被动态引入,需要在这里设置该模块文件路径 + // 将跳过对该文件的 tree shake dynamicRequireTargets: [], // 设置 exports 上的哪些属性不会被转换为 esm // 默认值有 '__esModule' - ingoreKeys: [], + ingoreKeys: ['__esModule'], }, parseOptions: { plugins: [ ['decorators', {decoratorsBeforeExport: true}], 'classProperties', - 'jsx', - 'typescript', 'exportNamespaceFrom', 'exportDefaultFrom', 'objectRestSpread', ], sourceType: 'unambiguous', }, + generateOptions: { + decoratorsBeforeExport: true, + }, + debug: false, }; diff --git a/packages/wxa-cli/src/tree-shake/graph.js b/packages/wxa-cli/src/tree-shake/graph.js index 7a32eee1..55769847 100644 --- a/packages/wxa-cli/src/tree-shake/graph.js +++ b/packages/wxa-cli/src/tree-shake/graph.js @@ -5,9 +5,10 @@ const { resolveDepSrc, parseESCode, dceDeclaration, + log, } = require('./util'); let config = require('./config'); -let {TransformCommonJs} = require('./tansform-commonJS'); +let {CommonJS} = require('./shake-cjs'); class Graph { constructor(entries) { @@ -151,12 +152,15 @@ class Graph { if (node.specifiers && node.specifiers.length) { storeSpecifiers(path, node); } else { - let {specifiers, declarationPath} = - transformExportDeclarationToSpecifiers(path); + // 类似于export function mm(){} + // 单独声明 function mm(){},并export default mm + let { + specifiers, + declarationPath, + } = transformExportDeclarationToSpecifiers(path); + + path.insertBefore(declarationPath.node); - let newDeclarationPath = path.insertBefore( - declarationPath.node - )[0]; let exportNamedDeclaration = t.exportNamedDeclaration( null, specifiers @@ -164,14 +168,8 @@ class Graph { let newExportPath = path.insertAfter( exportNamedDeclaration )[0]; - // 删除声明节点会同时删除相应binding - path.remove(); - // 注册binding - // 注册binding是根据path来注册 - // path.scope.registerBinding(declarationPath.node.kind || 'hoisted', newDeclarationPath); - // 注册binding,并不会自动更新相应binding的referencePaths等信息,调用crawl更新 - // path.scope.crawl(); + path.remove(); storeSpecifiers(newExportPath, node); } }, @@ -179,26 +177,37 @@ class Graph { ExportDefaultDeclaration: { enter: (path) => { let {node} = path; - let declarationNode = node.declaration; - let exportPath = path; - - // TODO,未处理 export default a=1 这类表达式 - // 类似于export default function mm(){} - // 单独声明mm,并export default mm - if (declarationNode.id && declarationNode.id.name) { - let newDeclarationPath = - path.insertBefore(declarationNode)[0]; - let exportDefaultNode = t.exportDefaultDeclaration( - t.identifier(declarationNode.id.name) - ); - exportPath = path.insertAfter(exportDefaultNode)[0]; - path.remove(); - // 注册binding - // path.scope.registerBinding( declarationNode.kind || 'hoisted', newDeclarationPath); - // path.scope.crawl(); + let declarationPath = path.get('declaration'); + let declarationNode = declarationPath.node; + + // 类似于 export default function mm(){} + // 单独声明 mm,然后 export default mm + if ( + (t.isFunctionDeclaration(declarationNode) || + t.isClassDeclaration(declarationNode)) && + declarationNode.id && + declarationNode.id.name + ) { + path.insertBefore(declarationNode); + declarationPath.replaceWith(declarationNode.id); + } else if ( + !t.isFunctionDeclaration(declarationNode) && + !t.isClassDeclaration(declarationNode) && + !t.isIdentifier(declarationNode) + ) { + // 类似于 export default {} + // 单独声明 let _temp = {},然后 export default _temp + let id = path.scope.generateUidIdentifier(); + let declaration = t.variableDeclaration('let', [ + t.variableDeclarator(id, declarationNode), + ]); + path.insertBefore(declaration); + declarationPath.replaceWith(id); } - store('default', exportPath, node); + // 剩余情况:export default a, export default function(){} + + store('default', path, node); }, }, ExportAllDeclaration: { @@ -239,16 +248,11 @@ class Graph { content = entry.content; } - // if (src.endsWith('user.js')) { - // console.log('src', src); - // this.debug = true; - // } - if (analyzedFile[src]) { return analyzedFile[src]; } - - console.log('graph', src); + + log('graph', src); let code = content || readFile(src); let ast = parseESCode(code); @@ -257,7 +261,7 @@ class Graph { let topScope = null; - let transformCommonJs = new TransformCommonJs({src, code, ast}); + let commonjs = new CommonJS({src, code, ast}); let {visitor: exportVisitor, exports} = this.collectExport( src, @@ -275,10 +279,6 @@ class Graph { ...importVisitor, }); - // console.log(src); - // console.log('imports', imports); - // console.log('exports', exports); - // import * 和 export * 不包括default // export * from '' 和 export 本文件冲突,export 本文件优先级更高 // export * from '' 互相冲突,后export * from '' 优先 @@ -312,36 +312,37 @@ class Graph { * } */ - if (transformCommonJs) { - transformCommonJs.state.cjsRequireModules.forEach( - (names, requireSrc) => { - let abSrc = this.getAbsolutePath(src, requireSrc); - - imports[abSrc] = imports[abSrc] || {}; - Array.from(names).forEach((name) => { - if (name === 'default') { - imports[abSrc].default = 'custom_import_name'; - imports[abSrc]['*'] = 'custom_import_name'; - return; - } + commonjs.state.cjsRequireModules.forEach( + (names, requireSrc) => { + let abSrc = this.getAbsolutePath(src, requireSrc); - imports[abSrc][name] = 'custom_import_name'; - }); - } - ); + imports[abSrc] = imports[abSrc] || {}; + Array.from(names).forEach((name) => { + if (name === 'default') { + imports[abSrc].default = 'custom_import_name'; + imports[abSrc]['*'] = 'custom_import_name'; + return; + } - transformCommonJs.state.cjsExportModules.forEach( + imports[abSrc][name] = 'custom_import_name'; + }); + } + ); + + if (!commonjs.state.dynamicRequired) { + commonjs.state.cjsExportModules.forEach( (path, name) => { exports[src] = exports[src] || {}; exports[src][name] = path; path.$isCjsExport = true; + if (isRoot) { path.$extReferences = new Set().add('root'); } else { path.$extReferences = new Set(); } - // console.log('s:', name, path.toString()); + // log('cjsExportName', name, path.toString()); } ); } @@ -355,29 +356,9 @@ class Graph { children: [], topScope, isRoot, - transformCommonJs, + commonjs, }; - // const generate = require('@babel/generator').default; - // const {writeFile} = require('./util'); - // let path = require('path'); - // const {code: outputCode} = generate( - // ast, - // { - // /* options */ - // decoratorsBeforeExport: true, - // }, - // code - // ); - // writeFile( - // path.resolve( - // path.dirname(src), - // './shaking', - // path.basename(src) - // ), - // outputCode - // ); - analyzedFile[src] = dep; Object.keys(dep.imports).forEach((childSrc, index) => { diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index d6d7dd49..69e13006 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -1,398 +1,8 @@ -const generate = require('@babel/generator').default; -const {writeFile, dceDeclaration} = require('./util'); let config = require('./config'); - let {Graph} = require('./graph'); - -/** - * export node 有一个_shake标志,如果该export没有被import,或者被import后没有使用,_shake = 1 - * 在这里,遍历全局文件树,根据import和export关系,对没使用的export进行标记 - * 但如果用require去引入一个export函数变量,这里并不能分析到这个export函数变量被使用过(所以不能去 require 一个 export) - */ - -let chains = {}; - -function shake(dep) { - if (dep._shook) { - return; - } - - let {imports, exports, isRoot, src: depSrc} = dep; - - console.log('---'); - console.log('shake src', depSrc); - - let fileExportChain = []; - chains[depSrc] = fileExportChain; - - let collectExportChain = (dep, childSrc, currentChain) => { - if (currentChain.length) { - let child = dep.children.find((child) => child.src === childSrc); - let exportsArray = Object.entries(child.exports); - let localIndex = exportsArray.findIndex( - ([src]) => src == child.src - ); - let localExports = null; - let externalExports = [...exportsArray]; - - if (localIndex !== -1) { - localExports = externalExports.splice(localIndex, 1)[0]; - } - - let usedExports = {}; - let nextChain = []; - - let setCurrentChain = (chainNode, childName, path) => { - let childChainNode = { - name: childName, - path, - children: [], - parent: chainNode, - dep: child, - }; - chainNode.children.push(childChainNode); - nextChain.push(childChainNode); - path.$chain = { - [childName]: childChainNode, - }; - }; - - let getExportLocalName = (path, defaultName) => { - if (path.$isCjsExport) { - return defaultName; - } - - let local = path.node.local; - if (local) { - return local.name; - } - - return '*'; - }; - - let addUsedExport = (src, name, path) => { - usedExports[src] = usedExports[src] || {}; - - if (name) { - usedExports[src][name] = path; - } - }; - - let collect = (chainNode, path, src, defaultLocalName) => { - let localName = ''; - - if (defaultLocalName) { - localName = defaultLocalName; - } else { - localName = getExportLocalName(path); - } - - if (path.$chain && path.$chain[localName]) { - chainNode.children.push(path.$chain[localName]); - return; - } - - setCurrentChain(chainNode, localName, path); - addUsedExport(src, localName, path); - }; - - let importAllChainNode = currentChain.find( - (node) => node.name === '*' - ); - - if (importAllChainNode) { - let importDefaultChainNode = currentChain.find( - (node) => node.name === 'default' - ); - - let markedDefalut = false; - if (localExports) { - Object.entries(localExports[1]).forEach(([name, path]) => { - if (name === 'default') { - if (importDefaultChainNode) { - markedDefalut = true; - setCurrentChain( - importDefaultChainNode, - 'dafault', - path - ); - } - } else { - let localName = getExportLocalName(path, name); - setCurrentChain( - importAllChainNode, - localName, - path - ); - } - }); - } - - externalExports.forEach(([src, exportInfo]) => { - Object.entries(exportInfo).forEach(([name, path]) => { - if ( - name === 'default' && - importDefaultChainNode && - !markedDefalut - ) { - collect(importDefaultChainNode, path, src); - } else if (name !== 'default') { - collect(importAllChainNode, path, src); - } - }); - }); - } else { - currentChain.forEach((chainNode) => { - let name = chainNode.name; - if (localExports) { - let path = localExports[1][name]; - - if (path) { - if (name === 'default') { - setCurrentChain(chainNode, 'dafault', path); - } else { - let localName = getExportLocalName(path, name); - setCurrentChain(chainNode, localName, path); - } - return; - } - } - - externalExports.forEach(([src, exportInfo]) => { - let path = exportInfo[name]; - - if (path) { - collect(chainNode, path, src); - } - - path = exportInfo['*']; - - if (path) { - collect(chainNode, path, src, name); - } - }); - }); - } - - Object.entries(usedExports).forEach((src, value) => { - let childUsedNames = Object.keys(value); - let childChain = childUsedNames.map((n) => { - return nextChain.find((chainNode) => chainNode.name === n); - }); - - collectExportChain(child, src, childChain); - }); - } - }; - - // if (depSrc.endsWith('ZY\\models\\index.js')) { - // console.log('ssssss'); - // } - - Object.entries(imports).forEach(([src, value]) => { - let currentChain = []; - - Object.entries(value).forEach(([name, path]) => { - let chainNode = { - parent: null, - name, - path, - children: [], - dep, - }; - fileExportChain.push(chainNode); - currentChain.push(chainNode); - }); - - collectExportChain(dep, src, currentChain); - }); - - // 根节点的export语句默认全部保留 - // 所以还需要处理根节点的export语句(export {} from '') - if (isRoot) { - Object.entries(exports).forEach(([src, exportInfo]) => { - if (src !== dep.src) { - let currentChain = []; - - Object.entries(exportInfo).forEach(([name, path]) => { - let chainNode = { - parent: null, - name, - path, - children: [], - dep, - }; - fileExportChain.push(chainNode); - currentChain.push(chainNode); - }); - - collectExportChain(dep, src, currentChain); - } - }); - } - - let markExport = () => { - let visitedChainNodes = []; - - let findLastChainNode = (chainNode) => { - // 循环依赖 - if (visitedChainNodes.includes(chainNode)) { - return; - } - - visitedChainNodes.push(chainNode); - - if (!chainNode.children.length) { - let exportPath = chainNode.path; - - if (exportPath.node && !exportPath.node.source) { - visitedChainNodes.forEach((visitedNode, index) => { - // 第一个节点是import节点或者root的export节点 - // 跳过 - if (index === 0) { - return; - } - - let {path} = visitedNode; - - path.$extReferences.add(visitedChainNodes[0].path); - }); - } - } else { - chainNode.children.forEach((child) => { - findLastChainNode(child); - }); - } - - visitedChainNodes.pop(); - }; - - fileExportChain.forEach((chainNode) => { - findLastChainNode(chainNode); - }); - }; - - markExport(); - - dep._shook = true; - dep.children.forEach((child) => shake(child)); -} - -let noReferencedExports = []; - -function collectNotReferencedExports(dep) { - if (dep._colletced) { - return; - } - - let {exports, src} = dep; - console.log('colletced', src); - - // if (src.endsWith('ZY\\models\\applyCenter.model.js')) { - // console.log('ss'); - // } - - Object.entries(exports).forEach(([src, value]) => { - Object.entries(value).forEach(([name, path]) => { - if (!path.$extReferences.size) { - noReferencedExports.push({path, dep, name}); - } - }); - }); - - dep._colletced = true; - - dep.children.forEach((child) => collectNotReferencedExports(child)); -} - -function remove() { - let visitedChainNodes = []; - let removeExtReference = (chainNode, importPath) => { - // 循环依赖 - if (visitedChainNodes.includes(chainNode)) { - return; - } - - visitedChainNodes.push(chainNode); - chainNode.children.forEach((childNode) => { - childNode.path.$extReferences.delete(importPath); - - if (childNode.path.$extReferences.size === 0) { - noReferencedExports.push({ - path: childNode.path, - dep: childNode.dep, - name: childNode.name, - }); - } - - removeExtReference(childNode, importPath); - }); - visitedChainNodes.pop(); - }; - - for (let i = 0; i < noReferencedExports.length; i++) { - const {path: exportPath, dep, name} = noReferencedExports[i]; - let {transformCommonJs, topScope, src} = dep; - - if (exportPath.$isCjsExport) { - transformCommonJs.deleteCJSExport(name); - } else { - exportPath.remove(); - } - - let importPaths = dceDeclaration(topScope); - - if (importPaths.length) { - let chain = chains[src]; - - importPaths.forEach((importPath) => { - let chainNode = chain.find( - (chainNode) => chainNode.path === importPath - ); - - removeExtReference(chainNode, importPath); - }); - } - } -} - -function output(dep) { - let contents = {}; - - let run = (dep) => { - let {ast, code, src} = dep; - - if (dep._output) { - return; - } - - const {code: outputCode} = generate( - ast, - { - /* options */ - decoratorsBeforeExport: true, - }, - code - ); - - writeFile( - path.resolve(path.dirname(src), './shaking', path.basename(src)), - outputCode - ); - - contents[src] = outputCode; - - dep._output = true; - - dep.children.forEach((child) => { - run(child); - }); - }; - - run(dep); - - return contents; -} +let {TreeShake} = require('./tree-shake'); +let mergeWith = require('lodash/mergeWith'); +let isArray = require('lodash/isArray'); function setConfig(options) { if ( @@ -403,93 +13,39 @@ function setConfig(options) { throw new Error('Options entry is required'); } - config.entry = options.entry; - - if (options.resolveSrc) { - Object.assign(config.resolveSrc, options.resolveSrc); - } - - if (options.commonJS) { - Object.assign(config.commonJS, options.commonJS); - config.commonJS.ingoreKeys.push('__esModule'); - } - - if (options.parseOptions) { - if (options.parseOptions.plugins) { - config.parseOptions.plugins = [ - ...config.parseOptions.plugins, - ...options.parseOptions.plugins, - ]; - - delete options.parseOptions.plugins; + mergeWith(config, options, (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue); } - - config.parseOptions = { - ...config.parseOptions, - ...options.parseOptions, - }; - } + }); } function treeShake(options = {}) { setConfig(options); let graph = new Graph(); - - graph.roots.forEach((root) => { - shake(root); - }); - - console.log('shook'); - - graph.roots.forEach((root) => { - collectNotReferencedExports(root); - }); - - remove(); - - let contents = {}; - graph.roots.forEach((root) => { - contents = {...contents, ...output(root)}; - }); - - return contents; + let treeShake = new TreeShake(graph.roots); + let files = treeShake.run(); + return files; } module.exports = { treeShake, }; -console.time('end'); -let path = require('path'); -let entrySrc = path.resolve(__dirname, '../../example/index.js'); -treeShake({ - entry: [{src: entrySrc}], - commonJS: {enable: true}, -}); -console.timeEnd('end'); - -// function name(params) { -// console.log(m); -// } - -// name(); -// const generate = require('@babel/generator').default; -// const traverse = require('@babel/traverse').default; -// const {parse} = require('@babel/parser'); -// let code = `exports.x=1;let t =exports`; -// let ast = parse(code, {sourceType: 'unambiguous'}); -// traverse(ast, { -// enter(path) { -// console.log(path.scope) - -// }, +// console.time('end'); +// let path = require('path'); +// const {writeFile} = require('./util'); +// let entrySrc = path.resolve(__dirname, '../../example/index.js'); +// let files = treeShake({ +// entry: [{src: entrySrc}], +// commonJS: {enable: true}, // }); -// console.log(generate( -// ast, -// { -// /* options */ -// }, -// code -// ).code); +// Object.values(files).forEach(({src, formattedCode}) => { +// writeFile( +// path.resolve(path.dirname(src), './shaking', path.basename(src)), +// formattedCode +// ); +// }); +// console.timeEnd('end'); diff --git a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js b/packages/wxa-cli/src/tree-shake/shake-cjs.js similarity index 83% rename from packages/wxa-cli/src/tree-shake/tansform-commonJS.js rename to packages/wxa-cli/src/tree-shake/shake-cjs.js index 3ff503c9..5d7e2eae 100644 --- a/packages/wxa-cli/src/tree-shake/tansform-commonJS.js +++ b/packages/wxa-cli/src/tree-shake/shake-cjs.js @@ -1,19 +1,8 @@ -let path = require('path'); - const traverse = require('@babel/traverse').default; -const generate = require('@babel/generator').default; -const { - readFile, - writeFile, - parseESCode, - isChildNode, - unique, -} = require('./util'); +const {parseESCode, unique, log} = require('./util'); let t = require('@babel/types'); const config = require('./config'); -let options = {}; - function getStaticValue(node) { if (t.isStringLiteral(node) || t.isNumericLiteral(node)) { return node.value; @@ -27,7 +16,7 @@ function getStaticValue(node) { return false; } -// node: MemberExpression +// 获得 MemberExpression 节点的属性的静态值 function getStaticMemberPro(node) { if (node.computed) { return getStaticValue(node.property); @@ -36,7 +25,7 @@ function getStaticMemberPro(node) { return node.property.name; } -class TransformCommonJs { +class CommonJS { state = { // { // moduleName: exports Path @@ -54,6 +43,7 @@ class TransformCommonJs { usedExports: new Set(), isDynamicUsedExportsProperty: false, isUsedExportsObject: false, + dynamicRequired: false, }; constructor({src, code, ast}) { @@ -62,27 +52,31 @@ class TransformCommonJs { this.ast = ast || parseESCode(code); let dynamicRequireTargets = config.commonJS.dynamicRequireTargets || []; - // 如果一个模块被其他模块动态导入 - // 不对这个模块做任何处理 - if (dynamicRequireTargets.includes(src) || !config.commonJS.enable) { + + if (!config.commonJS.enable) { return; } this.ingorekeys = config.commonJS.ingoreKeys; - this.transform(this.ast, options); + this.transform(this.ast); + + if (dynamicRequireTargets.includes(src)) { + this.state.dynamicRequired = true; + return; + } if (this.state.isCJS) { - console.log('---------'); - console.log('cjsRequireModules', this.state.cjsRequireModules); - console.log('usedExports', this.state.usedExports); - console.log( + log('---------'); + log('cjsRequireModules', this.state.cjsRequireModules); + log('usedExports', this.state.usedExports); + log( 'isDynamicUsedExportsProperty', this.state.isDynamicUsedExportsProperty ); - console.log('isUsedExportsObject', this.state.isUsedExportsObject); - // console.log('cjsExportModules', this.state.cjsExportModules); - console.log('---------'); + log('isUsedExportsObject', this.state.isUsedExportsObject); + // log('cjsExportModules', this.state.cjsExportModules); + log('---------'); } } @@ -105,8 +99,6 @@ class TransformCommonJs { return; } - console.log(exportName); - Array.from(this.state.cjsExportModules).some(([name, cjsPath]) => { if (exportName === name) { cjsPath.remove(); @@ -115,18 +107,7 @@ class TransformCommonJs { }); } - markNodeDeep(node, flag) { - node[flag] = true; - traverse(node, { - noScope: true, - enter(path) { - let {node} = path; - node[flag] = true; - }, - }); - } - - transform(ast, options = {}) { + transform(ast) { let that = this; traverse(ast, { CallExpression: { @@ -141,6 +122,7 @@ class TransformCommonJs { let source = getStaticValue(node.arguments[0]); + // 动态导入 if (source === false) { console.warn( `Dynamic cjsRequireModules are not currently supported: ${path.toString()}. please configure dynamicrequiretargets` @@ -152,8 +134,9 @@ class TransformCommonJs { let {parentPath} = path; let {node: parentNode} = parentPath; - let requireNames = - this.state.cjsRequireModules.get(source); + let requireNames = this.state.cjsRequireModules.get( + source + ); if (!requireNames) { requireNames = new Set(); this.state.cjsRequireModules.set( @@ -162,7 +145,10 @@ class TransformCommonJs { ); } - // let {a} = require('a') + // 节点:let {a} = require('a') + // 可能存在的问题,require 的对象被其他函数包装后。例如: + // let {a} = fn(require('a')) + // 此时的 a 并不是原对象的 a 属性 let objectPatternPath = path.findParent((parent) => { return t.isObjectPattern(parent.node.id); }); @@ -188,8 +174,9 @@ class TransformCommonJs { requireNames.add(name); } else if (source) { - // require('./a') - // 声明语句才有:let a = require('./a') + // 节点是 require('./a') 的情况 + + // 声明语句:let a = require('./a') let declaratorParentPath = path.find((path) => { return t.isVariableDeclarator(path); }); @@ -200,6 +187,8 @@ class TransformCommonJs { ''; let usedNames = []; + // 只有是声明语句才去分析属性的使用情况 + // 例如:let a = require('./a'),去分析 a 上哪些属性被访问 if (name) { let binding = path.scope.getBinding(name); @@ -260,8 +249,9 @@ class TransformCommonJs { }) ); } else { - let id = - path.scope.generateUidIdentifier(exportName); + let id = path.scope.generateUidIdentifier( + exportName + ); let declaration = t.variableDeclaration('let', [ t.variableDeclarator(id, rightNode), ]); @@ -292,7 +282,8 @@ class TransformCommonJs { const moduleBinding = path.scope.getBinding('module'); const exportsBinding = path.scope.getBinding('exports'); - // module.exports.x = 1; 不包含子属性 module.exports.x.y = 1; + // 节点 module.exports.x = 1; + // 不包含访问子属性 module.exports.x.y = 1; if ( t.isMemberExpression(path.node.left.object) && path.node.left.object.object.name === 'module' @@ -307,7 +298,7 @@ class TransformCommonJs { ) { let name = getStaticMemberPro(path.node.left); - // 动态导出,不转换 + // 动态导出 if (name === false) { return; } @@ -316,20 +307,15 @@ class TransformCommonJs { return; } - this.state.isCJS = true; - generateExportNode(path, name); } } else if (path.node.left.object.name === 'exports') { - // exports.x = 1; 不包含子属性 exports.x.y = 1; + // 节点 exports.x = 1; + // 不包含访问子属性 exports.x.y = 1; let name = getStaticMemberPro(path.node.left); if ( exportsBinding || - // If export is named "default" leave as is. - // It is not possible to export "default" as a named export. - // e.g. `export.default = 'a'` - // 动态导出和默认导出,不转换 - name === 'default' || + // 动态导出 name === false ) { return; @@ -339,8 +325,6 @@ class TransformCommonJs { return; } - this.state.isCJS = true; - generateExportNode(path, name); } } @@ -385,7 +369,7 @@ class TransformCommonJs { return leftPath === path; }; - // module.exports.x + // 节点 module.exports.x if ( t.isMemberExpression(path.node.object) && path.node.object.object.name === 'module' @@ -394,6 +378,8 @@ class TransformCommonJs { return; } + this.state.isCJS = true; + if (checkIsAssignmentExpressionLeft()) { return; } @@ -402,9 +388,9 @@ class TransformCommonJs { path.node.object ); - // 动态访问了module上的属性 - // 无法确切的知道是否访问了exports属性 - // 进而无法知道访问了exports的哪些属性 + // 动态访问了 module 上的属性 + // 无法确切的知道是否访问了 exports 属性 + // 进而无法知道访问了exports 的哪些属性 if (staticModuleProVal === false) { this.state.isDynamicUsedExportsProperty = true; return; @@ -416,11 +402,13 @@ class TransformCommonJs { addUsedExports(); } else if (path.node.object.name === 'exports') { - // exports.x + // 节点 exports.x if (exportsBinding) { return; } + this.state.isCJS = true; + if (checkIsAssignmentExpressionLeft()) { return; } @@ -432,6 +420,8 @@ class TransformCommonJs { return; } + this.state.isCJS = true; + let staticModuleProVal = getStaticMemberPro(path.node); if (staticModuleProVal !== 'exports') { @@ -468,13 +458,16 @@ class TransformCommonJs { if ( // 是exports path.node.name === 'exports' && - // 父节点不是对象属性访问,例如:module.exports + // 父节点不是对象属性访问,例如:module.exports 或者 exports.a !t.isMemberExpression(path.parentPath) && // 作用域无 binding exports - !path.scope.getBinding('exports') && - that.checkUsed(path) + !path.scope.getBinding('exports') ) { - this.state.isUsedExportsObject = true; + this.state.isCJS = true; + + if (that.checkUsed(path)) { + this.state.isUsedExportsObject = true; + } } }, }, @@ -511,31 +504,26 @@ class TransformCommonJs { return false; } + // Object.defineProperty(exports, "__esModule", { + // value: true + // }); + // 特殊处理,不算对 exports 整体的使用 + if (t.isCallExpression(parentPath)) { + let nextParam = path.getAllNextSiblings()[0]; + + let defineEsModule = + t.isStringLiteral(nextParam) && + nextParam.node.value === '__esModule'; + + if (defineEsModule) { + return false; + } + } + return true; } } module.exports = { - TransformCommonJs, + CommonJS, }; - -// let src = path.resolve(__dirname, './transform-test.js'); -// let code = readFile(src); - -// console.time('transform'); -// let tt = new TransformCommonJs({src, code}); -// console.timeEnd('transform'); - -// const {code: outputCode} = generate( -// tt.ast, -// { -// /* options */ -// decoratorsBeforeExport: true, -// }, -// code -// ); - -// writeFile( -// path.resolve(path.resolve(__dirname, './transform-test-a.js')), -// outputCode -// ); diff --git a/packages/wxa-cli/src/tree-shake/tree-shake.js b/packages/wxa-cli/src/tree-shake/tree-shake.js new file mode 100644 index 00000000..89d454a1 --- /dev/null +++ b/packages/wxa-cli/src/tree-shake/tree-shake.js @@ -0,0 +1,441 @@ +const {dceDeclaration, log} = require('./util'); +const generate = require('@babel/generator').default; + +class TreeShake { + // 根文件集 + roots = []; + // 由 impoet->export 组成的链 + chains = {}; + // 没有被 import 的 export 节点集合 + noReferencedExports = []; + constructor(roots) { + this.roots = roots; + } + + run() { + this.roots.forEach((root) => { + this.shake(root); + }); + + log('shook'); + + this.roots.forEach((root) => { + this.collectNotReferencedExports(root); + }); + + log('collected'); + + this.remove(); + + log('removed'); + + let contents = {}; + this.roots.forEach((root) => { + contents = {...contents, ...this.output(root)}; + }); + + log('output'); + return contents; + } + + shake(dep) { + if (dep._shook) { + return; + } + + let {imports, exports, isRoot, src: depSrc} = dep; + + log('shake src', depSrc); + + let fileExportChain = []; + this.chains[depSrc] = fileExportChain; + + // 从 import 语句开始,构建一条 import->export->export 链式关系 + let collectExportChain = (dep, childSrc, currentChain) => { + if (currentChain.length) { + let child = dep.children.find( + (child) => child.src === childSrc + ); + let exportsArray = Object.entries(child.exports); + let localIndex = exportsArray.findIndex( + ([src]) => src == child.src + ); + let localExports = null; + let externalExports = [...exportsArray]; + + if (localIndex !== -1) { + localExports = externalExports.splice(localIndex, 1)[0]; + } + + let usedExports = {}; + let nextChain = []; + + let setCurrentChain = (chainNode, childName, path) => { + let childChainNode = { + name: childName, + path, + children: [], + parent: chainNode, + dep: child, + }; + chainNode.children.push(childChainNode); + nextChain.push(childChainNode); + path.$chain = { + [childName]: childChainNode, + }; + }; + + let getExportLocalName = (path, defaultName) => { + // 兼容 exports.x = 1 节点 + if (path.$isCjsExport) { + return defaultName; + } + + let local = path.node.local; + if (local) { + return local.name; + } + + return '*'; + }; + + let addUsedExport = (src, name, path) => { + usedExports[src] = usedExports[src] || {}; + + if (name) { + usedExports[src][name] = path; + } + }; + + let collect = (chainNode, path, src, defaultLocalName) => { + let localName = ''; + + if (defaultLocalName) { + localName = defaultLocalName; + } else { + localName = getExportLocalName(path); + } + + // 对于导出其他文件模块的语句:export {a as aa} from '' + // 可以理解为通过这条语句到对应文件去寻找 a 模块 + // 如果多次解析到这条语句,并且寻找的模块名一样,那每次后面的分析都是一样的 + // 一般来说 export {a as aa} from '' 语句寻找的就是语句中定义的模块 a + // 但 export * from '',寻找的模块名可能由父节点决定 + if (path.$chain && path.$chain[localName]) { + chainNode.children.push(path.$chain[localName]); + return; + } + + setCurrentChain(chainNode, localName, path); + addUsedExport(src, localName, path); + }; + + let importAllChainNode = currentChain.find( + (node) => node.name === '*' + ); + + if (importAllChainNode) { + let importDefaultChainNode = currentChain.find( + (node) => node.name === 'default' + ); + + let markedDefalut = false; + if (localExports) { + Object.entries(localExports[1]).forEach( + ([name, path]) => { + if (name === 'default') { + if (importDefaultChainNode) { + markedDefalut = true; + setCurrentChain( + importDefaultChainNode, + 'dafault', + path + ); + } + } else { + let localName = getExportLocalName( + path, + name + ); + setCurrentChain( + importAllChainNode, + localName, + path + ); + } + } + ); + } + + externalExports.forEach(([src, exportInfo]) => { + Object.entries(exportInfo).forEach(([name, path]) => { + if ( + name === 'default' && + importDefaultChainNode && + !markedDefalut + ) { + collect(importDefaultChainNode, path, src); + } else if (name !== 'default') { + collect(importAllChainNode, path, src); + } + }); + }); + } else { + currentChain.forEach((chainNode) => { + let name = chainNode.name; + if (localExports) { + let path = localExports[1][name]; + + if (path) { + if (name === 'default') { + setCurrentChain(chainNode, 'dafault', path); + } else { + let localName = getExportLocalName( + path, + name + ); + setCurrentChain(chainNode, localName, path); + } + return; + } + } + + externalExports.forEach(([src, exportInfo]) => { + let path = exportInfo[name]; + + if (path) { + collect(chainNode, path, src); + } + + path = exportInfo['*']; + + if (path) { + collect(chainNode, path, src, name); + } + }); + }); + } + + Object.entries(usedExports).forEach((src, value) => { + let childUsedNames = Object.keys(value); + let childChain = childUsedNames.map((n) => { + return nextChain.find( + (chainNode) => chainNode.name === n + ); + }); + + collectExportChain(child, src, childChain); + }); + } + }; + + Object.entries(imports).forEach(([src, value]) => { + let currentChain = []; + + Object.entries(value).forEach(([name, path]) => { + let chainNode = { + parent: null, + name, + path, + children: [], + dep, + }; + fileExportChain.push(chainNode); + currentChain.push(chainNode); + }); + + collectExportChain(dep, src, currentChain); + }); + + // 根节点的 export 语句默认全部保留 + // 所以还需要处理根节点的 export 语句(export {} from '') + if (isRoot) { + Object.entries(exports).forEach(([src, exportInfo]) => { + if (src !== dep.src) { + let currentChain = []; + + Object.entries(exportInfo).forEach(([name, path]) => { + let chainNode = { + parent: null, + name, + path, + children: [], + dep, + }; + fileExportChain.push(chainNode); + currentChain.push(chainNode); + }); + + collectExportChain(dep, src, currentChain); + } + }); + } + + let markExport = () => { + let visitedChainNodes = []; + + let findLastChainNode = (chainNode) => { + // 某个节点在链上出现过两次,这条链不会找到最终导出的模块 + if (visitedChainNodes.includes(chainNode)) { + return; + } + + visitedChainNodes.push(chainNode); + + if (!chainNode.children.length) { + let exportPath = chainNode.path; + + // 最后一个节点是文件内导出(不是 export a from '') + // 才算是找到最终导出的节点 + if (exportPath.node && !exportPath.node.source) { + visitedChainNodes.forEach((visitedNode, index) => { + // 第一个节点是 import 节点或者 root 的 export 节点 + // 跳过 + if (index === 0) { + return; + } + + let {path} = visitedNode; + + // 这条链上的所有 export 节点的 $extReferences 属性添加 import 节点 + // 表示它们被导入过 + path.$extReferences.add(visitedChainNodes[0].path); + }); + } + } else { + chainNode.children.forEach((child) => { + findLastChainNode(child); + }); + } + + visitedChainNodes.pop(); + }; + + fileExportChain.forEach((chainNode) => { + findLastChainNode(chainNode); + }); + }; + + markExport(); + + dep._shook = true; + dep.children.forEach((child) => this.shake(child)); + } + + // 收集没有被导入过的 export 节点 + collectNotReferencedExports(dep) { + if (dep._colletced) { + return; + } + + let {exports, src} = dep; + + log('collect src', src); + + Object.entries(exports).forEach(([src, value]) => { + Object.entries(value).forEach(([name, path]) => { + if (!path.$extReferences.size) { + this.noReferencedExports.push({path, dep, name}); + } + }); + }); + + dep._colletced = true; + + dep.children.forEach((child) => + this.collectNotReferencedExports(child) + ); + } + + remove() { + let visitedChainNodes = []; + let removeExtReference = (chainNode, importPath) => { + // 循环依赖 + if (visitedChainNodes.includes(chainNode)) { + return; + } + + visitedChainNodes.push(chainNode); + chainNode.children.forEach((childNode) => { + childNode.path.$extReferences.delete(importPath); + + if (childNode.path.$extReferences.size === 0) { + this.noReferencedExports.push({ + path: childNode.path, + dep: childNode.dep, + name: childNode.name, + }); + } + + removeExtReference(childNode, importPath); + }); + visitedChainNodes.pop(); + }; + + for (let i = 0; i < this.noReferencedExports.length; i++) { + const {path: exportPath, dep, name} = this.noReferencedExports[i]; + let {commonjs, topScope, src} = dep; + + if (exportPath.$isCjsExport) { + log(src, name); + commonjs.deleteCJSExport(name); + } else { + log(src, name); + exportPath.remove(); + } + + let importPaths = dceDeclaration(topScope); + // 如果删除了 import 节点 + // 对应链上的所有 export 节点都删除这个 import 节点 + if (importPaths.length) { + let chain = this.chains[src]; + + importPaths.forEach((importPath) => { + let chainNode = chain.find( + (chainNode) => chainNode.path === importPath + ); + + removeExtReference(chainNode, importPath); + }); + } + } + } + + output(dep) { + let contents = {}; + + let run = (dep) => { + let {ast, code, src} = dep; + + if (dep._output) { + return; + } + + const {code: outputCode} = generate( + ast, + { + decoratorsBeforeExport: true, + }, + code + ); + + contents[src] = { + code, + formattedCode: outputCode, + src, + }; + + dep._output = true; + + dep.children.forEach((child) => { + run(child); + }); + }; + + run(dep); + + return contents; + } +} + +module.exports = {TreeShake}; diff --git a/packages/wxa-cli/src/tree-shake/util.js b/packages/wxa-cli/src/tree-shake/util.js index ad64f99a..9711ea67 100644 --- a/packages/wxa-cli/src/tree-shake/util.js +++ b/packages/wxa-cli/src/tree-shake/util.js @@ -32,7 +32,6 @@ function isFile(p) { } function isDir(p) { - // console.log(isDir, fs.existsSync(p), p); if (!fs.existsSync(p)) { return false; } @@ -54,14 +53,28 @@ function getPkgConfig(npmSrc, lib) { } /** - * import路径: - * "./a", "a", "@/a", "/a" - * + * + * @description 将import路径解析为绝对路径 + * @example + * resolveDepSrc({ + fileSrc: path.join(process.cwd(), './src/a.js'), + depSrc: '@/b', + root: 'src', + alias: { + '@': path.join(process.cwd(), '/src/xxx'), + }, + }) + * @param {string} fileSrc 文件路径 + * @param {string} depSrc impot 引入的路径("./a", "a", "@/a", "/a") + * @param {string} root depsrc 为绝对路径(例如:/a)时相对的目录 + * @param {string} alias 路径别名,例如:{'@': 'src'} + * @param {string} npm npm 目录,例如:node_modules + * @return {string} 依赖的绝对路径 */ - -let cwd = process.cwd(); function resolveDepSrc({fileSrc, depSrc, root, alias, npm}) { - let getDepAbsoulte = (src) => { + let cwd = process.cwd(); + + let getFileSrc = (src) => { if (isDir(src)) { return path.join(src, 'index.js'); } @@ -90,17 +103,17 @@ function resolveDepSrc({fileSrc, depSrc, root, alias, npm}) { }); if (matched) { - return getDepAbsoulte(absoluteSrc); + return getFileSrc(absoluteSrc); } } if (depSrc.startsWith('/')) { - return getDepAbsoulte(path.resolve(cwd, root, depSrc.replace('/', ''))); + return getFileSrc(path.resolve(cwd, root, depSrc.replace('/', ''))); } if (depSrc.startsWith('./') || depSrc.startsWith('../')) { let fileDir = path.dirname(fileSrc); - return getDepAbsoulte(path.resolve(fileDir, depSrc)); + return getFileSrc(path.resolve(fileDir, depSrc)); } let npmSrc = path.join(cwd, npm); @@ -126,7 +139,7 @@ function resolveDepSrc({fileSrc, depSrc, root, alias, npm}) { main = pkg.browser; } - return getDepAbsoulte(path.join(npmSrc, depSrc, main)); + return getFileSrc(path.join(npmSrc, depSrc, main)); } function parseESCode(code) { @@ -154,6 +167,7 @@ function isChildNode(parent, child) { return is; } +// 删除 scope 下未引用的 binding function dceDeclaration(scope) { let importPaths = []; @@ -253,9 +267,18 @@ function dceDeclaration(scope) { if ( // 过滤 let [zz, xx, cc] = [1, 2, 3]; // 变量声明语句可能有副作用,不能简单去除 - // 例如:let a = obj.x,obj.x 可能有访问器属性。其他连等情况等等 - // (t.isVariableDeclarator(bindingPath) && - // !t.isArrayPattern(bindingPath.node.id)) || + // 例如: + // let a = obj.x,obj.x 可能有访问器属性。 + // let a = b = 1 连等 + // let a = fn() 非纯函数运行 + // 先处理为 init 为 identifier、函数、class、Literals 时,可以删除 + (t.isVariableDeclarator(bindingPath) && + !t.isArrayPattern(bindingPath.node.id) && + (t.isIdentifier(bindingPath.node.init) || + t.isLiteral(bindingPath.node.init) || + t.isArrowFunctionExpression(bindingPath.node.init) || + t.isFunctionExpression(bindingPath.node.init) || + t.isClassExpression(bindingPath.node.init))) || t.isClassDeclaration(bindingPath) || t.isFunctionDeclaration(bindingPath) || t.isImportDefaultSpecifier(bindingPath) || @@ -278,21 +301,14 @@ function dceDeclaration(scope) { return importPaths; } -// console.log( -// resolveDepSrc({ -// fileSrc: path.join(cwd, './src/a.js'), -// depSrc: '@/b', -// root: 'src', -// alias: { -// '@': path.join(cwd, '/src/xxx'), -// }, -// }) -// ); - function unique(ary) { return [...new Set(ary)]; } +function log(...params) { + config.debug && log(...params); +} + module.exports = { readFile, writeFile, @@ -301,4 +317,5 @@ module.exports = { dceDeclaration, isChildNode, unique, + log, }; From b1a5c8faf15d5d3505323e80d1af7007a307de35 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Wed, 14 Jul 2021 19:29:30 +0800 Subject: [PATCH 16/20] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/example/cjs1.js | 119 -------------------- packages/wxa-cli/example/cjs2.js | 25 ----- packages/wxa-cli/example/expDFOF/a.js | 13 --- packages/wxa-cli/example/expDFOF/index.js | 27 ----- packages/wxa-cli/example/index.js | 131 ---------------------- packages/wxa-cli/example/shaking/cjs1.js | 30 ----- packages/wxa-cli/example/shaking/cjs2.js | 3 - packages/wxa-cli/example/shaking/index.js | 124 -------------------- packages/wxa-cli/example/shaking/user.js | 13 --- packages/wxa-cli/example/shaking/user2.js | 2 - packages/wxa-cli/example/test.js | 58 ---------- packages/wxa-cli/example/user.js | 19 ---- packages/wxa-cli/example/user2.js | 8 -- packages/wxa-cli/src/tree-shake/index.js | 17 --- packages/wxa-cli/src/tree-shake/scope.js | 53 --------- packages/wxa-cli/src/tree-shake/test.js | 25 ----- 16 files changed, 667 deletions(-) delete mode 100644 packages/wxa-cli/example/cjs1.js delete mode 100644 packages/wxa-cli/example/cjs2.js delete mode 100644 packages/wxa-cli/example/expDFOF/a.js delete mode 100644 packages/wxa-cli/example/expDFOF/index.js delete mode 100644 packages/wxa-cli/example/index.js delete mode 100644 packages/wxa-cli/example/shaking/cjs1.js delete mode 100644 packages/wxa-cli/example/shaking/cjs2.js delete mode 100644 packages/wxa-cli/example/shaking/index.js delete mode 100644 packages/wxa-cli/example/shaking/user.js delete mode 100644 packages/wxa-cli/example/shaking/user2.js delete mode 100644 packages/wxa-cli/example/test.js delete mode 100644 packages/wxa-cli/example/user.js delete mode 100644 packages/wxa-cli/example/user2.js delete mode 100644 packages/wxa-cli/src/tree-shake/scope.js delete mode 100644 packages/wxa-cli/src/tree-shake/test.js diff --git a/packages/wxa-cli/example/cjs1.js b/packages/wxa-cli/example/cjs1.js deleted file mode 100644 index f2fbbafe..00000000 --- a/packages/wxa-cli/example/cjs1.js +++ /dev/null @@ -1,119 +0,0 @@ -let fn1 = require('./cjs2').fn1; - -fn1(); - -// Object.defineProperty(exports, '__esModule', { -// value: true, -// }); -exports.getFiles = getFiles; -// exports.getConfig = getConfig; -module.exports.readFile = readFile; -exports.writeFile = writeFile; -exports.isFile = isFile; -exports.isDir = isDir; -exports.getRelative = getRelative; -exports.getDistPath = getDistPath; -exports.copy = copy; -exports.amazingCache = amazingCache; -exports.applyPlugins = applyPlugins; -exports.isEmpty = isEmpty; -exports.getHash = getHash; -exports.getHashWithString = getHashWithString; -exports.promiseSerial = promiseSerial; -exports.getClassSet = getClassSet; -exports.addClass = addClass; -exports.removeClass = removeClass; - -module.exports = {getFiles}; - -function getFiles(dir = process.cwd(), prefix = '') { - let rst = []; - - exports.rst = rst; - - let aaaa = 'aaa'; - // exports[aaaa] = aaaa; - - // let ttt= require('sss'); - - // console.log(ttt); - - // exports.addClass; - // module.exports.removeClass; - // exports[rst]; -} - -// function getConfig() { -// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); - -// let config = require(configPath); - -// return config; -// } - -function readFile(p) {} - -function writeFile(p, data) {} - -function isFile(p) {} - -function isDir(p) {} - -function getRelative(opath) {} - -function getDistPath(opath, ext, src, dist) {} - -function copy(from, to) {} - -function amazingCache(params, needCache) {} - -function applyPlugins(plugins, compiler) { - if (plugins == null) return; // console.log(plugins); - - if (typeof plugins !== 'object') { - throw new Error('wxa配置文件有误,plugins'); - } - if (!Array.isArray(plugins)) plugins = [plugins]; - plugins.forEach((plugin) => plugin.apply(compiler)); -} - -function isEmpty(n) { - return n == null || n === ''; -} - -function getHash(filepath) {} - -function getHashWithString(content) {} - -function promiseSerial(funs) { - return funs.reduce((promise, fun) => { - return promise.then((result) => - fun().then(Array.prototype.concat.bind(result)) - ); - }, Promise.resolve([])); -} - -function getClassSet(classStr) { - let classList = []; - - if (classStr && typeof classStr === 'string') { - classList = classStr.split(' '); - } - - return new Set(classList); -} - -function addClass(classStr, newClass) { - let classSet = getClassSet(classStr); - classSet.add(newClass); - return Array.from(classSet); -} - -function removeClass(classStr, destClass) { - let classSet = getClassSet(classStr); - classSet.delete(destClass); - return Array.from(classSet); -} -// # sourceMappingURL=utils.js.map - -exports.a = function m() {}; diff --git a/packages/wxa-cli/example/cjs2.js b/packages/wxa-cli/example/cjs2.js deleted file mode 100644 index 9fc85ea2..00000000 --- a/packages/wxa-cli/example/cjs2.js +++ /dev/null @@ -1,25 +0,0 @@ - - -function fn1(params) { - -} - - -function fn2(params) { - -} - - -function fn3(params) { - -} - - -exports.fn1 = fn1; -exports.fn2 = fn2; -exports.fn3 = fn3; - - -exports.fn4 = function fn4() { - -}; diff --git a/packages/wxa-cli/example/expDFOF/a.js b/packages/wxa-cli/example/expDFOF/a.js deleted file mode 100644 index 23a0ce7e..00000000 --- a/packages/wxa-cli/example/expDFOF/a.js +++ /dev/null @@ -1,13 +0,0 @@ -let num1 = 1; -let num2 = 2; -let obj1 ={ - x: 1, -}; - -function name(params) { - -} - -export default { - -}; diff --git a/packages/wxa-cli/example/expDFOF/index.js b/packages/wxa-cli/example/expDFOF/index.js deleted file mode 100644 index 6be76333..00000000 --- a/packages/wxa-cli/example/expDFOF/index.js +++ /dev/null @@ -1,27 +0,0 @@ - - -export {default} from './a'; - - -/* eslint-disable one-var */ -// 具名导出 -export {a as aa, b, c} from ''; -export * as all from ''; -export function fn1() {} -let o1 = 1, o2=3; -export {o1 as o11, o2}; - -// 默认导出 -// export {default} from '' -// export {a as default} from '' -// export * as default from '' -// export {a as default} -// let p1 = 1 -// export default p1 -// export default 1 -// export default a=1 -// export default function() {} -// export default {} - -// 导出全部 -export * from ''; diff --git a/packages/wxa-cli/example/index.js b/packages/wxa-cli/example/index.js deleted file mode 100644 index abf3bdb1..00000000 --- a/packages/wxa-cli/example/index.js +++ /dev/null @@ -1,131 +0,0 @@ -/* eslint-disable one-var */ -import getAge, {getName as getMyName} from './user'; -import * as user from './user'; -import {getName as tttqw} from './user'; - -import {writeFile, isFile} from './cjs1'; - -writeFile(); -isFile(); - -getName(); - -let ssqqww =1; - -// console.log(user); -console.log(getAge); - -let a = {x: 1}, - n = 1; -let t = 10; -function m(x = 1, y) { - a = 5; - ++a; - t = 9; - t + 5; - let qqq = 10; - let ssqqww =5; - console.log(ssqqww); -} -m(); - -try { - let a = 1; - console.log(a); -} catch (error) { - -} - -let ttt = function({x: xxx, y}) {}; - -let sss = (a, b) => {}; - -[1, 2, 3].forEach(function(item) {}); - - -for (i = 0; i < 100; i++) {} - -class Myclass { - [n] = 1; - [n] = () => {}; -} - -let [zz, xx, cc] = [1, 2, 3]; -let {x: x1} = {x: 1, y2: 2}; - -let {detail: {code, code1}} = {detail: {code: 1}}; - - -let o22=1; -let o11 = o22 =3; - -console.log(o22); - - -let clearErrorMsg = function({p1, p2}, {currentTarget: {dataset: {rule, as, name, opts={}}}}, [asq, ttqw], ppp) { - let asdf='p'; -}; - - -function aaa({p1, p2}) { - let asdwqe='p'; - - function att() { - - } -}; - -aaa(); - - -clearErrorMsg(); - - -mm(); - -function name(params) { - let t = {q: 1}; - let q = 2; - q++; - t.q; -} - - -function aaas() { - name(); -} - -let obj = { - x: 1, - t() {}, -}; - -(function(x, y) {})(); - -// export default { -// x: 1, -// t() { -// }, -// m, -// age, -// }; - -export let qwe=1, rty=2; -export function getName() {} -export function mm() {} - -// export {m as qqqqq, a as default}; - -// export {x, y} from './a'; - -export default class asf {}; - -export {Myclass}; -// eslint-disable-next-line no-var - -export {mm as ttttttt}; - -// export {getName as tttt} from './user'; -// export {default} from './user'; - -// export * as tttttt from './user'; diff --git a/packages/wxa-cli/example/shaking/cjs1.js b/packages/wxa-cli/example/shaking/cjs1.js deleted file mode 100644 index 0bb3741a..00000000 --- a/packages/wxa-cli/example/shaking/cjs1.js +++ /dev/null @@ -1,30 +0,0 @@ -let fn1 = require('./cjs2').fn1; - -fn1(); // Object.defineProperty(exports, '__esModule', { -// value: true, -// }); - -exports.writeFile = writeFile; -exports.isFile = isFile; -module.exports = { - getFiles -}; - -function getFiles(dir = process.cwd(), prefix = '') { - let rst = []; - exports.rst = rst; // exports[aaaa] = aaaa; - // let ttt= require('sss'); - // console.log(ttt); - // exports.addClass; - // module.exports.removeClass; - // exports[rst]; -} // function getConfig() { -// let configPath = _path.default.join(process.cwd(), 'wxa.config.js'); -// let config = require(configPath); -// return config; -// } - - -function writeFile(p, data) {} - -function isFile(p) {} \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/cjs2.js b/packages/wxa-cli/example/shaking/cjs2.js deleted file mode 100644 index f6a7929f..00000000 --- a/packages/wxa-cli/example/shaking/cjs2.js +++ /dev/null @@ -1,3 +0,0 @@ -function fn1(params) {} - -exports.fn1 = fn1; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/index.js b/packages/wxa-cli/example/shaking/index.js deleted file mode 100644 index 1e3e28b4..00000000 --- a/packages/wxa-cli/example/shaking/index.js +++ /dev/null @@ -1,124 +0,0 @@ -/* eslint-disable one-var */ -import getAge from './user'; -import './user'; -import './user'; -import { writeFile, isFile } from './cjs1'; -writeFile(); -isFile(); -getName(); -// console.log(user); -console.log(getAge); -let a = { - x: 1 -}, - n = 1; -let t = 10; - -function m(x = 1, y) { - a = 5; - ++a; - t = 9; - t + 5; - let ssqqww = 5; - console.log(ssqqww); -} - -m(); - -try { - let a = 1; - console.log(a); -} catch (error) {} - -[1, 2, 3].forEach(function (item) {}); - -for (i = 0; i < 100; i++) {} - -class Myclass { - [n] = 1; - [n] = () => {}; -} - -let [zz, xx, cc] = [1, 2, 3]; -let { - x: x1 -} = { - x: 1, - y2: 2 -}; -let { - detail: { - code, - code1 - } -} = { - detail: { - code: 1 - } -}; -let o22 = 1; -let o11 = o22 = 3; -console.log(o22); - -let clearErrorMsg = function ({ - p1, - p2 -}, { - currentTarget: { - dataset: { - rule, - as, - name, - opts = {} - } - } -}, [asq, ttqw], ppp) {}; - -function aaa({ - p1, - p2 -}) {} - -; -aaa(); -clearErrorMsg(); -mm(); -let obj = { - x: 1, - - t() {} - -}; - -(function (x, y) {})(); // export default { -// x: 1, -// t() { -// }, -// m, -// age, -// }; - - -let qwe = 1, - rty = 2; -export { qwe, rty }; - -function getName() {} - -export { getName }; - -function mm() {} - -export { mm }; - -class asf {} - -// export {m as qqqqq, a as default}; -// export {x, y} from './a'; -export default asf; -; -export { Myclass }; // eslint-disable-next-line no-var - -export { mm as ttttttt }; // export {getName as tttt} from './user'; -// export {default} from './user'; -// export * as tttttt from './user'; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/user.js b/packages/wxa-cli/example/shaking/user.js deleted file mode 100644 index dce4848e..00000000 --- a/packages/wxa-cli/example/shaking/user.js +++ /dev/null @@ -1,13 +0,0 @@ -import './user2'; -export {}; - -function getAge(params) {} - -export default getAge; // let a =1; -// export default a; -// eslint-disable-next-line one-var - -export {}; -export {}; -export {}; -export {} from './user2'; \ No newline at end of file diff --git a/packages/wxa-cli/example/shaking/user2.js b/packages/wxa-cli/example/shaking/user2.js deleted file mode 100644 index f4e5405f..00000000 --- a/packages/wxa-cli/example/shaking/user2.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -export {}; \ No newline at end of file diff --git a/packages/wxa-cli/example/test.js b/packages/wxa-cli/example/test.js deleted file mode 100644 index d88b550f..00000000 --- a/packages/wxa-cli/example/test.js +++ /dev/null @@ -1,58 +0,0 @@ -/* eslint-disable one-var */ - -let obj = {x: 1}, - num1 = 1; -let num2 = 10; -let str1 = 'a'; -function m() { - num1 = 5; - ++num2; - let qqq = 10; -} - -m(); - -let fn1 = function() {}; - -let fn2 = () => {}; - -[1, 2, 3].forEach(function(item) {}); - -for (i = 0; i < 100; i++) {} - -class Myclass { - [str1] = 1; - [str1] = () => {}; -} - - -m(); - -function name(params) { - let t = {q: 1}; - let q = 2; - q++; - t.q; -} - - -(function(x, y) {})(); - -getName(); -// export default { -// x: 1, -// t() { -// }, -// m, -// age, -// }; -export * from './user'; -export function getName() {} -// export {m as qqqqq, a as default}; - -// export {x, y} from './a'; - -export default function() {} - -export {Myclass}; -// eslint-disable-next-line no-var diff --git a/packages/wxa-cli/example/user.js b/packages/wxa-cli/example/user.js deleted file mode 100644 index fd96d1ef..00000000 --- a/packages/wxa-cli/example/user.js +++ /dev/null @@ -1,19 +0,0 @@ -import {fn1 as fn11} from './user2'; - -export function getName() {} - -export default function getAge(params) {} - -// let a =1; -// export default a; - -// eslint-disable-next-line one-var -export let mm1 = 1, - c = function mm2(params) {}; - -function fn2(params) {} - -export {fn2}; -export {fn11}; - -export {fn2 as fn22} from './user2'; diff --git a/packages/wxa-cli/example/user2.js b/packages/wxa-cli/example/user2.js deleted file mode 100644 index 3d3f9131..00000000 --- a/packages/wxa-cli/example/user2.js +++ /dev/null @@ -1,8 +0,0 @@ -export function fn1() { - -} - -export function fn2() { - -} - diff --git a/packages/wxa-cli/src/tree-shake/index.js b/packages/wxa-cli/src/tree-shake/index.js index 69e13006..acf7c7f7 100644 --- a/packages/wxa-cli/src/tree-shake/index.js +++ b/packages/wxa-cli/src/tree-shake/index.js @@ -32,20 +32,3 @@ function treeShake(options = {}) { module.exports = { treeShake, }; - -// console.time('end'); -// let path = require('path'); -// const {writeFile} = require('./util'); -// let entrySrc = path.resolve(__dirname, '../../example/index.js'); -// let files = treeShake({ -// entry: [{src: entrySrc}], -// commonJS: {enable: true}, -// }); - -// Object.values(files).forEach(({src, formattedCode}) => { -// writeFile( -// path.resolve(path.dirname(src), './shaking', path.basename(src)), -// formattedCode -// ); -// }); -// console.timeEnd('end'); diff --git a/packages/wxa-cli/src/tree-shake/scope.js b/packages/wxa-cli/src/tree-shake/scope.js deleted file mode 100644 index 3ab6c0df..00000000 --- a/packages/wxa-cli/src/tree-shake/scope.js +++ /dev/null @@ -1,53 +0,0 @@ -class Scope { - constructor(options) { - options = options || {}; - - this.parent = options.parent; - this.depth = this.parent ? this.parent.depth + 1 : 0; - this.names = options.params || []; - this.nodes = {}; - this.isBlockScope = !!options.block; - this.children = []; - - if (this.parent) { - this.parent.children.push(this); - } - } - // 添加变量名 - // isBlockDeclaration 是否是块级声明:let const class import - add(node, name, isBlockDeclaration) { - if (!isBlockDeclaration && this.isBlockScope) { - // it's a `var` or function declaration, and this - // is a block scope, so we need to go up - this.parent.add(node, name, isBlockDeclaration); - } else { - this.names.push(name); - // 变量名可能重复,两个var声明同一变量 - if (this.nodes[name]) { - this.nodes[name].push(node); - } else { - this.nodes[name] = [node]; - } - } - } - - contains(name) { - return !!this.findDefiningScope(name); - } - - findDefiningScope(name) { - if (this.names.includes(name)) { - return this; - } - - if (this.parent) { - return this.parent.findDefiningScope(name); - } - - return null; - } -} - -module.exports = { - Scope, -}; diff --git a/packages/wxa-cli/src/tree-shake/test.js b/packages/wxa-cli/src/tree-shake/test.js deleted file mode 100644 index e1a47575..00000000 --- a/packages/wxa-cli/src/tree-shake/test.js +++ /dev/null @@ -1,25 +0,0 @@ -const generate = require('@babel/generator').default; -const traverse = require('@babel/traverse').default; -const {parse} = require('@babel/parser'); -let code = ``; - -code = ` -let a = require('/a'); - -a.x; -a.y; -a.default.u - -let n ='n'; -a[n]; - -let b = a;`; - -let ast = parse(code, {sourceType: 'unambiguous'}); -traverse(ast, { - enter(path) { - let scope = path.scope; - console.log(path.scope); - }, -}); - From 7c089325ce6fc0b95b8c19d532f5552e17694f23 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Wed, 14 Jul 2021 19:57:57 +0800 Subject: [PATCH 17/20] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/wxa-cli/package.json | 1 - packages/wxa-cli/src/my.html | 18 ------------------ 2 files changed, 19 deletions(-) delete mode 100644 packages/wxa-cli/src/my.html diff --git a/packages/wxa-cli/package.json b/packages/wxa-cli/package.json index ce86f769..f5697804 100644 --- a/packages/wxa-cli/package.json +++ b/packages/wxa-cli/package.json @@ -30,7 +30,6 @@ "babel-eslint": "^9.0.0", "eslint": "^4.15.0", "eslint-config-google": "^0.9.1", - "reserved-words": "^0.1.2", "semver": "^5.5.0", "webpack": "^4.28.3", "webpack-cli": "^3.2.0" diff --git a/packages/wxa-cli/src/my.html b/packages/wxa-cli/src/my.html deleted file mode 100644 index ae101b94..00000000 --- a/packages/wxa-cli/src/my.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - From e67ecb9cdeb473c9fd1255a05bba608b8bc978f1 Mon Sep 17 00:00:00 2001 From: sparklinm Date: Thu, 15 Jul 2021 17:29:58 +0800 Subject: [PATCH 18/20] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0lodash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 6 +++--- package.json | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39ffa5c1..0a6689c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12136,9 +12136,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz?cache=0&sync_timestamp=1613835838133&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=" }, "lodash._reinterpolate": { "version": "3.0.0", diff --git a/package.json b/package.json index 1931445b..b080ba25 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ }, "dependencies": { "@vuepress/theme-default": "^1.5.4", + "lodash": "^4.17.21", "vue-server-renderer": "^2.6.12" } } From 47b823d378df350a0c7648bd2bbb9a71580197ab Mon Sep 17 00:00:00 2001 From: sparklinm Date: Sun, 1 Aug 2021 17:21:20 +0800 Subject: [PATCH 19/20] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 2119e171beb72c2fc1e3f2b871a4e872d24da02b Mon Sep 17 00:00:00 2001 From: sparklinm Date: Fri, 25 Mar 2022 17:49:38 +0800 Subject: [PATCH 20/20] =?UTF-8?q?fix:=20=E6=98=AF=E5=90=A6=E5=BC=80?= =?UTF-8?q?=E5=90=AF=20tree-shake=20=E5=8F=AF=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cli/configuration.md | 7 +++++++ packages/wxa-cli/src/const/wxaConfigs.js | 1 + packages/wxa-cli/src/schedule.js | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/cli/configuration.md b/docs/cli/configuration.md index 4cccd109..ba758530 100644 --- a/docs/cli/configuration.md +++ b/docs/cli/configuration.md @@ -153,6 +153,13 @@ module.exports = { ### optimization.allowEmptyAttributes 是否允许空属性,默认 `true`,不要改动该配置,除非你清楚自己要做什么:warning:。 +## treeShake + +- **类型**: `Boolean` default: `false` +- **用法**: + +是否开启 `tree-shake` 。只有为 `true` 且非 `watch` 模式下 `tree-shake` 才会生效。 + ## plugins 目前支持的插件有: diff --git a/packages/wxa-cli/src/const/wxaConfigs.js b/packages/wxa-cli/src/const/wxaConfigs.js index ba15a1c4..a7e3a716 100644 --- a/packages/wxa-cli/src/const/wxaConfigs.js +++ b/packages/wxa-cli/src/const/wxaConfigs.js @@ -46,6 +46,7 @@ export default class DefaultWxaConfigs { allowEmptyAttributes: true, transformPxToRpx: false, }, + treeShake: false, }; } } diff --git a/packages/wxa-cli/src/schedule.js b/packages/wxa-cli/src/schedule.js index 69adf0ac..cc4ff15f 100644 --- a/packages/wxa-cli/src/schedule.js +++ b/packages/wxa-cli/src/schedule.js @@ -141,7 +141,7 @@ class Schedule { while (this.$depPending.length) { let dep = this.$depPending.shift(); - if (!this.cmdOptions.watch && dep.src.endsWith('.js')) { + if (this.wxaConfigs.treeShake && !this.cmdOptions.watch && dep.src.endsWith('.js')) { this.$depJsPending.push(dep); } else { tasks.push(this.$parse(dep)); @@ -154,7 +154,7 @@ class Schedule { if (this.$depPending.length === 0) { // dependencies resolve complete - if (!this.cmdOptions.watch) { + if (this.wxaConfigs.treeShake && !this.cmdOptions.watch) { let sub = await this.$dojsDPA(); return succ.concat(sub); }