From 523e510649c6d54a98b6023352e5285f01b3404f Mon Sep 17 00:00:00 2001 From: Beth Pan Date: Mon, 6 Nov 2023 11:59:22 -0800 Subject: [PATCH 1/8] Merge hot/bug fixes from main to staging (#4516) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Maintenance task. Signed-off-by: dependabot[bot] Co-authored-by: Justin Willis Co-authored-by: Gleb Khmyznikov Co-authored-by: Jaylyn Barbee Co-authored-by: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com> Co-authored-by: Nikola Metulev Co-authored-by: Mara'ah Lee Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Adolf Daniel <10156724+adolfdaniel@users.noreply.github.com> Co-authored-by: Justin Willis (HE / HIM) Co-authored-by: Zach Teutsch <88554871+zateutsch@users.noreply.github.com> Co-authored-by: vipul-bhojwani <67650372+vipul-bhojwani@users.noreply.github.com> Co-authored-by: Amrutha Srinivasan Co-authored-by: Federico Navarrete Co-authored-by: Toby Liu Co-authored-by: microsoft-github-policy-service[bot] <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Co-authored-by: Amrutha Srinivasan Co-authored-by: Jonas Thelemann Co-authored-by: Siraj Chokshi <19193347+SirajChokshi@users.noreply.github.com> Co-authored-by: Thomas Peißl <7underlines@gmail.com> From 56c931e28d869984af065fd135e93e97b2d8f51e Mon Sep 17 00:00:00 2001 From: Zach Teutsch <88554871+zateutsch@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:43:25 -0800 Subject: [PATCH 2/8] [VSCODE] #3880: Migrate to GitHub API (#4513) fixes #3880 fixes #3869 --------- Co-authored-by: Justin Willis --- apps/pwabuilder-vscode/package-lock.json | 591 +++++++++++++++++- apps/pwabuilder-vscode/package.json | 32 +- .../src/services/new-pwa-starter.ts | 108 +--- .../src/test/test-app/manifest.json | 2 +- 4 files changed, 609 insertions(+), 124 deletions(-) diff --git a/apps/pwabuilder-vscode/package-lock.json b/apps/pwabuilder-vscode/package-lock.json index 65b3288e6..1c591a6b5 100644 --- a/apps/pwabuilder-vscode/package-lock.json +++ b/apps/pwabuilder-vscode/package-lock.json @@ -11,10 +11,11 @@ "@vscode/extension-telemetry": "^0.7.7", "@vscode/webview-ui-toolkit": "^0.9.0", "applicationinsights": "^2.5.0", + "decompress": "^4.2.1", "dotenv": "^16.0.1", "formdata-node": "^4.3.2", "formdata-polyfill": "^4.0.10", - "node-fetch": "^2.6.7", + "node-fetch": "^2.7.0", "pwa-asset-generator": "^6.1.1", "shelljs": "^0.8.5", "workbox-build": "^6.4.2" @@ -4757,6 +4758,20 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -4765,6 +4780,11 @@ "node": "*" } }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5603,8 +5623,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cross-fetch": { "version": "3.1.5", @@ -5614,6 +5633,44 @@ "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==", + "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==" + }, + "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==" + }, + "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==", + "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", @@ -5834,6 +5891,24 @@ "dev": true, "optional": true }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -5863,6 +5938,174 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -8389,6 +8632,11 @@ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==" + }, "node_modules/is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -8610,8 +8858,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isexe": { "version": "2.0.0", @@ -9660,9 +9907,9 @@ } }, "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==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10371,6 +10618,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -10573,8 +10847,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -11086,7 +11359,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11100,8 +11372,7 @@ "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readable-web-to-node-stream": { "version": "3.0.2", @@ -11545,6 +11816,18 @@ "node": ">=10" } }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, "node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -12003,6 +12286,14 @@ "node": ">=10" } }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -12232,6 +12523,11 @@ "xtend": "~4.0.1" } }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -12430,8 +12726,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "dev": true, - "optional": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -13118,7 +13412,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, "engines": { "node": ">=0.4" } @@ -16792,11 +17085,30 @@ "ieee754": "^1.1.13" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -17428,8 +17740,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cross-fetch": { "version": "3.1.5", @@ -17437,6 +17748,35 @@ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "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==", + "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==" + }, + "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==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } } }, "cross-spawn": { @@ -17603,6 +17943,38 @@ "dev": true, "optional": true }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + } + } + }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -17622,6 +17994,124 @@ } } }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -19402,6 +19892,11 @@ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==" + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -19542,8 +20037,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -20359,9 +20853,9 @@ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" }, @@ -20900,6 +21394,24 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -21037,8 +21549,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -21418,7 +21929,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -21432,8 +21942,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -21760,6 +22269,14 @@ "xmlchars": "^2.2.0" } }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "requires": { + "commander": "^2.8.1" + } + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -22121,6 +22638,14 @@ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "^4.0.1" + } + }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -22300,6 +22825,11 @@ "xtend": "~4.0.1" } }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -22444,8 +22974,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "dev": true, - "optional": true, "requires": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -23035,8 +23563,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", diff --git a/apps/pwabuilder-vscode/package.json b/apps/pwabuilder-vscode/package.json index 11fcf4255..42d4a8202 100644 --- a/apps/pwabuilder-vscode/package.json +++ b/apps/pwabuilder-vscode/package.json @@ -5,6 +5,20 @@ "publisher": "PWABuilder", "version": "1.3.3", "icon": "store_assets/icon_512.png", + "scripts": { + "vscode:prepublish": "npm run esbuild-base", + "esbuild-base": "esbuild ./src/extension.ts --bundle --platform=node --external:./node_modules/* --outfile=out/main.js --external:vscode --format=cjs --platform=node", + "esbuild": "npm run esbuild-base -- --sourcemap", + "esbuild-watch": "npm run esbuild-base -- --sourcemap --watch", + "test-compile": "tsc -p ./", + "compile": "tsc -p ./ && npm run copy", + "watch": "npm run copy && tsc -watch -p ./", + "pretest": "npm run compile", + "lint": "eslint src --ext ts", + "copy": "copyfiles .env out", + "test": "node ./out/test/runTest.js", + "build": "npm run compile && npm run esbuild" + }, "repository": { "type": "git", "url": "https://github.com/pwa-builder/pwabuilder-vscode" @@ -349,19 +363,6 @@ ] } }, - "scripts": { - "vscode:prepublish": "npm run esbuild-base", - "esbuild-base": "esbuild ./src/extension.ts --bundle --platform=node --external:./node_modules/* --outfile=out/main.js --external:vscode --format=cjs --platform=node", - "esbuild": "npm run esbuild-base -- --sourcemap", - "esbuild-watch": "npm run esbuild-base -- --sourcemap --watch", - "test-compile": "tsc -p ./", - "compile": "tsc -p ./ && npm run copy", - "watch": "npm run copy && tsc -watch -p ./", - "pretest": "npm run compile", - "lint": "eslint src --ext ts", - "copy": "copyfiles .env out", - "test": "node ./out/test/runTest.js" - }, "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.1.4", @@ -385,12 +386,13 @@ "@vscode/extension-telemetry": "^0.7.7", "@vscode/webview-ui-toolkit": "^0.9.0", "applicationinsights": "^2.5.0", + "decompress": "^4.2.1", "dotenv": "^16.0.1", "formdata-node": "^4.3.2", "formdata-polyfill": "^4.0.10", - "node-fetch": "^2.6.7", + "node-fetch": "^2.7.0", "pwa-asset-generator": "^6.1.1", "shelljs": "^0.8.5", "workbox-build": "^6.4.2" } -} \ No newline at end of file +} diff --git a/apps/pwabuilder-vscode/src/services/new-pwa-starter.ts b/apps/pwabuilder-vscode/src/services/new-pwa-starter.ts index d3c517a09..48a163190 100644 --- a/apps/pwabuilder-vscode/src/services/new-pwa-starter.ts +++ b/apps/pwabuilder-vscode/src/services/new-pwa-starter.ts @@ -1,6 +1,14 @@ import * as vscode from "vscode"; import { trackEvent } from "./usage-analytics"; + +var fs = require('fs'); +const decompress = require('decompress'); +import fetch from 'node-fetch'; +import {pipeline} from 'node:stream'; +import {promisify} from 'node:util'; + const shell = require("shelljs"); +const FETCHED_ZIP_NAME_STRING: string = 'fetchedZip.zip'; const repositoryInputPrompt: string = "Enter the name you would like to use for your PWA's repository."; @@ -8,20 +16,15 @@ const directoryInputPrompt: string = "Where would you like your PWA to live?"; const repositoryInputPlaceholder: string = "Enter your repository name here."; const noNameSelectedWarning: string = "No repository name provided. New PWA Starter process cancelled."; -const noGitWarning: string = - "This command requires git. Install git at https://git-scm.com/"; const noNpmWarning: string = "This command requires npm. Install npm at https://www.npmjs.com/"; const starterRepositoryURI: string = - "https://github.com/pwa-builder/pwa-starter.git"; +"https://github.com/pwa-builder/pwa-starter/archive/refs/heads/main.zip"; let repositoryName: string | undefined = undefined; let repositoryParentURI: vscode.Uri | undefined = undefined; const terminal = vscode.window.createTerminal(); -const gitFileWatcher = vscode.workspace.createFileSystemWatcher( - `**/${repositoryName}/.git/**` -); export async function setUpLocalPwaStarterRepository(): Promise { trackEvent("generate", { "type": "starter"}); @@ -31,11 +34,9 @@ export async function setUpLocalPwaStarterRepository(): Promise { if (repositoryName && repositoryParentURI) { try { - initStarterRepository(); + await initStarterRepository(); offerDocumentation(); openRepositoryWithCode(); - setupLocalRepository(); - resolve(); } catch (err) { reject(err); @@ -45,7 +46,6 @@ export async function setUpLocalPwaStarterRepository(): Promise { } async function offerDocumentation() { - // offer documentation const documentationLink = "https://aka.ms/starter-docs"; const documentationLinkButton = "Open Documentation"; const documentationLinkResponse = await vscode.window.showInformationMessage( @@ -61,7 +61,7 @@ async function offerDocumentation() { async function getRepositoryInfoFromInput(): Promise { await getRepositoryNameFromInputBox() .then(getRepositoryDirectoryFromDialog) - .catch(inputCanelledWarning); + .catch(inputCancelledWarning); } async function getRepositoryNameFromInputBox(): Promise { @@ -94,41 +94,19 @@ async function getRepositoryDirectoryFromDialog(): Promise { }); } -function initStarterRepository(): void { +async function initStarterRepository(): Promise { terminal.show(); - changeDirectory(repositoryParentURI?.path.slice(1)); - if (tryCloneFromGithub()) { + const repoPath: string = await fetchFromGithub(); + if (fs.existsSync(repoPath)) { + changeDirectory(`${repositoryParentURI?.path.slice(1)}/${repositoryName}`); tryNpmInstall(); } } function openRepositoryWithCode(): void { - let workspaceChangeDisposable: vscode.Disposable = - vscode.workspace.onDidChangeWorkspaceFolders(removeGitFolderListener); - - gitFileWatcher.onDidDelete(() => { - workspaceChangeDisposable.dispose(); - gitFileWatcher.dispose(); - }); - terminal.sendText(`code ${repositoryName}`); } -function removeGitFolderListener(): any { - if (vscode.workspace.workspaceFolders) { - let i = 0; - while (i < vscode.workspace.workspaceFolders.length) { - if (vscode.workspace.workspaceFolders[i].name == repositoryName) break; - i++; - } - vscode.workspace.fs.delete( - vscode.Uri.file( - `${vscode.workspace.workspaceFolders[i].uri.fsPath}/.git` - ), - { recursive: true } - ); - } -} function tryNpmInstall(): boolean { let didNpmInstall: boolean = true; @@ -142,9 +120,8 @@ function tryNpmInstall(): boolean { } function npmInstall(): void { - changeDirectory(repositoryName); terminal.sendText("npm install"); - changeDirectory(".."); + changeDirectory('..'); } function changeDirectory(pathToDirectory: string | undefined): void { @@ -161,51 +138,30 @@ export function isNpmInstalled(): boolean { return isNpmInstalled; } -function tryCloneFromGithub(): boolean { - let wasCloned: boolean = true; - if (isGitInstalled()) { - cloneFromGithub(); - } else { - noGitInstalledWarning(); - wasCloned = false; - } - - return wasCloned; -} - -function cloneFromGithub(): void { - terminal.sendText(cloneCommand()); -} - -function setupLocalRepository(): void { - changeDirectory(repositoryName); - terminal.sendText("git init ."); - terminal.sendText("git add ."); - terminal.sendText('git commit -m "First PWA Starter commit."'); -} +async function fetchFromGithub(): Promise { + const streamPipeline = promisify(pipeline); -function isGitInstalled(): boolean { - let isGitInstalled: boolean = true; + const fetchedZipPath: string = `${repositoryParentURI?.fsPath}\\fetchedTemplate.zip`; + const decompressedZipPath: string = `${repositoryParentURI?.fsPath}\\decompressedTemplate`; + const decompressedRepoPath: string = `${decompressedZipPath}\\pwa-starter-main`; + const finalLocationPath: string = `${repositoryParentURI?.fsPath}\\${repositoryName}`; - if (!shell.which("git")) { - isGitInstalled = false; + const res = await fetch(starterRepositoryURI); + if(res.body) { + await streamPipeline(res.body, fs.createWriteStream(fetchedZipPath)); + await decompress(fetchedZipPath, decompressedZipPath); + fs.renameSync(decompressedRepoPath, finalLocationPath); + fs.rmSync(fetchedZipPath, { recursive: true, force: true }); + fs.rmSync(decompressedZipPath, { recursive: true, force: true }); } - return isGitInstalled; + return finalLocationPath } -function cloneCommand(): string { - return `git clone ${starterRepositoryURI} ${repositoryName}`; -} - -function inputCanelledWarning(): void { +function inputCancelledWarning(): void { vscode.window.showWarningMessage(noNameSelectedWarning); } -function noGitInstalledWarning(): void { - vscode.window.showWarningMessage(noGitWarning); -} - export function noNpmInstalledWarning(): void { vscode.window.showWarningMessage(noNpmWarning); -} +} \ No newline at end of file diff --git a/apps/pwabuilder-vscode/src/test/test-app/manifest.json b/apps/pwabuilder-vscode/src/test/test-app/manifest.json index 339e10a20..c90081749 100644 --- a/apps/pwabuilder-vscode/src/test/test-app/manifest.json +++ b/apps/pwabuilder-vscode/src/test/test-app/manifest.json @@ -38,7 +38,7 @@ "related_applications": [ { "platform": "windows", - "url": " The URL to your app in that app store" + "url": "The URL to your app in that app store" } ], "prefer_related_applications": "false", From cd17bf8127d927ca63f12a8f662ab83411ac68d0 Mon Sep 17 00:00:00 2001 From: Zach Teutsch <88554871+zateutsch@users.noreply.github.com> Date: Wed, 15 Nov 2023 06:53:26 -0800 Subject: [PATCH 3/8] [DOCS] #4526: Broken docs links (#4530) fixes #4526 --- docs/builder/meta.md | 6 +++--- docs/home/benefits-of-pwa.md | 5 ++--- docs/home/pwa-intro.md | 2 +- docs/home/sw-intro.md | 2 +- docs/index.html | 4 ++-- docs/starter/quick-start.md | 11 +++++------ docs/studio/dev-dashboard.md | 6 ++---- 7 files changed, 16 insertions(+), 20 deletions(-) diff --git a/docs/builder/meta.md b/docs/builder/meta.md index 6c0065027..14156d67f 100644 --- a/docs/builder/meta.md +++ b/docs/builder/meta.md @@ -79,8 +79,8 @@ Progressive web apps are cross-platform and can be used anywhere! After you've successfully packaged your app for Meta Quest, you can package and publish for other platforms: -- How to Package for the App Store +- [How to Package for the App Store](/builder/app-store) -- How to Package for Microsoft Store +- [How to Package for Microsoft Store](/builder/windows) -- How to Package for the Google Play Store +- [How to Package for the Google Play Store](/builder/android) diff --git a/docs/home/benefits-of-pwa.md b/docs/home/benefits-of-pwa.md index 7696ba8cf..1b6e63622 100644 --- a/docs/home/benefits-of-pwa.md +++ b/docs/home/benefits-of-pwa.md @@ -58,14 +58,13 @@ App Capabilities that can be implemented from the web include, but are not limit - Custom file and URL handling - Integration with hardware devices, like touch screens, microphones, and other sensors -You can learn about how to add native features to your PWA here +You can learn about how to add native features to your PWA in our [Adding App Capabilities](/home/native-features/) article. ### Reliable Offline Experience Another huge edge that native apps used to have on web apps was offline reliability. Classically, web apps would be rendered nonfunctional without access to the internet. Now, with the development of modern web caching and service worker capabilities, progressive web apps can keep a functional and interactive UI even without connectivity. -You can learn more about service workers, the force behind PWA offline functionality, here - +You can learn more about service workers, the force behind PWA offline functionality, in our [Introduction To Service Workers](/home/sw-intro/ "Introduction to Service Workers") article. ## Next Steps diff --git a/docs/home/pwa-intro.md b/docs/home/pwa-intro.md index 124f15c9f..d97766b41 100644 --- a/docs/home/pwa-intro.md +++ b/docs/home/pwa-intro.md @@ -147,4 +147,4 @@ If you're ready to dive in with building your first PWA, the PWA Starter is a gr The PWA Starter is a template that comes with a service worker and manifest built in, and allows you to jump right in with your first PWA. -Check out the Quick Start here +Head over to the [PWA Starter Quick Start](/starter/quick-start/) to learn more. \ No newline at end of file diff --git a/docs/home/sw-intro.md b/docs/home/sw-intro.md index b2c0d8c8a..a14cbcca6 100644 --- a/docs/home/sw-intro.md +++ b/docs/home/sw-intro.md @@ -134,7 +134,7 @@ For testing purposes, service workers will function without HTTPS when served fr If you are unfamiliar with creating certificates to secure an endpoint, you can use an app hosting service that comes with HTTPS enabled by default. One option is to use the [Azure Static Web Apps CLI](https://azure.github.io/static-web-apps-cli/) to host your application with Azure. The PWA Starter template supports the CLI by default, and you can find documentation on publishing the starter with the CLI -here +in the [Azure Static Web Apps](/starter/publish?id=azure-static-web-apps) section of the PWA Starter documentation. diff --git a/docs/index.html b/docs/index.html index 332aea042..036fdedab 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,8 +67,8 @@ '', '', '
', - ' New blog post! Read about Memos AI, an AI-enabled PWA!
', - 'Our latest post, Building Memos AI - A Developer\'s Perspective , demonstrates an example of how AI can work on the modern web. Go check it out!', + ' New blog post! See how to enable in-app purchases on iOS in your PWA!
', + 'Our latest post, You Won\’t Believe How We Enabled In-App Purchases for PWAs on iOS, demonstrates what it takes to get iOS in-app purchases working on a Progressive Web App. Go check it out!', '
', '
' ].join(''); diff --git a/docs/starter/quick-start.md b/docs/starter/quick-start.md index 1ce056686..69bbc62ba 100644 --- a/docs/starter/quick-start.md +++ b/docs/starter/quick-start.md @@ -56,13 +56,12 @@ Your progressive web app will then open in a new browser window. ## Next Steps -To learn how to use the CLI in depth, go here +- [Learn how to use the CLI in depth](/starter/cli-usage) -To learn more about adding content to your PWA, go here +- [Learn how to add content to your PWA](/starter/adding-content) -To learn more about the service worker in the starter, go here +- [Learn more about the service worker in the PWA Starter](/starter/service-worker) -To learn how to deploy your PWA to the web, go here - -To learn about the technical structure of the starter, go here +- [Learn how to deploy your PWA to the web](/starter/publish) +- [Learn more about the technical structure of the starter](/starter/tech-overview) diff --git a/docs/studio/dev-dashboard.md b/docs/studio/dev-dashboard.md index a19f76f6e..4fdc525e3 100644 --- a/docs/studio/dev-dashboard.md +++ b/docs/studio/dev-dashboard.md @@ -48,10 +48,8 @@ For adding icons and screenshots, you will find two buttons under "Assets". Clic * `PWABuilder Studio: Generate Screenshots` -For more info on generating icons and screenshots with PWABuilder Studio, read our docs here - -## Packaging +For more info on generating icons and screenshots with PWABuilder Studio, read our [documentation on generating assets.](/studio/assets) The "Package" section allows you to package your PWA for the Microsoft Store, Apple App Store, Google Play Store and Meta Quest devices, using the same services as the [PWABuilder website.](https://pwabuilder.com) -Click the "package" button for the platforms you want to package for, and you'll be guided through the process of packaging your PWA. For more info on packaging with PWABuilder Studio, read our docs here \ No newline at end of file +Click the "package" button for the platforms you want to package for, and you'll be guided through the process of packaging your PWA. For more info on packaging with PWABuilder Studio, head over to the [packaging documentation.](/studio/packaging) \ No newline at end of file From bdd1936e99fdf0bf04ffdb8e41fedd7b3bc13590 Mon Sep 17 00:00:00 2001 From: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com> Date: Wed, 15 Nov 2023 12:54:03 -0500 Subject: [PATCH 4/8] [PWABuilder] A group of hotfixes from the App Capabilities release (#4508) fixes #4504, #4474 ## PR Type Bugfix Feature ## Describe the current behavior? 1. No current support for Offline Support 2. No current separation of Security Tests 3. html`` being returned in ternary operators instead of null 4. The red icon inside the filter button in the action items list changes sizes when clicked to become active. 5. Cannot tab inside the tooltips (Community, SW and Manifest tooltips) 6. Upon pressing the retest button, the app capabilities score weren't resetting. ## Describe the new behavior? 1. Offline support inside the SW card 2. New Security warning when delivering mixed content. Can package with warning. 3. return null where it makes sense instead of html`` 4. Icon stays the same size. 5. Can now use arrow keys to get inside tooltips to the links (learn more, edit in manifest, or the community links) 6. App Capabilities score now resets properly ## PR Checklist - [ ] Test: run `npm run test` and ensure that all tests pass - [ ] Target main branch (or an appropriate release branch if appropriate for a bug fix) - [ ] Ensure that your contribution follows [standard accessibility guidelines](https://docs.microsoft.com/en-us/microsoft-edge/accessibility/design). Use tools like https://webhint.io/ to validate your changes. ## Additional Information --------- Co-authored-by: Beth Pan --- .../assets/new/offline_support_icon.svg | 17 +- .../public/assets/new/stop_white.svg | 5 +- .../src/script/components/android-form.ts | 10 +- .../src/script/components/app-header.ts | 181 +++++++++++------- .../script/components/manifest-info-card.ts | 122 +++++++++--- .../src/script/components/publish-pane.ts | 4 +- .../src/script/components/share-card.ts | 3 +- .../src/script/components/sw-info-card.ts | 95 +++++---- .../script/components/test-publish-pane.ts | 4 +- .../src/script/components/windows-form.ts | 2 +- .../src/script/pages/app-report.api.ts | 4 +- .../src/script/pages/app-report.helper.ts | 10 +- .../pwabuilder/src/script/pages/app-report.ts | 70 ++++++- .../pages/qualification/app-token.template.ts | 8 +- .../script/pages/qualification/app-token.ts | 14 +- libraries/manifest-information/src/index.ts | 5 + 16 files changed, 367 insertions(+), 187 deletions(-) diff --git a/apps/pwabuilder/public/assets/new/offline_support_icon.svg b/apps/pwabuilder/public/assets/new/offline_support_icon.svg index 0203afaf6..0f0b50947 100644 --- a/apps/pwabuilder/public/assets/new/offline_support_icon.svg +++ b/apps/pwabuilder/public/assets/new/offline_support_icon.svg @@ -1,13 +1,14 @@ - - - - - - + + + + + + + - - + + diff --git a/apps/pwabuilder/public/assets/new/stop_white.svg b/apps/pwabuilder/public/assets/new/stop_white.svg index c25fbb33b..c675982db 100644 --- a/apps/pwabuilder/public/assets/new/stop_white.svg +++ b/apps/pwabuilder/public/assets/new/stop_white.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/apps/pwabuilder/src/script/components/android-form.ts b/apps/pwabuilder/src/script/components/android-form.ts index fc62e71be..941facae4 100644 --- a/apps/pwabuilder/src/script/components/android-form.ts +++ b/apps/pwabuilder/src/script/components/android-form.ts @@ -601,7 +601,7 @@ export class AndroidForm extends AppPackageFormBase { inputHandler: (_, checked) => this.packageOptions.enableNotifications = checked })} - ` : html``} + ` : null} ${this.isGooglePlayApk ? html` @@ -620,7 +620,7 @@ export class AndroidForm extends AppPackageFormBase { inputHandler: (_, checked) => this.packageOptions.features.locationDelegation!.enabled = checked })} - ` : html``} + ` : null} ${this.isGooglePlayApk ? html` @@ -640,7 +640,7 @@ export class AndroidForm extends AppPackageFormBase { inputHandler: (_, checked) => this.packageOptions.features.playBilling!.enabled = checked })} - ` : html``} + ` : null}
- ` : html``} + ` : null}
${this.renderSigningKeyFields()}` : - html``} + null} diff --git a/apps/pwabuilder/src/script/components/app-header.ts b/apps/pwabuilder/src/script/components/app-header.ts index 87409803c..4eae8f3a7 100644 --- a/apps/pwabuilder/src/script/components/app-header.ts +++ b/apps/pwabuilder/src/script/components/app-header.ts @@ -90,55 +90,73 @@ export class AppHeader extends LitElement { color: black; } - .social-box { + .link { + display: block; + width: 100%; + text-decoration: none; + } + + .link:visited, .link:active, .link:link { + color: #777777; + } + + sl-menu { display: flex; + flex-direction: column; background-color: white; - gap: 2em; + gap: 5px; color: #777777; font-size: 16px; - padding: 1em; - position: relative; + padding: 15px; border-radius: 5px; } - .arrow { - height: 15px; - width: 15px; - transform: rotate(45deg); - background-color: white; - position: absolute; - top: -5px; - right: 45px; - } - - .col { - display: flex; - flex-direction: column; - gap: 15px; + sl-menu-item::part(checked-icon), sl-menu-item::part(submenu-icon) { + display: none; } - .col-header { + sl-menu-item::part(base){ + color: var(--font-color); text-decoration: none; + border-bottom: none; + font-size: 16px; margin: 0; - white-space: nowrap; - font-weight: bold; - color: #777777; + padding: 5px; } - .link { - text-decoration: none; + sl-menu-item::part(base):hover sl-menu-item::part(label) { + background-color: unset; + color: var(--primary-color); } - .link:visited, .link:active, .link:link { - color: #777777; + sl-menu-item:focus-visible::part(base) { + background-color: var(--primary-color); } - .link:hover { - cursor: pointer; - text-decoration: underline; + sl-menu-item:hover::part(base) { + background-color: var(--primary-color); } - + sl-menu-item:focus-visible .link, sl-menu-item:hover .link { + color: #ffffff; + } + + sl-dropdown { + position: relative; + + } + sl-dropdown::part(base){ + box-shadow: 0px 16px 24px 0px #00000026; + } + + .col-header { + text-decoration: none; + margin: 0; + white-space: nowrap; + font-weight: bold; + color: #777777; + padding: 0 5px; + } @media (prefers-color-scheme: light) { header { @@ -224,6 +242,14 @@ export class AppHeader extends LitElement { } } + // hacky work around for clicking links with keyboard that are nested in menu items + // in the future, shoelace may make a thing but for now this works. + handleClickingLink(linkTag: string, analyticsString: string){ + const anchor: HTMLAnchorElement = this.shadowRoot!.querySelector('[data-tag="' + linkTag + '"]')!; + anchor.click(); + recordPWABuilderProcessStep(analyticsString, AnalyticsBehavior.ProcessCheckpoint) + } + render() { return html`
@@ -237,61 +263,68 @@ export class AppHeader extends LitElement { class="nav_link" appearance="hypertext" href="https://docs.pwabuilder.com" - target="__blank" + target="_blank" aria-label="PWABuilder Docs, will open in separate tab" rel="noopener" @click=${() => recordPWABuilderProcessStep(`header.docs_clicked`, AnalyticsBehavior.ProcessCheckpoint)} > Docs - + - + Discord + + +
diff --git a/apps/pwabuilder/src/script/components/manifest-info-card.ts b/apps/pwabuilder/src/script/components/manifest-info-card.ts index d6283404b..880288edf 100644 --- a/apps/pwabuilder/src/script/components/manifest-info-card.ts +++ b/apps/pwabuilder/src/script/components/manifest-info-card.ts @@ -12,15 +12,16 @@ export class ManifestInfoCard extends LitElement { @property({ type: String }) field: string = ""; @property({ type: String }) placement: "" |"top" | "top-start" | "top-end" | "right" | "right-start" | "right-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" = ""; @state() currentlyHovering: boolean = false; + @state() currentlyOpen: boolean = false; + @state() hoverTimer: any; static get styles() { return [ css` - + .mic-wrapper { display: flex; - align-items: center; - justify-content: center; + flex-direction: column; } .info-box { @@ -28,7 +29,9 @@ export class ManifestInfoCard extends LitElement { width: 340px; color: #ffffff; padding: 10px; - border-radius: var(--card-border-radius); + border-radius: 0; + border-top-left-radius: var(--card-border-radius); + border-top-right-radius: var(--card-border-radius); display: flex; flex-direction: column; align-items: center; @@ -73,40 +76,78 @@ export class ManifestInfoCard extends LitElement { align-items: center; justify-content: flex-start; width: 100%; - gap: 15px; margin: 5px 0; } - .mic-actions > * { - color: #ffffff; - font-size: var(--card-body-font-size); - font-weight: bold; - font-family: var(--font-family); - } - - .mic-actions a { + .learn-more { line-height: 17px; + display: block; + width: 100%; } - .mic-actions a:visited, .mic-actions a:active, .mic-actions a:link { + .learn-more:visited, .learn-more:active, .learn-more:link { color: #ffffff; } - .mic-actions button { + .eim { background-color: transparent; border: none; color: #ffffff; padding: 0; text-decoration: underline; - height: 16px; + height: 25px; display: flex; align-items: center; + font-weight: 700; + font-size: 14px; + font-family: var(--font-family); } - .mic-actions button:hover { + .eim:hover { cursor: pointer; } + sl-menu { + background-color: var(--font-color); + border: none; + padding: 10px; + padding-top: 0; + display: flex; + align-items: center; + justify-content: flex-start; + width: 100%; + gap: 15px; + margin: 0; + border-radius: 0; + border-bottom-left-radius: var(--card-border-radius); + border-bottom-right-radius: var(--card-border-radius); + } + + sl-menu-item { + border: 1px solid transparent; + } + + sl-menu-item::part(checked-icon), sl-menu-item::part(submenu-icon) { + display: none; + } + + sl-menu-item::part(base){ + color: #ffffff; + font-size: var(--card-body-font-size); + font-weight: bold; + font-family: var(--font-family); + padding: 0; + text-decoration: underline; + } + + sl-menu-item:hover, sl-menu-item::part(base) { + background-color: unset; + } + + sl-menu-item:focus { + border: 1px solid #ffffff; + } + /* < 480px */ ${smallBreakPoint(css` .info-box{ @@ -171,18 +212,35 @@ export class ManifestInfoCard extends LitElement { composed: true }); if(!entering){ - setTimeout(() => { this.closeTooltip(myEvent) }, 500) + setTimeout(() => { this.closeTooltip(myEvent) }, 250) } else { - this.dispatchEvent(myEvent); + this.hoverTimer = setTimeout(() => { this.dispatchEvent(myEvent) }, 750) } } + handleClick(){ + let tooltip = (this.shadowRoot!.querySelector("sl-dropdown") as unknown as SlDropdown); + if(!tooltip.open){ + tooltip.show(); + } + this.currentlyOpen = tooltip.open; + } + closeTooltip(e: CustomEvent){ if(!this.currentlyHovering){ + clearTimeout(this.hoverTimer); this.dispatchEvent(e); } } + // hacky work around for clicking links with keyboard that are nested in menu items + // in the future, shoelace may make a thing but for now this works. + handleClickingLink(linkTag: string){ + const anchor: HTMLAnchorElement = this.shadowRoot!.querySelector('a[data-tag="' + linkTag + '"]')!; + anchor.click(); + this.trackLearnMoreAnalytics(); + } + render() { return html`
this.handleHover(true)} @mouseleave=${() => this.handleHover(false)}> @@ -201,17 +259,18 @@ export class ManifestInfoCard extends LitElement { html`
- ${`example + ${`example
` : - html`` + null } -
- this.trackLearnMoreAnalytics()}>Learn More - ${manifest_fields[this.field].location ? html`` : html``} -
+
+ + this.handleClickingLink(this.field)}>Learn More + ${manifest_fields[this.field].location ? html` this.openME()}>Edit in Manifest` : null} + ` : html` @@ -227,16 +286,17 @@ export class ManifestInfoCard extends LitElement { html`
- ${`example + ${`example
` : - html`` + null } -
- this.trackLearnMoreAnalytics()}>Learn More - ${manifest_fields[this.field].location ? html`` : html``} -
+ > + + this.handleClickingLink(this.field)}>Learn More + ${manifest_fields[this.field].location ? html` this.openME()}>Edit in Manifest` : null} + `} diff --git a/apps/pwabuilder/src/script/components/publish-pane.ts b/apps/pwabuilder/src/script/components/publish-pane.ts index 4156edc64..62a92edad 100644 --- a/apps/pwabuilder/src/script/components/publish-pane.ts +++ b/apps/pwabuilder/src/script/components/publish-pane.ts @@ -929,7 +929,7 @@ export class PublishPane extends LitElement { return this.platforms.map( platform => html`
- ${platform.title != "iOS" ? html`` : + ${platform.title != "iOS" ? null : html`

Experimental

@@ -1077,7 +1077,7 @@ export class PublishPane extends LitElement {
${this.renderForm()} -
${this.feedbackMessages.length > 0 ? this.feedbackMessages.map((error: TemplateResult) => error) : html``}
+
${this.feedbackMessages.length > 0 ? this.feedbackMessages.map((error: TemplateResult) => error) : null}
${this.renderFormFooter()} ` diff --git a/apps/pwabuilder/src/script/components/share-card.ts b/apps/pwabuilder/src/script/components/share-card.ts index 041baee23..51ef21912 100644 --- a/apps/pwabuilder/src/script/components/share-card.ts +++ b/apps/pwabuilder/src/script/components/share-card.ts @@ -1,4 +1,4 @@ -import { LitElement, TemplateResult, css, html } from 'lit'; +import { LitElement, css, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { smallBreakPoint } from '../utils/css/breakpoints'; import { draw } from '../utils/share-card-helper'; @@ -15,7 +15,6 @@ export class ShareCard extends LitElement { @property() siteName = ""; @state() dataURL = ""; - @state() actionButtons: TemplateResult = html``; @state() canShare: boolean = true; shareCanvas: Ref = createRef(); diff --git a/apps/pwabuilder/src/script/components/sw-info-card.ts b/apps/pwabuilder/src/script/components/sw-info-card.ts index 4df6103ea..00d4cff6a 100644 --- a/apps/pwabuilder/src/script/components/sw-info-card.ts +++ b/apps/pwabuilder/src/script/components/sw-info-card.ts @@ -12,6 +12,7 @@ export class ServiceWorkerInfoCard extends LitElement { @property({ type: String }) field: string = ""; @property({ type: String }) placement: "" |"top" | "top-start" | "top-end" | "right" | "right-start" | "right-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" = ""; @state() currentlyHovering: boolean = false; + @state() hoverTimer: any; static get styles() { return [ @@ -29,6 +30,8 @@ export class ServiceWorkerInfoCard extends LitElement { color: #ffffff; padding: 10px; border-radius: var(--card-border-radius); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; display: flex; flex-direction: column; align-items: center; @@ -68,43 +71,55 @@ export class ServiceWorkerInfoCard extends LitElement { height: auto; } - .mic-actions { + .learn-more { + line-height: 17px; + display: block; + width: 100%; + } + + .learn-more:visited, .learn-more:active, .learn-more:link { + color: #ffffff; + } + + sl-menu { + background-color: var(--font-color); + border: none; + padding: 10px; + padding-top: 0; display: flex; align-items: center; justify-content: flex-start; width: 100%; gap: 15px; - margin: 5px 0; - } - - .mic-actions > * { - color: #ffffff; - font-size: var(--card-body-font-size); - font-weight: bold; - font-family: var(--font-family); + margin: 0; + border-radius: 0; + border-bottom-left-radius: var(--card-border-radius); + border-bottom-right-radius: var(--card-border-radius); } - .mic-actions a { - line-height: 17px; + sl-menu-item { + border: 1px solid transparent; } - .mic-actions a:visited, .mic-actions a:active, .mic-actions a:link { - color: #ffffff; + sl-menu-item::part(checked-icon), sl-menu-item::part(submenu-icon) { + display: none; } - .mic-actions button { - background-color: transparent; - border: none; + sl-menu-item::part(base){ color: #ffffff; + font-size: var(--card-body-font-size); + font-weight: bold; + font-family: var(--font-family); padding: 0; text-decoration: underline; - height: 16px; - display: flex; - align-items: center; } - .mic-actions button:hover { - cursor: pointer; + sl-menu-item:hover, sl-menu-item::part(base) { + background-color: unset; + } + + sl-menu-item:focus { + border: 1px solid #ffffff; } /* < 480px */ @@ -152,19 +167,27 @@ export class ServiceWorkerInfoCard extends LitElement { composed: true }); if(!entering){ - setTimeout(() => { this.closeTooltip(myEvent) }, 500) + setTimeout(() => { this.closeTooltip(myEvent) }, 250) } else { - this.dispatchEvent(myEvent); + this.hoverTimer = setTimeout(() => { this.dispatchEvent(myEvent) }, 750) } - } closeTooltip(e: CustomEvent){ if(!this.currentlyHovering){ + clearTimeout(this.hoverTimer); this.dispatchEvent(e); } } + // hacky work around for clicking links with keyboard that are nested in menu items + // in the future, shoelace may make a thing but for now this works. + handleClickingLink(linkTag: string){ + const anchor: HTMLAnchorElement = this.shadowRoot!.querySelector('a[data-tag="' + linkTag + '"]')!; + anchor.click(); + this.trackLearnMoreAnalytics(); + } + render() { return html`
this.handleHover(true)} @mouseleave=${() => this.handleHover(false)}> @@ -179,11 +202,10 @@ export class ServiceWorkerInfoCard extends LitElement {
${service_worker_fields[this.field].description.map((line: String) => html`

${line}

`)} - -
+ + this.handleClickingLink(this.field)}>Learn More + ` : html` @@ -192,15 +214,14 @@ export class ServiceWorkerInfoCard extends LitElement { class="tooltip" @sl-hide=${() => this.handleHover(false)} > - -
- ${service_worker_fields[this.field].description.map((line: String) => html`

${line}

`)} - - -
- + +
+ ${service_worker_fields[this.field].description.map((line: String) => html`

${line}

`)} +
+ + this.handleClickingLink(this.field)}>Learn More + + ` } diff --git a/apps/pwabuilder/src/script/components/test-publish-pane.ts b/apps/pwabuilder/src/script/components/test-publish-pane.ts index aac06b3a6..7760f3333 100644 --- a/apps/pwabuilder/src/script/components/test-publish-pane.ts +++ b/apps/pwabuilder/src/script/components/test-publish-pane.ts @@ -498,7 +498,7 @@ export class TestPublishPane extends LitElement { return this.platforms.map( platform => html`
- ${platform.title != "iOS" ? html`` : + ${platform.title != "iOS" ? null : html`

Experimental

@@ -543,7 +543,7 @@ export class TestPublishPane extends LitElement { ${this.renderContentCards()}
-
${this.feedbackMessages.length > 0 ? this.feedbackMessages.map((error: TemplateResult) => error) : html``}
+
${this.feedbackMessages.length > 0 ? this.feedbackMessages.map((error: TemplateResult) => error) : null}
diff --git a/apps/pwabuilder/src/script/components/windows-form.ts b/apps/pwabuilder/src/script/components/windows-form.ts index ae25e307d..88eeb18e4 100644 --- a/apps/pwabuilder/src/script/components/windows-form.ts +++ b/apps/pwabuilder/src/script/components/windows-form.ts @@ -335,7 +335,7 @@ export class WindowsForm extends AppPackageFormBase { ${this.customSelected ? html` ${this.renderFormInput(formInput)} - ` : html``} + ` : null}
`; diff --git a/apps/pwabuilder/src/script/pages/app-report.api.ts b/apps/pwabuilder/src/script/pages/app-report.api.ts index fd9c8b41f..d2265c5df 100644 --- a/apps/pwabuilder/src/script/pages/app-report.api.ts +++ b/apps/pwabuilder/src/script/pages/app-report.api.ts @@ -4,6 +4,7 @@ import { getHeaders } from '../utils/platformTrackingHeaders'; export type ReportAudit = { audits: { isOnHttps: { score: boolean }, + noMixedContent: { score: boolean }, installableManifest: { score: boolean, details: { url?: string } @@ -19,7 +20,8 @@ export type ReportAudit = { detectedSignsOfLogic: boolean, raw?: string[] } } - }, + }, + offlineSupport: { score: boolean }, appleTouchIcon: { score: boolean }, maskableIcon: { score: boolean }, splashScreen: { score: boolean }, diff --git a/apps/pwabuilder/src/script/pages/app-report.helper.ts b/apps/pwabuilder/src/script/pages/app-report.helper.ts index ec20a92d8..e52d8f7bc 100644 --- a/apps/pwabuilder/src/script/pages/app-report.helper.ts +++ b/apps/pwabuilder/src/script/pages/app-report.helper.ts @@ -25,7 +25,7 @@ export async function processManifest(appUrl: string, manifestArtifact?: ReportA return manifestContext; } -export function processServiceWorker(serviceWorker?: ReportAudit['audits']['serviceWorker']/*,installable?: boolean*/): Array { +export function processServiceWorker(serviceWorker?: ReportAudit['audits']['serviceWorker'], offline?: ReportAudit['audits']['offlineSupport']/*,installable?: boolean*/): Array { console.info('Testing Service Worker'); const swFeatures = serviceWorker?.details?.features || null; @@ -54,6 +54,12 @@ export function processServiceWorker(serviceWorker?: ReportAudit['audits']['serv infoString: swFeatures?.detectedPushRegistration ? 'Uses Push Notifications' : 'Does not use Push Notifications', category: 'optional', member: "push_notifications" + }, + { + result: offline?.score || false, + infoString: offline?.score ? 'Has offline support' : 'Does not have offline support', + category: 'optional', + member: "offline_support" }, ]; // TODO: move installability from here @@ -75,7 +81,7 @@ export function processServiceWorker(serviceWorker?: ReportAudit['audits']['serv // TODO: Adjust this to use the new security audits // Installable can't be not on https, probably mixed content due redirects. const isOnHttps = audits?.isOnHttps?.score || audits?.installableManifest?.score || false; - const noMixedContent = audits?.isOnHttps?.score || false; + const noMixedContent = audits?.noMixedContent?.score || false; const organizedResults = [ { diff --git a/apps/pwabuilder/src/script/pages/app-report.ts b/apps/pwabuilder/src/script/pages/app-report.ts index 7a11e8691..65a303e6a 100644 --- a/apps/pwabuilder/src/script/pages/app-report.ts +++ b/apps/pwabuilder/src/script/pages/app-report.ts @@ -119,7 +119,8 @@ export class AppReport extends LitElement { @state() secDataLoading: boolean = true; - @state() showSecurityBanner: boolean = false; + @state() showSecurityErrorBanner: boolean = false; + @state() showSecurityWarningBanner: boolean = false; @state() securityIssues: string[] = []; @state() enhancementTotalScore: number = 0; @@ -660,11 +661,21 @@ export class AppReport extends LitElement { border-left: 4px solid var(--error-color); } + .type-warning { + align-items: flex-start; + background-color: var(--warning-accent-color); + border-left: 4px solid var(--warning-color); + } + .feedback-holder p { margin: 0; font-size: 14px; } + .feedback-holder img { + margin-top: 3px; + } + .error-title { font-weight: bold; } @@ -1005,10 +1016,18 @@ export class AppReport extends LitElement { font-weight: bold; } + .indicator:focus { + outline: 2px solid var(--primary-color); + } + .indicator.selected { background-color: var(--primary-color) } + .indicator.selected:focus { + outline: 2px solid #000000; + } + .indicator.selected p { color: #ffffff; } @@ -1117,6 +1136,11 @@ export class AppReport extends LitElement { margin-top: auto; } + #sw-header arrow-link { + margin: 0; + margin-top: auto; + } + /* Sec Card */ /* Classes used widely */ @@ -1286,6 +1310,10 @@ export class AppReport extends LitElement { width: 66%; margin-top: auto; } + #sec-header arrow-link { + margin: 0; + margin-top: auto; + } .icons-holder { display: grid; @@ -2079,6 +2107,7 @@ export class AppReport extends LitElement { FindServiceWorker(url).then( async (result) => { if (result?.content?.url && !this.reportAudit?.audits?.serviceWorker?.score) { await AuditServiceWorker(result.content.url).then( async (result) => { + console.log("content:", result.content); findersResults.workerTodos = await this.testServiceWorker(processServiceWorker(result.content)); this.allTodoItems.push(...findersResults.workerTodos); this.requestUpdate(); @@ -2135,7 +2164,7 @@ export class AppReport extends LitElement { } // TODO: move installability score to different place - this.allTodoItems.push(...await this.testServiceWorker(processServiceWorker(this.reportAudit?.audits?.serviceWorker))), + this.allTodoItems.push(...await this.testServiceWorker(processServiceWorker(this.reportAudit?.audits?.serviceWorker, this.reportAudit!.audits!.offlineSupport))), this.allTodoItems.push(...await this.testSecurity(processSecurity(this.reportAudit?.audits))); this.filteredTodoItems = this.allTodoItems; this.canPackage = this.canPackageList[0] && this.canPackageList[1] && this.canPackageList[2]; @@ -2174,6 +2203,8 @@ export class AppReport extends LitElement { this.manifestTotalScore = this.validationResults.length; this.manifestValidCounter = 0; this.manifestRequiredCounter = 0; + this.enhancementTotalScore = 0; + this.manifestRecCounter = 0; this.validationResults.forEach((test: Validation) => { if(test.valid){ @@ -2293,13 +2324,16 @@ export class AppReport extends LitElement { securityTests.forEach((result: any) => { if(!result.result){ - this.showSecurityBanner = true; + if(result.member === "https"){ + this.showSecurityErrorBanner = true; + } else if(result.member === "mixed_content") { + this.showSecurityWarningBanner = true; + } todos.push({"card": "security", "field": result.member, "fix": result.infoString, "status": "required"}); } - }) - - this.canPackageList[2] = !this.showConfirmationModal; + }); + this.canPackageList[2] = !this.showSecurityErrorBanner; this.secDataLoading = false; @@ -2375,6 +2409,7 @@ export class AppReport extends LitElement { this.swValidCounter = 0; this.swTotalScore = 0; this.swRequiredCounter = 0; + this.enhancementTotalScore = 0; // reset todo lsit this.allTodoItems = []; @@ -2384,6 +2419,10 @@ export class AppReport extends LitElement { this.recMissingFields = []; this.optMissingFields = []; + // reset results + this.validationResults = []; + this.serviceWorkerResults = []; + // activate loaders this.manifestDataLoading = true; this.swDataLoading = true; @@ -2851,7 +2890,6 @@ export class AppReport extends LitElement { e.detail.tooltip.hide(); this.openTooltips = []; } - } closeTooltipOnScroll() { @@ -3000,7 +3038,7 @@ export class AppReport extends LitElement { - ${this.showSecurityBanner ? + ${this.showSecurityErrorBanner ? html`
- ${this.requiredTodos.length > 0 ? this.requiredTodos.map((todo: TemplateResult) => todo) : html``} + ${this.requiredTodos.length > 0 ? this.requiredTodos.map((todo: TemplateResult) => todo) : null}
- ${this.enhancementsTodos.length > 0 ? this.enhancementsTodos.map((todo: TemplateResult) => todo) : html``} + ${this.enhancementsTodos.length > 0 ? this.enhancementsTodos.map((todo: TemplateResult) => todo) : null}
` } - ` : html``} + ` : null} ` : - html`` + null } ${ !this.userSignedIn ? html` @@ -922,7 +922,7 @@ export class AppToken extends LitElement {
  • Plan to publish an app in the store this calendar year (prior to 12/31/2023 midnight Pacific Standard Time)
  • - ` : html``} + ` : null} ${this.siteURL ? html` ${ !this.userSignedIn ? @@ -965,7 +965,7 @@ export class AppToken extends LitElement { ` } - ` : html``} + ` : null}