diff --git a/CHANGELOG.md b/CHANGELOG.md index c8d3c02c..99637c15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [3.13.2-next.1](https://github.com/contentful/node-apps-toolkit/compare/v3.13.1...v3.13.2-next.1) (2025-09-26) + + +### Bug Fixes + +* publish next [EXT-6803] ([1aaac78](https://github.com/contentful/node-apps-toolkit/commit/1aaac78311eef9e28e69869dc1d2e2dbfbdf6f7f)) + ## [3.13.1](https://github.com/contentful/node-apps-toolkit/compare/v3.13.0...v3.13.1) (2025-05-28) diff --git a/package-lock.json b/package-lock.json index f54c1720..70bf6d69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@contentful/node-apps-toolkit", - "version": "3.13.1", + "version": "3.13.2-next.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentful/node-apps-toolkit", - "version": "3.13.1", + "version": "3.13.2-next.1", "license": "MIT", "dependencies": { "@types/debug": "^4.1.5", "contentful-management": "^11.6.1", "debug": "^4.2.0", - "got": "^11.7.0", "jsonwebtoken": "^9.0.0", + "ky": "^1.10.0", "lru-cache": "^10.4.3", "runtypes": "^5.0.1" }, @@ -1911,6 +1911,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, "engines": { "node": ">=10" }, @@ -1974,17 +1975,6 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -2009,17 +1999,6 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -2035,11 +2014,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, "node_modules/@types/jsonwebtoken": { "version": "9.0.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", @@ -2049,14 +2023,6 @@ "@types/node": "*" } }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/mocha": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", @@ -2072,6 +2038,7 @@ "version": "22.5.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dev": true, "dependencies": { "undici-types": "~6.19.2" } @@ -2082,14 +2049,6 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/sinon": { "version": "17.0.3", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", @@ -2848,45 +2807,6 @@ "node": ">=8" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -3226,17 +3146,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3654,31 +3563,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -3694,14 +3578,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -3851,14 +3727,6 @@ "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "dev": true }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/env-ci": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.0.0.tgz", @@ -5038,30 +4906,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5216,11 +5060,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -5234,18 +5073,6 @@ "node": ">= 14" } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", @@ -5873,7 +5700,8 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-better-errors": { "version": "1.0.2", @@ -5998,10 +5826,23 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/ky": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.10.0.tgz", + "integrity": "sha512-YRPCzHEWZffbfvmRrfwa+5nwBHwZuYiTrfDX0wuhGBPV0pA/zCqcOq93MDssON/baIkpYbvehIX5aLpMxrRhaA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6502,14 +6343,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -6676,14 +6509,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", @@ -6887,17 +6712,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm": { "version": "10.8.0", "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.0.tgz", @@ -9578,6 +9392,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -9614,14 +9429,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", @@ -10116,15 +9923,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -10170,17 +9968,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10387,11 +10174,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -10401,17 +10183,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -12508,7 +12279,8 @@ "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", @@ -12907,7 +12679,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/xtend": { "version": "4.0.2", diff --git a/package.json b/package.json index 7b86fdb3..eb265fce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentful/node-apps-toolkit", - "version": "3.13.1", + "version": "3.13.2-next.1", "description": "A collection of helpers and utilities for creating NodeJS Contentful Apps", "main": "lib/index.cjs", "module": "lib/index.mjs", @@ -55,8 +55,8 @@ "@types/debug": "^4.1.5", "contentful-management": "^11.6.1", "debug": "^4.2.0", - "got": "^11.7.0", "jsonwebtoken": "^9.0.0", + "ky": "^1.10.0", "lru-cache": "^10.4.3", "runtypes": "^5.0.1" }, diff --git a/src/keys/get-management-token.spec.ts b/src/keys/get-management-token.spec.ts index d0fd9b6d..33e41c27 100644 --- a/src/keys/get-management-token.spec.ts +++ b/src/keys/get-management-token.spec.ts @@ -9,7 +9,7 @@ import { getManagementToken, GetManagementTokenOptions, } from './get-management-token' -import { HttpClient, HttpError, Response } from '../utils' +import { HttpClient, HttpError, Response, Request, ErrorOptions } from '../utils' import { Logger } from '../utils' import { sign } from 'jsonwebtoken' import { LRUCache } from 'lru-cache' @@ -33,7 +33,9 @@ describe('getManagementToken', () => { const mockToken = 'token' const logger = noop as unknown as Logger const post = sinon.stub() - post.resolves({ statusCode: 201, body: JSON.stringify({ token: mockToken }) }) + post.returns({ + json: () => Promise.resolve({ token: mockToken }), + }) const httpClient = { post } as unknown as HttpClient const getManagementToken = createGetManagementToken(logger, httpClient, defaultCache) @@ -55,7 +57,7 @@ describe('getManagementToken', () => { expiresIn: '10 minutes', }) - post.resolves({ statusCode: 201, body: JSON.stringify({ token: mockToken }) }) + post.returns({ json: () => Promise.resolve({ token: mockToken }) }) const httpClient = { post } as unknown as HttpClient const getManagementToken = createGetManagementToken(logger, httpClient, defaultCache) @@ -75,7 +77,7 @@ describe('getManagementToken', () => { expiresIn: '5 minutes', }) - post.resolves({ statusCode: 201, body: JSON.stringify({ token: mockToken }) }) + post.returns({ json: () => Promise.resolve({ token: mockToken }) }) const httpClient = { post } as unknown as HttpClient const cache: LRUCache = new LRUCache({ max: 10 }) const getManagementToken = createGetManagementToken(logger, httpClient, cache) @@ -103,7 +105,7 @@ describe('getManagementToken', () => { const mockToken = 'token' const logger = noop as unknown as Logger const post = sinon.stub() - post.resolves({ statusCode: 201, body: JSON.stringify({ token: mockToken }) }) + post.returns({ json: () => Promise.resolve({ token: mockToken }) }) const httpClient = { post } as unknown as HttpClient const getManagementToken = createGetManagementToken(logger, httpClient, defaultCache) @@ -136,7 +138,16 @@ describe('getManagementToken', () => { describe('when having API problems', () => { it(`throws when API returns an error`, async () => { const logger = noop as unknown as Logger - const post = sinon.stub().rejects(new HttpError({ statusCode: 500 } as unknown as Response)) + const post = sinon.stub().returns({ + json: () => + Promise.reject( + new HttpError( + { statusCode: 500 } as unknown as Response, + {} as unknown as Request, + {} as unknown as ErrorOptions, + ), + ), + }) const httpClient = { post } as unknown as HttpClient const getManagementToken = createGetManagementToken(logger, httpClient, defaultCache) diff --git a/src/keys/get-management-token.ts b/src/keys/get-management-token.ts index 1d62e876..daa33097 100644 --- a/src/keys/get-management-token.ts +++ b/src/keys/get-management-token.ts @@ -58,23 +58,25 @@ const getTokenFromOneTimeToken = async ( log(`Requesting CMA Token with given App Token`) - const response = await http.post( - `spaces/${spaceId}/environments/${environmentId}/app_installations/${appInstallationId}/access_tokens`, - { - headers: { - Authorization: `Bearer ${appToken}`, + const response = await http + .post( + `spaces/${spaceId}/environments/${environmentId}/app_installations/${appInstallationId}/access_tokens`, + { + headers: { + Authorization: `Bearer ${appToken}`, + }, + hooks: { + afterResponse: [validateStatusCode], + }, }, - hooks: { - afterResponse: [validateStatusCode], - }, - }, - ) + ) + .json<{ token: string }>() log( `Successfully retrieved CMA Token for app ${appInstallationId} in space ${spaceId} and environment ${environmentId}`, ) - return JSON.parse(response.body).token + return response.token } /** @@ -147,7 +149,7 @@ export const createGetManagementToken = ( * ~~~ * @category Keys */ -export const getManagementToken = (privateKey: string, opts: GetManagementTokenOptions) => { +export const getManagementToken = async (privateKey: string, opts: GetManagementTokenOptions) => { if ((opts.reuseToken || opts.reuseToken === undefined) && !defaultCache) { defaultCache = new LRUCache({ max: 10 }) } @@ -155,7 +157,7 @@ export const getManagementToken = (privateKey: string, opts: GetManagementTokenO return createGetManagementToken( createLogger({ filename: __filename }), - createHttpClient(httpClientOpts), + await createHttpClient(httpClientOpts), defaultCache!, )(privateKey, opts) } diff --git a/src/utils/http.ts b/src/utils/http.ts index 84450844..70727382 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -1,23 +1,36 @@ -import got, { ExtendOptions, Got, HTTPError, Response as GotResponse } from 'got' +import { + Options, + KyInstance, + HTTPError, + KyResponse, + AfterResponseHook, + KyRequest, + NormalizedOptions, +} from 'ky' const config = { prefixUrl: process.env.BASE_URL || 'https://api.contentful.com', retry: { limit: 3 }, } -export const createHttpClient = (configOverride: ExtendOptions = {}) => { - return got.extend({ ...config, ...configOverride }) +export const createHttpClient = async (configOverride: Options = {}) => { + const { default: ky } = await import('ky') + return ky.extend({ ...config, ...configOverride }) } -export const createValidateStatusCode = (allowedStatusCodes: number[]) => (response: Response) => { - if (!allowedStatusCodes.includes(response.statusCode)) { - console.log(response.body) - throw new HTTPError(response) +export const createValidateStatusCode = + (allowedStatusCodes: number[]): AfterResponseHook => + (request: KyRequest, options: NormalizedOptions, response: KyResponse) => { + if (!allowedStatusCodes.includes(response.status)) { + console.log(response.body) + throw new HTTPError(response, request, options) + } + return response } - return response -} export { HTTPError as HttpError } -export type HttpClient = Got -export type Response = GotResponse +export type HttpClient = KyInstance +export type Request = KyRequest +export type Response = KyResponse +export type ErrorOptions = NormalizedOptions diff --git a/src/utils/index.ts b/src/utils/index.ts index 90726d6f..a759a8b8 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,4 +1,4 @@ -export type { Response, HttpClient } from './http' +export type { Response, HttpClient, Request, ErrorOptions } from './http' export { createHttpClient, createValidateStatusCode, HttpError } from './http' export { createLogger } from './logger' export type { Logger } from './logger' diff --git a/test/integration/keys.test.ts b/test/integration/keys.test.ts index ba658b81..5901bbdf 100644 --- a/test/integration/keys.test.ts +++ b/test/integration/keys.test.ts @@ -32,8 +32,8 @@ describe('Keys Utilities', () => { environmentId, }) - await assert.doesNotReject(() => { - const http = createHttpClient() + await assert.doesNotReject(async () => { + const http = await createHttpClient() return http.get(`spaces/${spaceId}/entries`, { headers: { diff --git a/test/utils.ts b/test/utils.ts index 3962ea92..84756115 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -4,24 +4,26 @@ import base64url from 'base64url' import { createHttpClient, createValidateStatusCode } from '../src/utils' -const http = createHttpClient({ - headers: { - Authorization: `Bearer ${process.env.PERSONAL_ACCESS_TOKEN}`, - }, -}) +const httpFactory = async () => + await createHttpClient({ + headers: { + Authorization: `Bearer ${process.env.PERSONAL_ACCESS_TOKEN}`, + }, + }) export const cleanOldKeys = async () => { const organizationId = process.env.ORGANIZATION_ID const appDefinitionId = process.env.APP_ID - const { body } = await http.get( - `organizations/${organizationId}/app_definitions/${appDefinitionId}/keys` - ) - const fingerprints = JSON.parse(body).items.map((i: any) => i.jwk.x5t) + const http = await httpFactory() + const { items } = await http + .get(`organizations/${organizationId}/app_definitions/${appDefinitionId}/keys`) + .json<{ items: { jwk: { x5t: string } }[] }>() + const fingerprints = items.map((i: any) => i.jwk.x5t) const deleteKeysRequests = fingerprints.map((fingerprint: string) => { return http.delete( - `organizations/${organizationId}/app_definitions/${appDefinitionId}/keys/${fingerprint}` + `organizations/${organizationId}/app_definitions/${appDefinitionId}/keys/${fingerprint}`, ) }) @@ -33,6 +35,7 @@ export const setPublicKey = async (publicKey: Buffer) => { const appDefinitionId = process.env.APP_ID const keyId = base64url(crypto.createHash('sha256').update(publicKey).digest()) + const http = await httpFactory() return http.post(`organizations/${organizationId}/app_definitions/${appDefinitionId}/keys`, { json: { jwk: {