diff --git a/package-lock.json b/package-lock.json index 36b319b..9d97b13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,232 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@mapbox/node-pre-gyp": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/@mapbox/node-pre-gyp/download/@mapbox/node-pre-gyp-1.0.4.tgz", + "integrity": "sha1-bHbnpAE46sOeGk3IaaCD5D4jbAA=", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz", + "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-5.0.0.tgz", + "integrity": "sha1-4qkFQqu2inYuCghQ9sntrf2FBrI=", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/mkdirp/download/mkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.5.tgz", + "integrity": "sha1-QnNVN9fwgKfl94tsVJtxRr4XQv0=", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz?cache=0&sync_timestamp=1591175021598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", + "requires": { + "glob": "^7.1.3" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.nlark.com/tar/download/tar-6.1.11.tgz?cache=0&sync_timestamp=1629994598621&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftar%2Fdownload%2Ftar-6.1.11.tgz", + "integrity": "sha1-Z2CjjwA6+hsv/Q/+npq70Oqz1iE=", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "@tensorflow/tfjs": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs/download/@tensorflow/tfjs-3.9.0.tgz", + "integrity": "sha1-/zvL/LUYAOpnkdenoCDTVJCdLHE=", + "requires": { + "@tensorflow/tfjs-backend-cpu": "3.9.0", + "@tensorflow/tfjs-backend-webgl": "3.9.0", + "@tensorflow/tfjs-converter": "3.9.0", + "@tensorflow/tfjs-core": "3.9.0", + "@tensorflow/tfjs-data": "3.9.0", + "@tensorflow/tfjs-layers": "3.9.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" + } + }, + "@tensorflow/tfjs-backend-cpu": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-backend-cpu/download/@tensorflow/tfjs-backend-cpu-3.9.0.tgz", + "integrity": "sha1-J+5YGkdlA56w6E2dRzttXydpyBM=", + "requires": { + "@types/seedrandom": "2.4.27", + "seedrandom": "2.4.3" + } + }, + "@tensorflow/tfjs-backend-webgl": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-backend-webgl/download/@tensorflow/tfjs-backend-webgl-3.9.0.tgz", + "integrity": "sha1-EDYw4j1DJUkr++L/ZbWMJK2FI3c=", + "requires": { + "@tensorflow/tfjs-backend-cpu": "3.9.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "@types/webgl2": "0.0.5", + "seedrandom": "2.4.3" + } + }, + "@tensorflow/tfjs-converter": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-converter/download/@tensorflow/tfjs-converter-3.9.0.tgz", + "integrity": "sha1-4AcJACy+BP9cxDNY1KVmJ5VRMHE=" + }, + "@tensorflow/tfjs-core": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-core/download/@tensorflow/tfjs-core-3.9.0.tgz", + "integrity": "sha1-XKI1ahSlgmOECm48ruJGd4DblFA=", + "requires": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "2.4.3" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.5.tgz", + "integrity": "sha1-QnNVN9fwgKfl94tsVJtxRr4XQv0=", + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, + "@tensorflow/tfjs-data": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-data/download/@tensorflow/tfjs-data-3.9.0.tgz", + "integrity": "sha1-nLT9YwHENiqOfcA7ztVjvfHwvhk=", + "requires": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.5.tgz", + "integrity": "sha1-QnNVN9fwgKfl94tsVJtxRr4XQv0=", + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, + "@tensorflow/tfjs-layers": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-layers/download/@tensorflow/tfjs-layers-3.9.0.tgz", + "integrity": "sha1-DgURa81/Ves5z/Mi6ZQPpGyfvaI=" + }, + "@tensorflow/tfjs-node": { + "version": "3.9.0", + "resolved": "https://registry.nlark.com/@tensorflow/tfjs-node/download/@tensorflow/tfjs-node-3.9.0.tgz", + "integrity": "sha1-WzwErqqhIMRmwOdGYn2yOZOHQ8s=", + "requires": { + "@mapbox/node-pre-gyp": "1.0.4", + "@tensorflow/tfjs": "3.9.0", + "adm-zip": "^0.5.2", + "google-protobuf": "^3.9.2", + "https-proxy-agent": "^2.2.1", + "progress": "^2.0.0", + "rimraf": "^2.6.2", + "tar": "^4.4.6" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.nlark.com/@types/long/download/@types/long-4.0.1.tgz", + "integrity": "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek=" + }, + "@types/node": { + "version": "16.11.1", + "resolved": "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.1.tgz?cache=0&sync_timestamp=1634443414534&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-16.11.1.tgz", + "integrity": "sha1-LlCmSaUPxANDOhT4Ke+s4aNEPpc=" + }, + "@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.nlark.com/@types/node-fetch/download/@types/node-fetch-2.5.12.tgz", + "integrity": "sha1-im93mx1OYLelf7b9SNhPtUW5zGY=", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/offscreencanvas": { + "version": "2019.3.0", + "resolved": "https://registry.nlark.com/@types/offscreencanvas/download/@types/offscreencanvas-2019.3.0.tgz", + "integrity": "sha1-MzZCjsfpGAz0Vm3+pdoE61hqZVM=" + }, + "@types/seedrandom": { + "version": "2.4.27", + "resolved": "https://registry.nlark.com/@types/seedrandom/download/@types/seedrandom-2.4.27.tgz", + "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" + }, + "@types/webgl-ext": { + "version": "0.0.30", + "resolved": "https://registry.nlark.com/@types/webgl-ext/download/@types/webgl-ext-0.0.30.tgz", + "integrity": "sha1-DOSYwWpBoj0VKJ4LhE2UWyXw+50=" + }, + "@types/webgl2": { + "version": "0.0.5", + "resolved": "https://registry.nlark.com/@types/webgl2/download/@types/webgl2-0.0.5.tgz", + "integrity": "sha1-3ZJeIKuKzoDrSx5G/aWxCcUI+w0=" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -13,11 +239,84 @@ "negotiator": "0.6.2" } }, + "adm-zip": { + "version": "0.5.9", + "resolved": "https://registry.npmmirror.com/adm-zip/download/adm-zip-0.5.9.tgz", + "integrity": "sha1-szaRAoMzghwM+VwxN0xUYvKQWoM=" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-6.0.2.tgz?cache=0&sync_timestamp=1603480100923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagent-base%2Fdownload%2Fagent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz", + "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + }, + "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?cache=0&sync_timestamp=1630592923226&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fare-we-there-yet%2Fdownload%2Fare-we-there-yet-1.1.7.tgz", + "integrity": "sha1-sVR0qTKtq0/4pQ2a36fk6SbyEUY=", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "requires": { + "sprintf-js": "~1.0.2" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -43,11 +342,110 @@ "type-is": "~1.6.17" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-2.0.0.tgz", + "integrity": "sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-7.0.4.tgz?cache=0&sync_timestamp=1604880033053&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "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=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "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=" + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -71,6 +469,16 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmmirror.com/core-js/download/core-js-3.18.3.tgz?cache=0&sync_timestamp=1634062619940&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcore-js%2Fdownload%2Fcore-js-3.18.3.tgz", + "integrity": "sha1-hqC7otjsPfhg/vzAeo0Rl3nwFQk=" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz", + "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -79,6 +487,16 @@ "ms": "2.0.0" } }, + "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=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -89,29 +507,44 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/detect-libc/download/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/es6-promisify/download/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567224085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -173,6 +606,16 @@ "unpipe": "~1.0.0" } }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-3.0.1.tgz", + "integrity": "sha1-69U3kbeDVqma+aMA1CgsTV65dV8=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -183,6 +626,67 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz", + "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.nlark.com/gauge/download/gauge-2.7.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fgauge%2Fdownload%2Fgauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "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" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz?cache=0&sync_timestamp=1632353796482&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob%2Fdownload%2Fglob-7.2.0.tgz", + "integrity": "sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "google-protobuf": { + "version": "3.19.0", + "resolved": "https://registry.npmmirror.com/google-protobuf/download/google-protobuf-3.19.0.tgz", + "integrity": "sha1-l/R0MjyS8Z/Wc3rxu3kuOWmR4Lg=" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "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=" + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -195,6 +699,38 @@ "toidentifier": "1.0.0" } }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/https-proxy-agent/download/https-proxy-agent-2.2.4.tgz", + "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/agent-base/download/agent-base-4.3.0.tgz?cache=0&sync_timestamp=1603480100923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fagent-base%2Fdownload%2Fagent-base-4.3.0.tgz", + "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.nlark.com/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1625374675284&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=" + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -203,6 +739,15 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -213,18 +758,64 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "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", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "version": "3.0.0", + "resolved": "https://registry.nlark.com/isomorphic-fetch/download/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha1-AmewBQSQRtJCEgchXUXWomK4uLQ=", + "requires": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/node-fetch/download/node-fetch-2.6.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.5.tgz", + "integrity": "sha1-QnNVN9fwgKfl94tsVJtxRr4XQv0=", + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/long/download/long-4.0.0.tgz", + "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" + } } }, "media-typer": { @@ -260,12 +851,37 @@ "mime-db": "1.40.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.nlark.com/minipass/download/minipass-3.1.5.tgz?cache=0&sync_timestamp=1631656307506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminipass%2Fdownload%2Fminipass-3.1.5.tgz", + "integrity": "sha1-cfYlGwozpJwBs8+X/3ftoDDf9zI=", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/minizlib/download/minizlib-2.1.2.tgz", + "integrity": "sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE=", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -297,15 +913,35 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-5.0.0.tgz?cache=0&sync_timestamp=1597649993026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-5.0.0.tgz", + "integrity": "sha1-UwlCu1ilEvzK/lP+IQ8TolNV3Ig=", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/npmlog/download/npmlog-4.1.2.tgz", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz?cache=0&sync_timestamp=1617776101309&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnumber-is-nan%2Fdownload%2Fnumber-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1571657171505&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -319,16 +955,44 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=" + }, + "promise-sequence": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/promise-sequence/download/promise-sequence-1.0.0.tgz", + "integrity": "sha1-2bzJB/eib46r1MRh1tXagwcMcX4=" + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -359,6 +1023,38 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz", + "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1591175021598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "requires": { + "glob": "^7.1.3" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -369,6 +1065,19 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "seedrandom": { + "version": "2.4.3", + "resolved": "https://registry.npm.taobao.org/seedrandom/download/seedrandom-2.4.3.tgz", + "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "requires": { + "lru-cache": "^6.0.0" + } + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -407,21 +1116,144 @@ "send": "0.17.1" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.5.tgz", + "integrity": "sha1-nj6MwMdamUcrRDIQM6dwLnc4JS8=" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703342506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.nlark.com/tar/download/tar-4.4.19.tgz?cache=0&sync_timestamp=1629994598621&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftar%2Fdownload%2Ftar-4.4.19.tgz", + "integrity": "sha1-Lk1yY98m8rkU3uEMglqxMhI3QvM=", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", + "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.7.tgz", + "integrity": "sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=", + "requires": { + "minipass": "^2.6.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1584060927134&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.nlark.com/minipass/download/minipass-2.9.0.tgz?cache=0&sync_timestamp=1631656307506&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminipass%2Fdownload%2Fminipass-2.9.0.tgz", + "integrity": "sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/minizlib/download/minizlib-1.3.3.tgz", + "integrity": "sha1-IpDeloGKNMKVUcio0wEha9Zahh0=", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.nlark.com/mkdirp/download/mkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "requires": { + "minimist": "^1.2.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1589129010497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=" + } + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/download/tr46-0.0.3.tgz?cache=0&sync_timestamp=1633302360065&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftr46%2Fdownload%2Ftr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -436,6 +1268,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -446,10 +1283,136 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/webidl-conversions/download/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + "version": "3.6.2", + "resolved": "https://registry.npm.taobao.org/whatwg-fetch/download/whatwg-fetch-3.6.2.tgz", + "integrity": "sha1-3O0k838mJO0CgXJdUdDi4/5nf4w=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/download/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/wide-align/download/wide-align-1.1.5.tgz?cache=0&sync_timestamp=1634307502489&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwide-align%2Fdownload%2Fwide-align-1.1.5.tgz", + "integrity": "sha1-3x1MIGhUNp7PPJpImPGyP72dFdM=", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-5.0.8.tgz?cache=0&sync_timestamp=1617822684820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/download/yargs-16.2.0.tgz?cache=0&sync_timestamp=1632604912933&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs%2Fdownload%2Fyargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.nlark.com/yargs-parser/download/yargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=" }, "zlib": { "version": "1.0.5", diff --git a/package.json b/package.json index ecc23f8..348a0da 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,9 @@ "download:yolo": "node ./scripts/download-models/index.js yolo", "download:posenet": "node ./scripts/download-models/index.js posenet", "download:posenet2": "node ./scripts/download-models/index.js posenet2", + "download:handpose": "node ./scripts/download-models/index.js handpose", "download:all": "node ./scripts/download-models/index.js all", + "download": "node ./scripts/download-models/index.js", "serve": "node ./index.js" }, "repository": { @@ -29,10 +31,13 @@ }, "homepage": "https://github.com/ml5js/ml5-data-and-models-server#readme", "dependencies": { + "@tensorflow/tfjs-converter": "^3.9.0", + "@tensorflow/tfjs-node": "^3.9.0", "es6-promise": "^4.2.8", "express": "^4.17.1", - "isomorphic-fetch": "^2.2.1", - "morgan": "^1.9.1" + "isomorphic-fetch": "^3.0.0", + "morgan": "^1.9.1", + "promise-sequence": "^1.0.0" }, "devDependencies": { "mkdirp": "^0.5.1", diff --git a/scripts/download-models/Handpose/index.js b/scripts/download-models/Handpose/index.js new file mode 100644 index 0000000..4157467 --- /dev/null +++ b/scripts/download-models/Handpose/index.js @@ -0,0 +1,23 @@ +require('isomorphic-fetch'); +const mkdirp = require('mkdirp'); +const tfconv = require('@tensorflow/tfjs-converter'); +const fs = require('fs') + +require('@tensorflow/tfjs-node'); + + +const STORAGEPATH = 'https://tfhub.dev/mediapipe/tfjs-model/handdetector/1/default/1'; +const OUTPATH = './models/handpose'; + +async function downloadHandpose() { + mkdirp.sync(OUTPATH); + console.log(`Output directory created at: ${OUTPATH}`); + if (!fs.existsSync(`${OUTPATH}/model.json`) || !fs.existsSync(`${OUTPATH}/weights.bin`)) { + const model = await tfconv.loadGraphModel(STORAGEPATH, {fromTFHub: true}); + await model.save(`file://${OUTPATH}/`); + } else { + console.log('handpose model already exists') + } +} + +module.exports = downloadHandpose diff --git a/scripts/download-models/Mobilenet/index.js b/scripts/download-models/Mobilenet/index.js index 3cdfe72..aa60726 100644 --- a/scripts/download-models/Mobilenet/index.js +++ b/scripts/download-models/Mobilenet/index.js @@ -29,7 +29,7 @@ async function getMobilenetByVersion(mobilenetVersion) { // set the output folders const mobilenetOutputFolder = `./models/mobilenet/${imagenetMeta.outputFolderRoot}`; const imagenetOutputFolder = `./models/mobilenet/${imagenetMeta.outputFolderImagenet}` - + // create new downloader utils const mobilenetDownloader = new DownloaderUtils(mobilenetStoragePath, mobilenetOutputFolder) const imagenetDownloader = new DownloaderUtils(imagenetStoragePath, imagenetOutputFolder) @@ -37,7 +37,7 @@ async function getMobilenetByVersion(mobilenetVersion) { // NOTE: paths are relative to where the script is being called mobilenetDownloader.makeOutputPath(); imagenetDownloader.makeOutputPath(); - + // get the modelJson const modelJson = await mobilenetDownloader.saveJson('model.json'); @@ -50,9 +50,8 @@ async function getMobilenetByVersion(mobilenetVersion) { const labelArray = Object.values(IMAGENET_CLASSES).map( (item) => item); const metadataJson = {labels: labelArray} - await fs.writeFile(`${mobilenetOutputFolder}/metadata.json`, JSON.stringify(metadataJson), () => { - console.log(`finished writing: metadata.json`) - }); + fs.writeFileSync(`${mobilenetOutputFolder}/metadata.json`, JSON.stringify(metadataJson)); + console.log(`finished writing: metadata.json`) } @@ -80,4 +79,4 @@ function getImagenetPath(mobilenetVersion) { -module.exports = downloadMobilenet \ No newline at end of file +module.exports = downloadMobilenet diff --git a/scripts/download-models/Posenet/index.js b/scripts/download-models/Posenet/index.js index 4798117..d0a47ba 100644 --- a/scripts/download-models/Posenet/index.js +++ b/scripts/download-models/Posenet/index.js @@ -33,21 +33,26 @@ async function getWeights(storagePath, outputPath, manifest){ const weightsPromiseArray = keys.map( async(prop) => { const fileName = manifest[prop].filename; let weightFile; - + const weightUrl = `${storagePath}/${fileName}`; + const localFilePath = `${outputPath}/${fileName}`; - weightFile = await fetch(weightUrl); - weightFile = await weightFile.buffer(); + if (!fs.existsSync(localFilePath)) { + weightFile = await fetch(weightUrl); + weightFile = await weightFile.buffer(); - fs.writeFile(`${outputPath}/${fileName}`, weightFile, () => { - console.log(`finished writing: ${fileName}`) - }); + fs.writeFile(localFilePath, weightFile, () => { + console.log(`finished writing: ${fileName}`) + }); + } else { + console.log('weight already exists: ', fileName) + } }) - + Promise.all(weightsPromiseArray) } -module.exports = downloadPosenet \ No newline at end of file +module.exports = downloadPosenet diff --git a/scripts/download-models/Posenet2/index.js b/scripts/download-models/Posenet2/index.js index 73be657..4b11a9b 100644 --- a/scripts/download-models/Posenet2/index.js +++ b/scripts/download-models/Posenet2/index.js @@ -28,25 +28,24 @@ const RESNET_STORAGE_PATH = `https://storage.googleapis.com/tfjs-models/savedmod async function downloadPosenet() { // mobilenet // quant 1 - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/050`, `MOBILENETV1_050_quant1_stride8`, `model-stride8.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/050`, `MOBILENETV1_050_quant1_stride16`, `model-stride16.json`); - - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/075`, `MOBILENETV1_075_quant1_stride8`, `model-stride8.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/075`, `MOBILENETV1_075_quant1_stride16`, `model-stride16.json`); - - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/100`, `MOBILENETV1_100_quant1_stride8`, `model-stride8.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/100`, `MOBILENETV1_100_quant1_stride16`, `model-stride16.json`); - + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/050`, `MOBILENETV1_050_quant1_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/050`, `MOBILENETV1_050_quant1_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/075`, `MOBILENETV1_075_quant1_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/075`, `MOBILENETV1_075_quant1_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/100`, `MOBILENETV1_100_quant1_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/100`, `MOBILENETV1_100_quant1_stride16`, `model-stride16.json`); // // quant 2 - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/050`, `MOBILENETV1_050_quant2_stride8`, `model-stride8.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/050`, `MOBILENETV1_050_quant2_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/050`, `MOBILENETV1_050_quant2_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/050`, `MOBILENETV1_050_quant2_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/075`, `MOBILENETV1_075_quant2_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/075`, `MOBILENETV1_075_quant2_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/100`, `MOBILENETV1_100_quant2_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/100`, `MOBILENETV1_100_quant2_stride16`, `model-stride16.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/075`, `MOBILENETV1_075_quant2_stride8`, `model-stride8.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/075`, `MOBILENETV1_075_quant2_stride16`, `model-stride16.json`); - - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/100`, `MOBILENETV1_100_quant2_stride8`, `model-stride8.json`); - getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${2}/100`, `MOBILENETV1_100_quant2_stride16`, `model-stride16.json`); + // quant4 + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/float/050`, `MOBILENETV1_050_quant4_stride8`, `model-stride8.json`); + await getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/float/075`, `MOBILENETV1_075_quant4_stride16`, `model-stride16.json`); // TODO: not working v101 and quant4 // getPosenetByVersion(`${MOBILENET_STORAGE_PATH}/quant${1}/101`, `MOBILENETV1_101_quant1_stride8`, `model-stride8.json`); @@ -55,16 +54,12 @@ async function downloadPosenet() { // resnet50 - getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${1}`, `RESENET50_quant1_stride16`, `model-stride16.json`); - getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${2}`, `RESENET50_quant2_stride16`, `model-stride16.json`); - - getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${1}`, `RESENET50_quant1_stride32`, `model-stride32.json`); - getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${2}`, `RESENET50_quant2_stride32`, `model-stride32.json`); - // TODO: quant4 currently not working - // getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${4}`, `RESENET50_quant4_stride32`, `model-stride32.json`); - - // TODO: quant4 currently not working - // getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${4}`, `RESENET50_quant4_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${1}`, `RESENET50_quant1_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${2}`, `RESENET50_quant2_stride16`, `model-stride16.json`); + await getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${1}`, `RESENET50_quant1_stride32`, `model-stride32.json`); + await getPosenetByVersion(`${RESNET_STORAGE_PATH}/quant${2}`, `RESENET50_quant2_stride32`, `model-stride32.json`); + await getPosenetByVersion(`${RESNET_STORAGE_PATH}/float`, `RESENET50_quant4_stride32`, `model-stride32.json`); + await getPosenetByVersion(`${RESNET_STORAGE_PATH}/float`, `RESENET50_quant4_stride16`, `model-stride16.json`); } async function getPosenetByVersion(STORAGEPATH, OUTPUTDIR, FNAME) { @@ -76,7 +71,7 @@ async function getPosenetByVersion(STORAGEPATH, OUTPUTDIR, FNAME) { posenetDownloader.makeOutputPath(); const posenetManifest = await posenetDownloader.saveJson(FNAME); - console.log(posenetManifest) + // console.log(posenetManifest) await getWeights(storagePath, outputPath, posenetManifest); @@ -93,19 +88,22 @@ async function getWeights(storagePath, outputPath, manifest) { let weightFile; const weightUrl = `${storagePath}/${fileName}`; + const localFilePath = `${outputPath}/${fileName}`; - weightFile = await fetch(weightUrl); - weightFile = await weightFile.buffer(); + if (!fs.existsSync(localFilePath)) { + weightFile = await fetch(weightUrl); + weightFile = await weightFile.buffer(); - fs.writeFile(`${outputPath}/${fileName}`, weightFile, () => { + fs.writeFileSync(localFilePath, weightFile); console.log(`finished writing: ${fileName}`) - }); - + } else { + console.log('weight already exists: ', fileName) + } }) - Promise.all(weightsPromiseArray) + return Promise.all(weightsPromiseArray) } -module.exports = downloadPosenet \ No newline at end of file +module.exports = downloadPosenet diff --git a/scripts/download-models/SketchRNN/index.js b/scripts/download-models/SketchRNN/index.js index 7a85e03..4d398f1 100644 --- a/scripts/download-models/SketchRNN/index.js +++ b/scripts/download-models/SketchRNN/index.js @@ -1,5 +1,7 @@ require('es6-promise').polyfill(); require('isomorphic-fetch'); + +const sequence = require('promise-sequence'); const fs = require('fs'); const mkdirp = require('mkdirp'); const modelList = require('./modelList'); @@ -15,19 +17,24 @@ async function downloadSketchRnn(){ mkdirp.sync(outputFolder); // console.log(modelList) - Promise.all( - modelList.map( async (modelName) => { - const fileName = `${modelName}.gen.json` - let modelJson = await fetch(`${STORAGEPATH}/${fileName}`); - modelJson = await modelJson.json(); + await sequence( + modelList.map( (modelName) => async () => { + const fileName = `${modelName}.gen.json`; + const localFilePath = `${outputFolder}/${fileName}`; + const url = `${STORAGEPATH}/${fileName}` + if (!fs.existsSync(localFilePath)) { + let modelJson = await fetch(url); + modelJson = await modelJson.json(); - fs.writeFile(`${outputFolder}/${fileName}`, JSON.stringify(modelJson), () => { + fs.writeFileSync(`${outputFolder}/${fileName}`, JSON.stringify(modelJson)); console.log('finished writing: ', fileName) - }); + } else { + console.log('already exists: ', fileName) + } }) ) - + } -module.exports = downloadSketchRnn; \ No newline at end of file +module.exports = downloadSketchRnn; diff --git a/scripts/download-models/index.js b/scripts/download-models/index.js index 8f737bf..6eef267 100644 --- a/scripts/download-models/index.js +++ b/scripts/download-models/index.js @@ -1,60 +1,43 @@ -const downloadBodyPix = require('./BodyPix'); -const downloadSketchRnn = require('./SketchRnn'); -const downloadUNet = require('./UNet'); -const downloadSentiment = require('./Sentiment'); -const downloadFaceApi = require('./FaceApi'); -const downloadSoundClassification = require('./SoundClassification'); -const downloadMobilenet = require('./Mobilenet'); -const downloadYolo = require('./YOLO'); -const downloadPosenet = require('./Posenet'); -const downloadPosenet2 = require('./Posenet2'); +const sequence = require('promise-sequence'); -const selected = process.argv[2]; -console.log(selected.toLowerCase()); +const modelDownloaders = { + bodypix : require('./BodyPix'), + sketchrnn : require('./SketchRNN'), + unet : require('./UNet'), + sentiment : require('./Sentiment'), + faceapi : require('./FaceApi'), + soundclassification : require('./SoundClassification'), + mobilenet : require('./Mobilenet'), + yolo : require('./YOLO'), + posenet : require('./Posenet'), + posenet2 : require('./Posenet2'), + handpose : require('./Handpose'), +} -switch (selected.toLowerCase()) { - case 'bodypix': - downloadBodyPix(); - return; - case 'sketchrnn': - downloadSketchRnn(); - return; - case 'unet': - downloadUNet(); - return; - case 'sentiment': - downloadSentiment(); - return; - case 'faceapi': - downloadFaceApi(); - return; - case 'soundclassification': - downloadSoundClassification(); - return; - case 'mobilenet': - downloadMobilenet(); - return; - case 'yolo': - downloadYolo(); - return; - case 'posenet': - downloadPosenet(); - return; - case 'posenet2': - downloadPosenet2(); - return; - case 'all': - downloadBodyPix(); - downloadSketchRnn(); - downloadSentiment(); - downloadFaceApi(); - downloadSoundClassification(); - downloadMobilenet(); - downloadYolo(); - downloadPosenet(); - downloadPosenet2(); - return; - default: - console.log("nothing selected!") - return; -} \ No newline at end of file +const selected = process.argv.length >=3 && process.argv[2]?.toLowerCase() || 'all'; +console.log(selected); + +async function download(model) { + const dn = modelDownloaders[model]; + if (dn) { + console.log(`downloading ${model}...`) + await dn(); + console.log(`downloaded ${model}\n`) + } else { + console.log(`no such ${model} to download`); + } +} + +(async () => { + if (selected == 'all') { + const tasks = Object.keys(modelDownloaders).map(model => { + return download.bind(undefined, model); + }) + await sequence(tasks); + } else { + await download(selected); + } +})().catch(e => { + // Deal with the fact the chain failed + console.log(e) +}); diff --git a/scripts/download-models/utils/index.js b/scripts/download-models/utils/index.js index ff88db7..24005fe 100644 --- a/scripts/download-models/utils/index.js +++ b/scripts/download-models/utils/index.js @@ -17,18 +17,30 @@ class DownloaderUtils { async saveJson(jsonFileWithPath) { let modelJson; + const url = `${this.STORAGEPATH}/${jsonFileWithPath}`; + const localFilePath = `${this.OUTPUTFOLDER}/${jsonFileWithPath}`; + if (fs.existsSync(localFilePath)) { + modelJson = fs.readFileSync(localFilePath); + try { + modelJson = JSON.parse(modelJson); + console.log('already exists: ', jsonFileWithPath); + return modelJson; + } catch (error) { + console.log(`json parse local file: ${localFilePath} error, so try fetch again`); + } + } // jsonFileWithPath should be `model.json` or `manifest.json` or similar - modelJson = await fetch(`${this.STORAGEPATH}/${jsonFileWithPath}`) + modelJson = await fetch(url); modelJson = await modelJson.json(); - fs.writeFile(`${this.OUTPUTFOLDER}/${jsonFileWithPath}`, JSON.stringify(modelJson), () => { - console.log(`finished writing ${jsonFileWithPath}`) - }); + fs.writeFileSync(localFilePath, JSON.stringify(modelJson)); + console.log(`finished writing ${jsonFileWithPath}`) return modelJson; } async saveWeights(modelJson) { + const tasks = []; if (!modelJson.hasOwnProperty('weightsManifest')) { console.log("no weightsManifest property found - checking modelJson for path property"); @@ -39,12 +51,10 @@ class DownloaderUtils { if (!weights.hasOwnProperty('paths')) return; // get an array of promises of the weights - const weightsPromiseArray = weights.paths.map((fileName) => this.saveWeight(fileName)); - - // call and wait for all those promises to finish - Promise.all(weightsPromiseArray) - + weights.paths.forEach((fileName) => tasks.push(this.saveWeight(fileName))); }) + // call and wait for all those promises to finish + await Promise.all(tasks); return; } @@ -57,28 +67,32 @@ class DownloaderUtils { modelJson.weightsManifest.forEach((weights) => { // get an array of promises of the weights - const weightsPromiseArray = weights.paths.map((fileName) => this.saveWeight(fileName)); + weights.paths.forEach((fileName) => tasks.push(this.saveWeight(fileName))); - // call and wait for all those promises to finish - Promise.all(weightsPromiseArray) }) + // call and wait for all those promises to finish + Promise.all(tasks) } async saveWeight(fileName) { let weightFile; const weightUrl = `${this.STORAGEPATH}/${fileName}`; + const localFilePath = `${this.OUTPUTFOLDER}/${fileName}`; + if (!fs.existsSync(localFilePath)) { - weightFile = await fetch(weightUrl); - weightFile = await weightFile.buffer(); + weightFile = await fetch(weightUrl); + weightFile = await weightFile.buffer(); - fs.writeFile(`${this.OUTPUTFOLDER}/${fileName}`, weightFile, () => { + fs.writeFileSync(localFilePath, weightFile); console.log(`finished writing: ${fileName}`) - }); + } else { + console.log('weight already exists: ', fileName) + } } } -// function +// function -module.exports = DownloaderUtils; \ No newline at end of file +module.exports = DownloaderUtils;