diff --git a/package-lock.json b/package-lock.json index b0bbe14..c818ccd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,6 +96,7 @@ "file-loader": "6.2.0", "open": "^8.4.0", "prettier": "2.4.1", + "puppeteer": "^15.4.0", "react-scripts": "^5.0.1", "ts-node": "^10.8.1", "typescript": "4.7.3", @@ -5209,6 +5210,16 @@ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.28.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.28.0.tgz", @@ -6625,6 +6636,55 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/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/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -6893,6 +6953,15 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -7122,6 +7191,12 @@ "fsevents": "~2.3.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.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -7645,6 +7720,57 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8432,6 +8558,12 @@ "node": ">=0.8.0" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1011705", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1011705.tgz", + "integrity": "sha512-OKvTvu9n3swmgYshvsyVHYX0+aPzCoYUnyXUacfQMmFtBtBKewV/gT4I9jkAbpTqtTi2E4S9MXLlvzBDUlqg0Q==", + "dev": true + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -8759,6 +8891,15 @@ "node": ">= 0.8" } }, + "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": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", @@ -10023,6 +10164,41 @@ } ] }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10119,6 +10295,15 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fetch-blob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz", @@ -10623,6 +10808,12 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -14154,6 +14345,12 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14832,6 +15029,12 @@ "node": ">=0.12" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -16353,6 +16556,15 @@ "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/proj4": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.8.0.tgz", @@ -16424,6 +16636,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -16443,11 +16661,66 @@ "safe-buffer": "^5.1.2" } }, + "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/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, + "node_modules/puppeteer": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-15.4.0.tgz", + "integrity": "sha512-wxJRbofjaycCaQ9fhABlToJobrjxlABiFi6NvdkOPVJMYFblxDlDTjkg+b6bZYi7xN+lEXn84GBZsA5DYb3wfw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1011705", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.0" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -18701,6 +18974,18 @@ "node": ">=6" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, "node_modules/tar-js": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/tar-js/-/tar-js-0.3.0.tgz", @@ -18709,6 +18994,36 @@ "node": "*" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/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/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -18878,6 +19193,12 @@ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -19194,6 +19515,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -20486,6 +20841,16 @@ "node": ">=10" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -24047,6 +24412,16 @@ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.28.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.28.0.tgz", @@ -25116,6 +25491,40 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -25334,6 +25743,12 @@ "ieee754": "^1.2.1" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -25492,6 +25907,12 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -25926,6 +26347,48 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "requires": { + "node-fetch": "2.6.7" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -26505,6 +26968,12 @@ "minimist": "^1.2.6" } }, + "devtools-protocol": { + "version": "0.0.1011705", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1011705.tgz", + "integrity": "sha512-OKvTvu9n3swmgYshvsyVHYX0+aPzCoYUnyXUacfQMmFtBtBKewV/gT4I9jkAbpTqtTi2E4S9MXLlvzBDUlqg0Q==", + "dev": true + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -26775,6 +27244,15 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "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, + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", @@ -27705,6 +28183,29 @@ } } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -27791,6 +28292,15 @@ "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "fetch-blob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz", @@ -28151,6 +28661,12 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -30800,6 +31316,12 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -31309,6 +31831,12 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -32263,6 +32791,12 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "proj4": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.8.0.tgz", @@ -32326,6 +32860,12 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -32345,11 +32885,50 @@ "safe-buffer": "^5.1.2" } }, + "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, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, + "puppeteer": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-15.4.0.tgz", + "integrity": "sha512-wxJRbofjaycCaQ9fhABlToJobrjxlABiFi6NvdkOPVJMYFblxDlDTjkg+b6bZYi7xN+lEXn84GBZsA5DYb3wfw==", + "dev": true, + "requires": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1011705", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.0" + }, + "dependencies": { + "ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "dev": true, + "requires": {} + } + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -34093,11 +34672,49 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, "tar-js": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/tar-js/-/tar-js-0.3.0.tgz", "integrity": "sha1-aUmqv7C6GLsVYq5RpDn9DzAYOhc=" }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "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, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -34209,6 +34826,12 @@ "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -34441,6 +35064,28 @@ "which-boxed-primitive": "^1.0.2" } }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -35449,6 +36094,16 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 5296033..870819b 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "file-loader": "6.2.0", "open": "^8.4.0", "prettier": "2.4.1", + "puppeteer": "^15.4.0", "react-scripts": "^5.0.1", "ts-node": "^10.8.1", "typescript": "4.7.3", @@ -129,6 +130,7 @@ "build:component": "webpack --mode=production", "compile:types": "tsc --project tsconfig.lib.json --emitDeclarationOnly --declaration", "test": "react-scripts test", + "test:ui": "node ui-test/index.js", "serve": "node ./serve.js", "depcheck": "depcheck .", "lint": "eslint --fix \"src/**/*.ts\" \"src/**/*.tsx\" && prettier --write \"src/**/*.ts\" \"src/**/*.tsx\"", diff --git a/src/utils/file.ts b/src/utils/file.ts index 40fd8a0..7e8a742 100644 --- a/src/utils/file.ts +++ b/src/utils/file.ts @@ -88,7 +88,11 @@ export function getPath(file: FilePath): string { * Utility function that is needed to have correct directory structure as webkitRelativePath is read only */ export function packageFile(file: FilePath, pathOverwrite?: string): FilePath { - const path = pathOverwrite || getPath(file) + let path = pathOverwrite || getPath(file) + + if (!path.startsWith('/') && path.includes('/')) { + path = `/${path}` + } return { path: path, diff --git a/test-data/1337x1337.jpg b/test-data/1337x1337.jpg new file mode 100644 index 0000000..19ba92b Binary files /dev/null and b/test-data/1337x1337.jpg differ diff --git a/test-data/test-folder/1.txt b/test-data/test-folder/1.txt new file mode 100644 index 0000000..3248fce --- /dev/null +++ b/test-data/test-folder/1.txt @@ -0,0 +1,40 @@ +6857a7050f3b698675d85a6d019305b6090f95f0 +fcf895e4df26acdce571c2333bbd0730ef29f891 +68dc5591812e60b17dde51615ed0881ea5fcfd9f +7adb999f68d64fe05b5274eee058521aa23b2aef +becc4e5197099bdf152f1bf3bf9d1bb50e007a0c +3c5ba0f875ff345ee48a269d7b53eeda12fd5601 +4dc6123048234084c599959142cf415172450715 +864c785d0ddf4e24924de4ac165bd4e74c7e36b3 +85df5c1f7994dfdc171db8ee17f6144ca18c0009 +9bbc1aa874ec49a9ac933faf4b05ab33b132bfbc +0269aa60a6c456b9206e3b04c174603f869d2f14 +60f7b18bfa0f07c210e91d385d92e19140aeb51d +21daec4b7ad73922169d8efddd0e0174fb90d013 +ed3d75ae2c0d5295841b5f96d278222cb4abc0f2 +10b8898cfaf7208884ea7c042cc456fc92c9b819 +38f2cdd53aa2d46423c7d9ee3f55ecdb3d69044d +b3f3265c9d97e80260bb4a9c9b17c4a5bcf643a9 +545bc39d80151cb23d0c98ce618f0a4adc120ac5 +b4de4b6a2437e99534384cf6810feb500ee478f6 +a0d37a09c84ca3b58a493dd27ba36f43e8ee4fad +2bd0ec3f8a3852fb960160dad51e5b4078426944 +57c8e004de3cff1974ff285677a3a386bd38a317 +bb6f33f3f12cfdc68ff2bb9f91406d40cee3c807 +a0e2045d7b3f5a84c2fc0262b37cba5b93d66bd0 +6456741eac9cdae9ced1cc2ce7d4972a3329bd39 +d8a7a7875ce0b15d1e1a50e705c3118280363ec0 +64c723249a47c0ff663000a762d95fb58f13fdea +0327e8529be0d96f86c841cc7839e15dca15d2bd +edcb3f24ba8c74359660bf2c488df0ed414072d6 +d654a02bf4271e9633548a6777c1788a98eded87 +bc6fa2c3c155a940262386571081420402b1b923 +338d8167dd48f810aa9573bb53d2bf632331f989 +81176b5e809c1b29aaf717cd3b43ee871c8f21c1 +6853345f0d4fd39365c4d9de58d258779e89eb7c +b68aa42ba7a343eedd595ee197c6381457162b63 +ecebaf8124aa6caff3542c25d80ed7cf5f64584f +501804d75a17f77799e09834101626c1c681237a +ebba852da0af9fab804a79c592c2bdfed286c26b +5ddabc3dcc3ab672e7b0a01f4afad5239109eba0 +6e89b48babada48b6e6e3dafb6c280b6089ba841 diff --git a/test-data/test-folder/2.txt b/test-data/test-folder/2.txt new file mode 100644 index 0000000..2a4e3bd --- /dev/null +++ b/test-data/test-folder/2.txt @@ -0,0 +1,40 @@ +89d0aa0693f8fa7fd56ea9821a20576b8dc0b70c +233f235852c31d31d25c41a95d276457d75c5d2c +4a6dbff20f95a99676b0423c945e532c1d27ce10 +e83f5f472255e5e47a94bec9ddc5a0b10787230f +eb8f5d96cc60019a328a6fd70230d68e41ec5f8f +95d3b8187e99d5eb9fb4110602ed0986cdcf7e9c +2f57c850d44481baf3c91aac9a6aa17a6f870368 +4af29bd9177509376e20e79f3a4ff41475e89ce1 +b0424b5cc80fa80d7eb59faca0538bea7d4028ac +242bc01b9b54a13e0f60259deb66a4ccf428a679 +34e3ca767691317ae7d021967f0576bd4eb0baa2 +0bf5c07d4e807ca46c5fb4334381bc77163c1f9d +df4d25cb88c7177b2afddc1c652753a2b78ff7b9 +b82c0ba16886648e7f21d0b9b24b33080574671f +92456c3bbffd461845f6600cf4357df7968b88e0 +ddbf58f422d7c3dfb0a5fb4ded9cd9d9e99da4be +41c531777fd80868dffcff554de1d77b44dfab7e +02540a73ce034777a18fe9ed9c76855f6fdbfb63 +0e6707e80215d5871203a1ca3048915eebec653b +a00398936467504d5b3ea8bb59ab0d1259ca83bd +1fb82cbec72739f7e366c9c4ca4ba75a3ffb20fe +2335340c6ceeb6b7e5f91d659ba5aa1c0b47892d +287b993cd5480a2267f7dbbb11f69777f6742b1e +9462fa394fac136bed96b6274f999afd0256ce82 +33b3404926bb97848ea4f7a5d6f772251da7a608 +bfa50de6375939c17ed4ec29c8e812c4e9be60ce +b2a9542b7bb6674f4aab36c30b16ff54c222bef1 +40746c1c87e7ea175df5f1680a0eceda0239868b +73d56b02bfe537480cbfe59fde9ec859ed7fcd56 +33f8ceb9133e50a67d8fbab76c7f986ee8593ee7 +a520751396cfeadc99ea708e270080ad6170d5ea +3ac084cb847b17b753142900a99fcd1f441084ab +1a16765601210a635baad6aadaf6c9f1f2304d92 +0e7ac2503779b3969e1a153ac06a9271b5af9a4d +c053d311c71f4461e2d56a7cf799b4841977b623 +b63bef742d705306e32e726738257b83bcd92ddb +854e6e1731ccfc22327a6c5bd7ce78e394ef0325 +15f7b431a7d48391a71b79ca0e1b567eb7ff5f5c +585e99c7cedfac1190ae449e5546a7da2fe0ff49 +0aae3e5db6057a2796c59bdefcd6ae44b880e5ce diff --git a/test-data/test-folder/3.txt b/test-data/test-folder/3.txt new file mode 100644 index 0000000..8c856b5 --- /dev/null +++ b/test-data/test-folder/3.txt @@ -0,0 +1,40 @@ +fafe57711ee6f0fe89ea64ab7e5b6f9a34eebc1a +3f3a2a728f45e00a17ee7255b1f4fc4d9adc83c0 +815051cf4ac9235a0df2806bf2eabc668fa29a01 +cdac5f6018279816ee7287794239de83dc6312af +401666cac4f1e34132176ba6565eb84899aa168f +5f2812e35ca870b9e85b5ac60b47e0d80aa2d905 +ada7f51c064702ac4c1f33d1ced6dd882f2f4971 +e5b8944c6ee08170205a47049626d995bc850151 +cae308ccfc3ddc3c08f1da7bd6348c954c7c7cbe +73be5df1891a0e6e374936f7f1fd93104033fecb +60a8b7cb61e058722956e39d28f8b1efe5a0e309 +b2b6d5e138d41738ff9057b74aec1965fc030b30 +29ba55c0334e2fb60599ce99ed35b8adc65c92d6 +1ade4db1e922d6609216902a65fc72535f5570d5 +00749b46dc4d83d3c835ea51c387c2ba9f009ec4 +f5623179b8dd80eeb5dba80e70b304dc2debb585 +8ab93bde7091a75a66be77c20ee929dd37ea41f1 +e8d7ee0b5bb27154a855d95e1af3e4709e1a58f9 +5642d952fa67e0e89f1bc874c0e6593417289e78 +e3b584b47a28b8b664c78f536e76ae9b1d3079bf +7d7c97d348eae903189c7c0efad090064d3b771e +ae1502dd53c908bb3658e41f4d4da3dbb11cb772 +f4ef4a02759cb82cf90defab3ac948a65e874ee9 +8c797b38d4594ac2c03d069e853a586d02c6b368 +56f8a1fafd0c073440f71d8eeba3268689d78b98 +dc1a0e8caf5934babf92802f3a753933400b37d9 +da065c57205f39a943e3d0b10001fbf730feb552 +2926b2389769c14d77fc1b0f0ff1faec0a26323f +7d439a063b726875e81683494affd5517f666649 +4ba360418d2d1d5f003b932747a258494c4301e8 +5d46dbc2f72781502eed0722c609ddd3ad2dcfa2 +7b7d15425d0b7de25e2f27ee5e402e0c22c22038 +e97a4765286e7c83d309676983c78da95754ff83 +8ed57bead42d0d22ebe0fcb322a0aa94ace3bb66 +352c383d10f97d17d4ea6d6ff55be5ec14e5a010 +b5025ec9e14721a9034b6f9f24932734b4fb822a +a0d946a3a729d91ee0740b9d937ac7686cf7a553 +ef44430604978c460c7e33e56c723e9d2976aff6 +507dfe5656d5a3a139b7c0feb16b323557cb0a17 +6dfa530095471d8af68dda90a25829c3fb01857d diff --git a/test-data/test-folder/4.txt b/test-data/test-folder/4.txt new file mode 100644 index 0000000..8940fd0 --- /dev/null +++ b/test-data/test-folder/4.txt @@ -0,0 +1,40 @@ +0c5aee4c907c91a32cb63f34de20b584e57bc63b +1e58a64ee85233d042508363b83940c68fac51c2 +caf8ff6f60dc0892415450cbc574799da9abbedc +74686af7ec63bb15dc6fb0af6134a2744ea8787e +6400780e4f6e4b33628bede4045249dfc9c69540 +5acb7f4c35c88d65557a397a9adde4ecdc18ae14 +f320cf7bff3fc91b237be60e3426a627afc89aa4 +2076ca826e4e1c794954b20df36d3aef5a8e460a +bfe5bd2506752fe2e2bb9bbd4ba6ba32b602c7d9 +007b6defb01b0de6e833dacd209752117c17f674 +298e5755c41c583d7693a78a89a7473df8739b06 +166fdcad59469adf63120b0dce19ce6c5f4761eb +5ba1049456f61cbd1438641495f704b502aefa2e +12b37c1ad7fc52442a40dc37ab15320db2367538 +7ac458cfe550a48a0a2915012a109175125be704 +a5b423222aefbfdd109edcbf24aaf1645fdca253 +d19b935739188a8fd26ed8b5a10bbda9886ec6c0 +f8bedd5e9fd7e12edb08ff9276cfd4c0ea9a6352 +ae5a66da162be82eb892341cd647c2e5fcc6ae72 +5db642841bb38be39c83fc35b0131a7cd0f38a0e +9cc4e3bec3365e21ce94d794a0892d695dc2a1c3 +32ccd4cda5736a6834b5f6940e3493fa85f0a1f9 +520c3eb1cd25302266b352bfd01004aab89aadd3 +28bb5f995b7d834d74e499405bee30d65c0b9c5d +1de4ceb425708e62a65ab658e1c94baa30a6fc8b +904d403ec242b5d95c7fff31c0b581db1b434b19 +b0b684d18d8145bb5284978430b9143b1c09d33f +d88afdcb176af85c165a9135b199cb78bfa3c04c +bfe09cab5fdd069c95cb5133414e4f029f3e5803 +d89230f068a21d067cfc4087d1306a53896a9788 +d6e72f6fe922c04e32cf236d642177d031b57f23 +1049c6078ad9896ac914bab2425a05f865da4164 +f5d9a7ec1dff1cd241c8303f84024900ee5ea7ce +c6c883d338bfac9709763c69f8f2e5b61c24bc0d +242574cb1c99e6731e4a792855920ffe63cd5c1c +41167719d37928de14c78b243ca371cfa893b07c +738f590d0b3cb71e3a03369068c6192fe1e16167 +1268b7be1e0d6239a896be8adaa08b512bb65c67 +136eb76f4a68a67940d6deed22e37098baab216a +fb5a4fc20e23aab9024bb621af1417bd9dbc29af diff --git a/test-data/test-react-website/asset-manifest.json b/test-data/test-react-website/asset-manifest.json new file mode 100644 index 0000000..a5778ce --- /dev/null +++ b/test-data/test-react-website/asset-manifest.json @@ -0,0 +1,16 @@ +{ + "files": { + "main.css": "/static/css/main.073c9b0a.css", + "main.js": "/static/js/main.0215976b.js", + "static/js/787.28cb0dcd.chunk.js": "/static/js/787.28cb0dcd.chunk.js", + "static/media/logo.svg": "/static/media/logo.6ce24c58023cc2f8fd88fe9d219db6c6.svg", + "index.html": "/index.html", + "main.073c9b0a.css.map": "/static/css/main.073c9b0a.css.map", + "main.0215976b.js.map": "/static/js/main.0215976b.js.map", + "787.28cb0dcd.chunk.js.map": "/static/js/787.28cb0dcd.chunk.js.map" + }, + "entrypoints": [ + "static/css/main.073c9b0a.css", + "static/js/main.0215976b.js" + ] +} \ No newline at end of file diff --git a/test-data/test-react-website/favicon.ico b/test-data/test-react-website/favicon.ico new file mode 100644 index 0000000..a11777c Binary files /dev/null and b/test-data/test-react-website/favicon.ico differ diff --git a/test-data/test-react-website/index.html b/test-data/test-react-website/index.html new file mode 100644 index 0000000..cfa4497 --- /dev/null +++ b/test-data/test-react-website/index.html @@ -0,0 +1 @@ +
e||125 a||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"28cb0dcd\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"my-app:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmy_app\"] = self[\"webpackChunkmy_app\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","var _g;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgLogo(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 841.9 595.3\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#61DAFB\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z\"\n }), /*#__PURE__*/React.createElement(\"circle\", {\n cx: 420.9,\n cy: 296.5,\n r: 45.7\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M520.5 78.1z\"\n }))));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgLogo);\nexport default __webpack_public_path__ + \"static/media/logo.6ce24c58023cc2f8fd88fe9d219db6c6.svg\";\nexport { ForwardRef as ReactComponent };","import logo from './logo.svg';\nimport './App.css';\n\nfunction App() {\n return (\n \n Edit \n
src/App.js and save to reload.\n Hello Swarm
+
+
diff --git a/test-data/test-website/reset.css b/test-data/test-website/reset.css
new file mode 100644
index 0000000..7756fa5
--- /dev/null
+++ b/test-data/test-website/reset.css
@@ -0,0 +1,129 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+embed,
+figure,
+figcaption,
+footer,
+header,
+hgroup,
+menu,
+nav,
+output,
+ruby,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol,
+ul {
+ list-style: none;
+}
+blockquote,
+q {
+ quotes: none;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/test-data/test-website/static/2000x2000.jpg b/test-data/test-website/static/2000x2000.jpg
new file mode 100644
index 0000000..33d618f
Binary files /dev/null and b/test-data/test-website/static/2000x2000.jpg differ
diff --git a/test-data/text.txt b/test-data/text.txt
new file mode 100644
index 0000000..56914bf
--- /dev/null
+++ b/test-data/text.txt
@@ -0,0 +1,40 @@
+336e98b027786ddbc75a7547a656257c11be32b2
+ce319a535a6ddb677b6c7fae34712f83c83b93bc
+e4333ee6a9debbfdd9f7c356823e4fd1b57b1483
+c621227028f71042c3a06c2ef643964e5406053b
+ba9f12ce05fa560db7e11c71193dc32c91028105
+14238b8036ffb9784b302febdc620a21d7106a5c
+0353c02dd103750ef8f4abf40f44d0d39ea671a3
+22c1c57af8e0acebd934a3f589c0c50c10c3ff62
+c8767d4a3ed86809eccb3a8a22b6e1c852f3304d
+a96eb113125d74c3eed07c613e3963ed3176e9fc
+3a065ad47daf1787d3180ec57da5d4505eacb7e6
+eab477e8bbd6b00021be7fd130a711da404ea618
+580ed3679dc4b54ba276780d511aa28c78468b22
+c08d260a8517784ddc0f307c72c32002d43a2d77
+1d4b02795cbdfa272708569e9555bb36235f4ed4
+27ce7eccea98ccd5155e84365fe76c135754bac4
+23f761cf8c7498ea0132af6d60d0398e5a51262f
+79f6f7f1764807619743fa040b3daffe5ff35d2c
+604b8fbb44ed9f6bd3c1c10ea6af0292c324bc5e
+7bbdfc627fcf0de8dca782e3a9b19f58cbe0dbd2
+c2eba4de403cdab30ab9e8ea37cb658b1b718ad1
+44a5ecb1be4c2f15db635e2b7402ecc7241195f9
+faaddaaf72566599562259927e8e4d12f4d9b678
+653b01bd828cfc9ff53f6bad9170dc68ac42e27c
+d8af098efa267ac46eccaeb6a4f4880fedba86a2
+c3247313d96c56270ad97a0a46c5794dd0ac24f1
+33156f08843da9654b64dc96178ff10b01c32463
+0954bf8ba75246150bf365b02db71bc37d5f22db
+a35900cf088b2fd24776cc70bc45279c807fc342
+873e711026f74bf3eb77fa2c1910793315d9ff46
+afc4b4cbd2553d8bf38ee811f1ff9b56185a6ea5
+50a33df8d719d6cf3889d38f97e951a78374d509
+5b3512cb132d939d06252cffe1546fc33dccd137
+9a072613d3169e88612e22cd333cb00ee4591d89
+f193d645f223ae6862f9a0a4fa8b40ffe9bcdbde
+e7a7f7f9c12fb4f6bdf6a7ed232ca75653b4fe88
+5cacba67f68e338e6674b4e6e684c3d5c8f3328d
+0a11ddb543d050555ae41a1c778f392e8c7a49ea
+1914cd178a06057847984b534b5d615f087b7178
+8a5444ac835ca19972df95bcf5d2aaa6eabf49ff
diff --git a/ui-test/helpers.js b/ui-test/helpers.js
new file mode 100644
index 0000000..1f1cd24
--- /dev/null
+++ b/ui-test/helpers.js
@@ -0,0 +1,45 @@
+const axios = require('axios')
+const puppeteer = require('puppeteer')
+const { Assert, Click, sleep, Wait } = require('./library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ * @returns {Promise` `alt` to look for
+ */
+function queryImgSrcByAlt(page, alt) {
+ return queryElementPropertyByAttribute(page, 'img', 'alt', alt, 'src')
+}
+
+module.exports = {
+ sleep,
+ Assert: {
+ elementWithTextExists: assertElementWithTextExists,
+ },
+ Click: {
+ elementWithText: clickElementWithText,
+ elementWithClass: clickElementWithClass,
+ elementWithTextAndUpload: clickElementWithTextAndUpload,
+ },
+ Query: {
+ elementPropertyByAttribute: queryElementPropertyByAttribute,
+ imgSrcByAlt: queryImgSrcByAlt,
+ },
+ Wait: {
+ forElementCss: waitForElementCss,
+ forElementXPath: waitForElementXPath,
+ forEnabledStateXPath: waitForEnabledStateXPath,
+ },
+}
diff --git a/ui-test/test-case/FolderUpload.js b/ui-test/test-case/FolderUpload.js
new file mode 100644
index 0000000..a42e7be
--- /dev/null
+++ b/ui-test/test-case/FolderUpload.js
@@ -0,0 +1,36 @@
+const puppeteer = require('puppeteer')
+const { selectStampAndUpload } = require('../helpers')
+const { Assert, Click } = require('../library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testFolderUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add Folder', 'test-data/test-folder')
+ await assertUploadPreview(page)
+ await selectStampAndUpload(page)
+ await assertDownloadPreview(page)
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertDownloadPreview(page) {
+ await assertUploadPreview(page)
+ await Assert.elementWithTextExists(page, 'p', 'Swarm Hash: 89ef8f3e[…]504e5d1c')
+ await Assert.elementWithTextExists(page, 'p', 'Folder Name: test-folder')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: Folder')
+ await Assert.elementWithTextExists(page, 'h6', '4 items')
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertUploadPreview(page) {
+ await Assert.elementWithTextExists(page, 'p', 'Folder Name: test-folder')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: Folder')
+ await Assert.elementWithTextExists(page, 'p', 'Size: 6.56 kB')
+}
+
+module.exports = { testFolderUpload }
diff --git a/ui-test/test-case/ImageFileUpload.js b/ui-test/test-case/ImageFileUpload.js
new file mode 100644
index 0000000..8e4218f
--- /dev/null
+++ b/ui-test/test-case/ImageFileUpload.js
@@ -0,0 +1,33 @@
+const puppeteer = require('puppeteer')
+const { Assert, Click } = require('../library')
+const { selectStampAndUpload } = require('../helpers')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testImageFileUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add File', 'test-data/1337x1337.jpg')
+ await assertUploadPreview(page)
+ await selectStampAndUpload(page)
+ await assertDownloadPreview(page)
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertUploadPreview(page) {
+ await Assert.elementWithTextExists(page, 'p', 'Filename: 1337x1337.jpg')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: image/jpeg')
+ await Assert.elementWithTextExists(page, 'p', 'Size: 116.88 kB')
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertDownloadPreview(page) {
+ await assertUploadPreview(page)
+ await Assert.elementWithTextExists(page, 'p', 'Swarm Hash: 5de1d879[…]3427432d')
+}
+
+module.exports = { testImageFileUpload }
diff --git a/ui-test/test-case/ReactWebsiteUpload.js b/ui-test/test-case/ReactWebsiteUpload.js
new file mode 100644
index 0000000..ef0ba71
--- /dev/null
+++ b/ui-test/test-case/ReactWebsiteUpload.js
@@ -0,0 +1,25 @@
+const puppeteer = require('puppeteer')
+const { selectStampAndUpload, assertUploadedContentAtPath } = require('../helpers')
+const { Click } = require('../library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testReactWebsiteUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add Website', 'test-data/test-react-website')
+ const swarmHash = await selectStampAndUpload(page)
+ await assertUploadedContentAtPath(swarmHash, 'index.html', 'text/html; charset=utf-8')
+ await assertUploadedContentAtPath(swarmHash, 'asset-manifest.json', 'application/json')
+ await assertUploadedContentAtPath(swarmHash, 'static/css/main.073c9b0a.css', 'text/css; charset=utf-8')
+ await assertUploadedContentAtPath(swarmHash, 'static/css/main.073c9b0a.css.map', '')
+ await assertUploadedContentAtPath(swarmHash, 'static/js/787.28cb0dcd.chunk.js', 'application/javascript')
+ await assertUploadedContentAtPath(swarmHash, 'static/js/787.28cb0dcd.chunk.js.map', '')
+ await assertUploadedContentAtPath(
+ swarmHash,
+ 'static/media/logo.6ce24c58023cc2f8fd88fe9d219db6c6.svg',
+ 'image/svg+xml',
+ )
+}
+
+module.exports = { testReactWebsiteUpload }
diff --git a/ui-test/test-case/TextFileUpload.js b/ui-test/test-case/TextFileUpload.js
new file mode 100644
index 0000000..716c190
--- /dev/null
+++ b/ui-test/test-case/TextFileUpload.js
@@ -0,0 +1,33 @@
+const puppeteer = require('puppeteer')
+const { selectStampAndUpload } = require('../helpers')
+const { Assert, Click } = require('../library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testTextFileUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add File', 'test-data/text.txt')
+ await assertUploadPreview(page)
+ await selectStampAndUpload(page)
+ await assertDownloadPreview(page)
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertUploadPreview(page) {
+ await Assert.elementWithTextExists(page, 'p', 'Filename: text.txt')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: text/plain')
+ await Assert.elementWithTextExists(page, 'p', 'Size: 1.64 kB')
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertDownloadPreview(page) {
+ assertUploadPreview(page)
+ await Assert.elementWithTextExists(page, 'p', 'Swarm Hash: da0773a9[…]5f7a1b54')
+}
+
+module.exports = { testTextFileUpload }
diff --git a/ui-test/test-case/WebsiteUpload.js b/ui-test/test-case/WebsiteUpload.js
new file mode 100644
index 0000000..b2ff4e2
--- /dev/null
+++ b/ui-test/test-case/WebsiteUpload.js
@@ -0,0 +1,36 @@
+const puppeteer = require('puppeteer')
+const { selectStampAndUpload } = require('../helpers')
+const { Assert, Click } = require('../library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testWebsiteUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add Website', 'test-data/test-website')
+ await assertUploadPreview(page)
+ await selectStampAndUpload(page)
+ await assertDownloadPreview(page)
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertUploadPreview(page) {
+ await Assert.elementWithTextExists(page, 'p', 'Folder Name: test-website')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: Website')
+ await Assert.elementWithTextExists(page, 'p', 'Size: 390.10 kB')
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertDownloadPreview(page) {
+ await assertUploadPreview(page)
+ await Assert.elementWithTextExists(page, 'p', 'Swarm Hash: b9a6d15d[…]d0d48b81')
+ await Assert.elementWithTextExists(page, 'p', 'Folder Name: test-website')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: Website')
+ await Assert.elementWithTextExists(page, 'h6', '3 items')
+}
+
+module.exports = { testWebsiteUpload }