diff --git a/.nvmrc b/.nvmrc index b6b41bda..6e907bd3 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.17 +18.15 diff --git a/package-lock.json b/package-lock.json index b6470f44..062f3ced 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,10 +1,12 @@ { "name": "@microsoft/vscode-docker-extensibility", + "version": "0.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@microsoft/vscode-docker-extensibility", + "version": "0.0.0", "workspaces": [ "packages/vscode-container-client", "packages/vscode-docker-registries" @@ -182,19 +184,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.38.tgz", - "integrity": "sha512-hjO/0K140An3GWDw2HJfq7gko3wWeznbjXgg+rzPdVzhe198hp4x2i1dgveAOEiFKd8sOilAxzoSJiVv5P/CUg==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dev": true, "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" + "undici-types": "~5.26.4" } }, "node_modules/@types/vscode": { @@ -515,12 +510,6 @@ "node": "*" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -717,18 +706,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -816,15 +793,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -1205,20 +1173,6 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1628,27 +1582,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1817,25 +1750,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/node-fetch": { - "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" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2258,11 +2172,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -2401,6 +2310,12 @@ "node": ">=4.2.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2431,20 +2346,6 @@ "node": ">=14.0.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2584,7 +2485,7 @@ }, "packages/vscode-container-client": { "name": "@microsoft/vscode-container-client", - "version": "0.1.1", + "version": "0.1.2", "license": "See LICENSE in the project root for license information.", "dependencies": { "dayjs": "^1.11.2", @@ -2593,7 +2494,7 @@ "devDependencies": { "@types/chai": "^4.3.0", "@types/mocha": "^9.1.0", - "@types/node": "16.x", + "@types/node": "18.x", "@types/vscode": "1.63.1", "@typescript-eslint/eslint-plugin": "^5.10.2", "@typescript-eslint/parser": "^5.10.2", @@ -2609,18 +2510,16 @@ }, "packages/vscode-docker-registries": { "name": "@microsoft/vscode-docker-registries", - "version": "0.1.7", + "version": "0.1.8", "license": "See LICENSE in the project root for license information.", "dependencies": { - "dayjs": "^1.11.7", - "node-fetch": "^2.6.11" + "dayjs": "^1.11.7" }, "devDependencies": { "@types/chai": "^4.2.14", "@types/chai-as-promised": "^7.1.3", "@types/mocha": "^10.0.0", - "@types/node": "16.x", - "@types/node-fetch": "^2.5.12", + "@types/node": "18.x", "@types/vscode": "1.75.0", "@typescript-eslint/eslint-plugin": "^5.3.1", "@typescript-eslint/parser": "^5.3.1", @@ -2728,7 +2627,7 @@ "requires": { "@types/chai": "^4.3.0", "@types/mocha": "^9.1.0", - "@types/node": "16.x", + "@types/node": "18.x", "@types/vscode": "1.63.1", "@typescript-eslint/eslint-plugin": "^5.10.2", "@typescript-eslint/parser": "^5.10.2", @@ -2750,8 +2649,7 @@ "@types/chai": "^4.2.14", "@types/chai-as-promised": "^7.1.3", "@types/mocha": "^10.0.0", - "@types/node": "16.x", - "@types/node-fetch": "^2.5.12", + "@types/node": "18.x", "@types/vscode": "1.75.0", "@typescript-eslint/eslint-plugin": "^5.3.1", "@typescript-eslint/parser": "^5.3.1", @@ -2760,7 +2658,6 @@ "dayjs": "^1.11.7", "eslint": "^8.2.0", "mocha": "^10.0.0", - "node-fetch": "^2.6.11", "typescript": "^5.0.4" }, "dependencies": { @@ -2862,19 +2759,12 @@ "dev": true }, "@types/node": { - "version": "16.11.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.38.tgz", - "integrity": "sha512-hjO/0K140An3GWDw2HJfq7gko3wWeznbjXgg+rzPdVzhe198hp4x2i1dgveAOEiFKd8sOilAxzoSJiVv5P/CUg==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dev": true, "requires": { - "@types/node": "*", - "form-data": "^3.0.0" + "undici-types": "~5.26.4" } }, "@types/vscode": { @@ -3070,12 +2960,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3224,15 +3108,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3297,12 +3172,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -3597,17 +3466,6 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3908,21 +3766,6 @@ "picomatch": "^2.3.1" } }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4060,14 +3903,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node-fetch": { - "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" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4339,11 +4174,6 @@ "is-number": "^7.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -4431,6 +4261,12 @@ "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", "dev": true }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4458,20 +4294,6 @@ "integrity": "sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==", "dev": true }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index cef38585..c3db0945 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "@microsoft/vscode-docker-extensibility", "author": "Microsoft Corporation", + "version": "0.0.0", "workspaces": [ "packages/vscode-container-client", "packages/vscode-docker-registries" diff --git a/packages/vscode-container-client/package.json b/packages/vscode-container-client/package.json index d1ead620..7382cb22 100644 --- a/packages/vscode-container-client/package.json +++ b/packages/vscode-container-client/package.json @@ -1,7 +1,7 @@ { "name": "@microsoft/vscode-container-client", "author": "Microsoft Corporation", - "version": "0.1.1", + "version": "0.1.2", "description": "Extensibility model for implementing container runtime providers (shared by VS and VS Code)", "license": "See LICENSE in the project root for license information.", "repository": { @@ -29,7 +29,7 @@ "devDependencies": { "@types/chai": "^4.3.0", "@types/mocha": "^9.1.0", - "@types/node": "16.x", + "@types/node": "18.x", "@types/vscode": "1.63.1", "@typescript-eslint/eslint-plugin": "^5.10.2", "@typescript-eslint/parser": "^5.10.2", diff --git a/packages/vscode-docker-registries/package.json b/packages/vscode-docker-registries/package.json index 9ff0e57f..f16448a2 100644 --- a/packages/vscode-docker-registries/package.json +++ b/packages/vscode-docker-registries/package.json @@ -1,7 +1,7 @@ { "name": "@microsoft/vscode-docker-registries", "author": "Microsoft Corporation", - "version": "0.1.7", + "version": "0.1.8", "description": "Extensibility model for contributing registry providers to the Docker extension for Visual Studio Code", "license": "See LICENSE in the project root for license information.", "repository": { @@ -30,8 +30,7 @@ "@types/chai": "^4.2.14", "@types/chai-as-promised": "^7.1.3", "@types/mocha": "^10.0.0", - "@types/node": "16.x", - "@types/node-fetch": "^2.5.12", + "@types/node": "18.x", "@types/vscode": "1.75.0", "@typescript-eslint/eslint-plugin": "^5.3.1", "@typescript-eslint/parser": "^5.3.1", @@ -42,7 +41,6 @@ "typescript": "^5.0.4" }, "dependencies": { - "node-fetch": "^2.6.11", "dayjs": "^1.11.7" } } diff --git a/packages/vscode-docker-registries/src/clients/RegistryV2/RegistryV2DataProvider.ts b/packages/vscode-docker-registries/src/clients/RegistryV2/RegistryV2DataProvider.ts index 671589b0..20d427ae 100644 --- a/packages/vscode-docker-registries/src/clients/RegistryV2/RegistryV2DataProvider.ts +++ b/packages/vscode-docker-registries/src/clients/RegistryV2/RegistryV2DataProvider.ts @@ -117,7 +117,7 @@ export abstract class RegistryV2DataProvider extends CommonRegistryDataProvider public async getImageDigest(item: CommonTag): Promise { const response = await this.getManifestV2(item); - const digest = response.headers['docker-content-digest']; + const digest = response.headers.get('docker-content-digest'); if (!digest) { throw new Error('Could not find digest'); } diff --git a/packages/vscode-docker-registries/src/clients/RegistryV2/registryV2Request.ts b/packages/vscode-docker-registries/src/clients/RegistryV2/registryV2Request.ts index 67893bba..3b7b5830 100644 --- a/packages/vscode-docker-registries/src/clients/RegistryV2/registryV2Request.ts +++ b/packages/vscode-docker-registries/src/clients/RegistryV2/registryV2Request.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import { AuthenticationProvider } from '../../contracts/AuthenticationProvider'; import { isBasicOAuthProvider } from '../../auth/BasicOAuthProvider'; -import { RequestLike, httpRequest } from '../../utils/httpRequest'; +import { HeadersLike, RequestLike, httpRequest } from '../../utils/httpRequest'; import { HttpErrorResponse } from '../../utils/errors'; export interface RegistryV2RequestOptions { @@ -25,7 +25,7 @@ export interface RegistryV2Response { statusText: string; succeeded: boolean; uri: vscode.Uri; - headers: Record; + headers: HeadersLike; body: T | undefined; } @@ -34,8 +34,8 @@ export async function registryV2Request(options: RegistryV2RequestOptions): P const result = await registryV2RequestInternal({ ...options, throwOnFailure: false }); if (result.succeeded) { return result; - } else if (result.status === 401 && result.headers['www-authenticate']) { - options.authenticationProvider.fallback(result.headers['www-authenticate']); + } else if (result.status === 401 && result.headers.get('www-authenticate')) { + options.authenticationProvider.fallback(result.headers.get('www-authenticate') as string); } else { throw new HttpErrorResponse(options.requestUri.toString(), result.status, result.statusText); } @@ -48,17 +48,17 @@ async function registryV2RequestInternal(options: RegistryV2RequestOptions): const query = new URLSearchParams(options.query); const uri = options.requestUri.with({ query: query.toString() }); + const auth = await options.authenticationProvider.getSession(options.scopes, options.sessionOptions); + const request: RequestLike = { headers: { accept: 'application/json', + Authorization: `${auth.type} ${auth.accessToken}`, ...options.headers }, method: options.method, }; - const auth = await options.authenticationProvider.getSession(options.scopes, options.sessionOptions); - request.headers['Authorization'] = `${auth.type} ${auth.accessToken}`; - const response = await httpRequest(uri.toString(true), request, options.throwOnFailure); return { @@ -67,6 +67,6 @@ async function registryV2RequestInternal(options: RegistryV2RequestOptions): succeeded: response.succeeded, uri: uri, headers: response.headers, - body: response.succeeded && (parseInt(response.headers['content-length']) || response.headers['transfer-encoding'] === 'chunked') ? await response.json() as T : undefined, + body: response.succeeded && (parseInt(response.headers.get('content-length') ?? '0') || response.headers.get('transfer-encoding') === 'chunked') ? await response.json() as T : undefined, }; } diff --git a/packages/vscode-docker-registries/src/utils/httpRequest.ts b/packages/vscode-docker-registries/src/utils/httpRequest.ts index 8162cf20..b4e78d94 100644 --- a/packages/vscode-docker-registries/src/utils/httpRequest.ts +++ b/packages/vscode-docker-registries/src/utils/httpRequest.ts @@ -4,11 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { Request, RequestInit, Response, ResponseInit, default as fetch } from 'node-fetch'; import { HttpErrorResponse, UnauthorizedError } from './errors'; -export function getNextLinkFromHeaders(headers: HeadersLike, baseUrl: vscode.Uri): vscode.Uri | undefined { - const linkHeader: string | undefined = headers['link']; +export function getNextLinkFromHeaders(headers: Headers, baseUrl: vscode.Uri): vscode.Uri | undefined { + const linkHeader = headers.get('link'); if (!linkHeader) { return undefined; } @@ -23,43 +22,36 @@ export function getNextLinkFromHeaders(headers: HeadersLike, baseUrl: vscode.Uri return nextLinkUri; } -export type HeadersLike = Record; +export type HeadersLike = Headers; export type RequestLike = RequestInit & { - headers: HeadersLike; + headers: Record; }; -export type ResponseLike = ResponseInit & { +export interface ResponseLike extends Response { headers: HeadersLike; status: number; statusText: string; succeeded: boolean; json: () => Promise; -}; +} export async function httpRequest(url: string, request: RequestLike, throwOnFailure: boolean = true): Promise> { const fetchRequest = new Request(url, request); const response: Response = await fetch(fetchRequest); - const headers: HeadersLike = {}; - for (const [header, value] of response.headers.entries()) { - headers[header] = value; - } - - const succeeded = response.status >= 200 && response.status < 300; - if (throwOnFailure && response.status === 401) { throw new UnauthorizedError(vscode.l10n.t('Request to \'{0}\' failed with response 401: Unauthorized', url)); - } else if (throwOnFailure && !succeeded) { + } else if (throwOnFailure && !response.ok) { throw new HttpErrorResponse(url, response.status, response.statusText); } return { ...response, - headers: headers, + headers: response.headers, // These are getters so we need to call them to get the values status: response.status, statusText: response.statusText, - succeeded: succeeded, - json: response.json.bind(response), + succeeded: response.ok, + json: response.json.bind(response) as () => Promise, }; }