From 027326983b7d5e07da9f96f4448bba10ef55ed39 Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Wed, 29 Mar 2023 13:27:46 +0200 Subject: [PATCH 01/12] Reuse key in mapped type --- src/printer/fetchFns/header/printFnHeader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/printer/fetchFns/header/printFnHeader.ts b/src/printer/fetchFns/header/printFnHeader.ts index 5a7a088..ee12777 100644 --- a/src/printer/fetchFns/header/printFnHeader.ts +++ b/src/printer/fetchFns/header/printFnHeader.ts @@ -18,7 +18,7 @@ export const printFnHeader = ({ operations["${operationId}"], "requestBody" >]: Exclude< - operations["${operationId}"]["requestBody"], + operations["${operationId}"][P], undefined >["content"]["${reqContentType}"]; }` From e7202ee217db83c1a27495d1f208c14a6856a0fa Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Wed, 29 Mar 2023 13:29:05 +0200 Subject: [PATCH 02/12] Bump packages --- package-lock.json | 281 +++++++++++++++++++++++----------------------- package.json | 10 +- 2 files changed, 147 insertions(+), 144 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4b7a5b..071cbd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,13 +17,13 @@ "openapi-fetch-codegen": "bin/cli.js" }, "devDependencies": { - "@types/node": "^18.15.5", + "@types/node": "^18.15.11", "@types/yargs-parser": "^21.0.0", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "eslint": "^8.36.0", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", + "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", - "prettier": "^2.8.6", + "prettier": "^2.8.7", "rimraf": "^4.4.1", "typescript": "^5.0.2" }, @@ -74,14 +74,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -97,9 +97,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -194,9 +194,9 @@ } }, "node_modules/@types/node": { - "version": "18.15.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", - "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", "dev": true }, "node_modules/@types/semver": { @@ -212,15 +212,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -246,14 +246,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" }, "engines": { @@ -273,13 +273,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -290,13 +290,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -317,9 +317,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -330,13 +330,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -357,17 +357,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -405,12 +405,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -665,15 +665,15 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -684,8 +684,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -747,12 +747,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/strip-ansi": { @@ -768,14 +771,14 @@ } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1505,9 +1508,9 @@ } }, "node_modules/prettier": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", - "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -1851,14 +1854,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1868,9 +1871,9 @@ } }, "@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true }, "@humanwhocodes/config-array": { @@ -1943,9 +1946,9 @@ } }, "@types/node": { - "version": "18.15.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", - "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", "dev": true }, "@types/semver": { @@ -1961,15 +1964,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1979,53 +1982,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" } }, "@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2034,17 +2037,17 @@ } }, "@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -2068,12 +2071,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -2255,15 +2258,15 @@ "dev": true }, "eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2274,8 +2277,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2331,20 +2334,20 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true }, "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esquery": { @@ -2887,9 +2890,9 @@ "dev": true }, "prettier": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", - "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "punycode": { diff --git a/package.json b/package.json index 5fcfa35..3577382 100644 --- a/package.json +++ b/package.json @@ -49,13 +49,13 @@ "yargs-parser": "^21.1.1" }, "devDependencies": { - "@types/node": "^18.15.5", + "@types/node": "^18.15.11", "@types/yargs-parser": "^21.0.0", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "eslint": "^8.36.0", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", + "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", - "prettier": "^2.8.6", + "prettier": "^2.8.7", "rimraf": "^4.4.1", "typescript": "^5.0.2" } From 9f2d851249a10909122adcf5bed88ef04eaf414e Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Fri, 31 Mar 2023 18:15:35 +0200 Subject: [PATCH 03/12] Add settings to querySerializer --- src/printer/header/printSerializer.ts | 2 +- src/printer/header/printTypes.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/printer/header/printSerializer.ts b/src/printer/header/printSerializer.ts index 9ede4aa..4480d1e 100644 --- a/src/printer/header/printSerializer.ts +++ b/src/printer/header/printSerializer.ts @@ -11,7 +11,7 @@ const querySerializer = `const serializeQuery = < query: T = {} as T, options: QuerySerializerOptions ) => { - const { encoder } = options; + const { encoder, settings } = options; for (const [key, value] of Object.entries(query)) { if (Array.isArray(value)) { for (const item of value) { diff --git a/src/printer/header/printTypes.ts b/src/printer/header/printTypes.ts index 3653a7f..595c1ca 100644 --- a/src/printer/header/printTypes.ts +++ b/src/printer/header/printTypes.ts @@ -10,5 +10,6 @@ type ExtRequestInit = RequestInit & TBaseUrl; type QuerySerializerOptions = { encoder: T; + settings?: Record; };`; }; From 2b3485d9687af7236417c44913ebcac4333c6b1b Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Fri, 31 Mar 2023 18:49:40 +0200 Subject: [PATCH 04/12] Extract encoding object --- src/printer/fetchFns/body/printHeaders.ts | 14 +++++++------- src/printer/fetchFns/body/printOptions.ts | 14 +++++++------- src/printer/fetchFns/header/printFnHeader.ts | 6 +++--- src/printer/header/printSerializer.ts | 2 +- src/printer/header/printTypes.ts | 2 +- src/transformer/operations/buildOperations.ts | 2 +- .../operations/getReqSortedContentType.ts | 11 +++++++++-- src/utils/types.ts | 3 +++ 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/printer/fetchFns/body/printHeaders.ts b/src/printer/fetchFns/body/printHeaders.ts index 1f88214..98f9b88 100644 --- a/src/printer/fetchFns/body/printHeaders.ts +++ b/src/printer/fetchFns/body/printHeaders.ts @@ -2,34 +2,34 @@ import type { TransformedOperation } from "../../../transformer/operations/build import { OMITTABLE_REQ_CONTENT_TYPES } from "../../../utils/constants.js"; export const printHeaders = ({ - reqContentType, + reqBody, responsesWithContentType, }: TransformedOperation) => { return `const clonedConfig = structuredClone(config); const { baseUrl, headers: configHeaders, ...rest } = clonedConfig; -const headers = ${getHeaders(reqContentType, responsesWithContentType)}`; +const headers = ${getHeaders(reqBody, responsesWithContentType)}`; }; const getHeaders = ( - reqContentType: TransformedOperation["reqContentType"], + reqBody: TransformedOperation["reqBody"], responsesWithContentType: TransformedOperation["responsesWithContentType"] ) => { const hasNonOmittableReqContentType = Boolean( - reqContentType && + reqBody && !OMITTABLE_REQ_CONTENT_TYPES[ - reqContentType as keyof typeof OMITTABLE_REQ_CONTENT_TYPES + reqBody.contentType as keyof typeof OMITTABLE_REQ_CONTENT_TYPES ] ); if (hasNonOmittableReqContentType && responsesWithContentType.size) { return `new Headers({ "Accept": "${getAcceptValue(responsesWithContentType)}", - "Content-Type": "${reqContentType}", + "Content-Type": "${reqBody?.contentType}", })`; } else if (hasNonOmittableReqContentType && !responsesWithContentType.size) { return `new Headers({ - "Content-Type": "${reqContentType}", + "Content-Type": "${reqBody?.contentType}", })`; } else if (!hasNonOmittableReqContentType && responsesWithContentType.size) { return `new Headers({ diff --git a/src/printer/fetchFns/body/printOptions.ts b/src/printer/fetchFns/body/printOptions.ts index 7347c4b..0b18448 100644 --- a/src/printer/fetchFns/body/printOptions.ts +++ b/src/printer/fetchFns/body/printOptions.ts @@ -4,12 +4,12 @@ import { indt, nl } from "../../../utils/format.js"; export const printOptions = ({ method, - reqContentType, + reqBody, parameterTypes, }: TransformedOperation) => { let optionsProps = `method: "${method}",`; optionsProps += getHeadersProp(parameterTypes); - optionsProps += getBodyProp(reqContentType); + optionsProps += getBodyProp(reqBody); return `const options: RequestInit = { ${indt(optionsProps)} @@ -28,15 +28,15 @@ const getHeadersProp = ( return `${nl()}headers: serializeHeaders(headers, configHeaders, params.header),`; }; -const getBodyProp = ( - reqContentType: TransformedOperation["reqContentType"] -) => { +const getBodyProp = (reqContentType: TransformedOperation["reqBody"]) => { if (!reqContentType) { return ""; } - if (isHandledContentType(reqContentType)) { - return `${nl()}body: ${REQ_BODY_CONTENT_TYPE_DICT[reqContentType]},`; + if (isHandledContentType(reqContentType.contentType)) { + return `${nl()}body: ${ + REQ_BODY_CONTENT_TYPE_DICT[reqContentType.contentType] + },`; } return `${nl()}body: params.requestBody,`; diff --git a/src/printer/fetchFns/header/printFnHeader.ts b/src/printer/fetchFns/header/printFnHeader.ts index ee12777..cc07d80 100644 --- a/src/printer/fetchFns/header/printFnHeader.ts +++ b/src/printer/fetchFns/header/printFnHeader.ts @@ -4,7 +4,7 @@ export const printFnHeader = ({ operationId, hasParameters, parameterTypes, - reqContentType, + reqBody, }: TransformedOperation) => { const parametersTypeRef = hasParameters ? parameterTypes.cookie @@ -12,7 +12,7 @@ export const printFnHeader = ({ : `operations["${operationId}"]["parameters"]` : ""; - const reqBodyTypeRef = reqContentType + const reqBodyTypeRef = reqBody ? `{ [P in keyof Pick< operations["${operationId}"], @@ -20,7 +20,7 @@ export const printFnHeader = ({ >]: Exclude< operations["${operationId}"][P], undefined - >["content"]["${reqContentType}"]; + >["content"]["${reqBody.contentType}"]; }` : ""; diff --git a/src/printer/header/printSerializer.ts b/src/printer/header/printSerializer.ts index 4480d1e..4fc7343 100644 --- a/src/printer/header/printSerializer.ts +++ b/src/printer/header/printSerializer.ts @@ -11,7 +11,7 @@ const querySerializer = `const serializeQuery = < query: T = {} as T, options: QuerySerializerOptions ) => { - const { encoder, settings } = options; + const { encoder, encoding } = options; for (const [key, value] of Object.entries(query)) { if (Array.isArray(value)) { for (const item of value) { diff --git a/src/printer/header/printTypes.ts b/src/printer/header/printTypes.ts index 595c1ca..6a355b0 100644 --- a/src/printer/header/printTypes.ts +++ b/src/printer/header/printTypes.ts @@ -10,6 +10,6 @@ type ExtRequestInit = RequestInit & TBaseUrl; type QuerySerializerOptions = { encoder: T; - settings?: Record; + encoding: Record; };`; }; diff --git a/src/transformer/operations/buildOperations.ts b/src/transformer/operations/buildOperations.ts index e96f9ec..ba9f872 100644 --- a/src/transformer/operations/buildOperations.ts +++ b/src/transformer/operations/buildOperations.ts @@ -28,7 +28,7 @@ export const buildOperations = (spec: OpenAPIObj) => { parameterTypes: getParameterTypes( methodSchema.parameters as ParameterObj[] | undefined ), - reqContentType: getReqSortedContentType( + reqBody: getReqSortedContentType( methodSchema.requestBody as RequestBodyObj | undefined ), responsesWithContentType: getResWithSortedContentType( diff --git a/src/transformer/operations/getReqSortedContentType.ts b/src/transformer/operations/getReqSortedContentType.ts index 7c6c0cd..e6da19e 100644 --- a/src/transformer/operations/getReqSortedContentType.ts +++ b/src/transformer/operations/getReqSortedContentType.ts @@ -1,5 +1,5 @@ import { PREFERRED_REQ_CONTENT_TYPES } from "../../utils/constants.js"; -import type { RequestBodyObj } from "../../utils/types.js"; +import type { MediaTypeObj, RequestBodyObj } from "../../utils/types.js"; export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { if (!requestBody?.content) { @@ -16,7 +16,7 @@ export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { (type) => !PREFERRED_REQ_CONTENT_TYPES.includes(type) ); - return availableTypes + const contentType = availableTypes .sort( (a, z) => PREFERRED_REQ_CONTENT_TYPES.indexOf(a) - @@ -24,4 +24,11 @@ export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { ) .concat(remainingTypes) .at(0) as string; + + const mediaTypeObj = requestBody.content[contentType] as MediaTypeObj; + + return { + contentType, + encoding: mediaTypeObj.encoding?.[contentType] ?? null, + } as const; }; diff --git a/src/utils/types.ts b/src/utils/types.ts index 534b254..2b2655b 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -7,6 +7,7 @@ import type { ResponsesObject, ResponseObject, OpenAPITSOptions, + MediaTypeObject, } from "openapi-typescript"; export type OpenAPIObj = OpenAPI3; @@ -17,6 +18,8 @@ export type ParameterObj = ParameterObject; export type RequestBodyObj = RequestBodyObject; +export type MediaTypeObj = MediaTypeObject; + export type ResponsesObj = ResponsesObject; export type ResponseObj = ResponseObject; From 5c9f33301cc74e39a44b3ea42c6a41dba05fc8cf Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Fri, 31 Mar 2023 19:00:01 +0200 Subject: [PATCH 05/12] Fix types --- src/printer/header/printTypes.ts | 2 +- src/transformer/operations/getReqSortedContentType.ts | 8 ++++++-- src/utils/types.ts | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/printer/header/printTypes.ts b/src/printer/header/printTypes.ts index 6a355b0..0207f1b 100644 --- a/src/printer/header/printTypes.ts +++ b/src/printer/header/printTypes.ts @@ -10,6 +10,6 @@ type ExtRequestInit = RequestInit & TBaseUrl; type QuerySerializerOptions = { encoder: T; - encoding: Record; + encoding?: Record; };`; }; diff --git a/src/transformer/operations/getReqSortedContentType.ts b/src/transformer/operations/getReqSortedContentType.ts index e6da19e..1cef3d6 100644 --- a/src/transformer/operations/getReqSortedContentType.ts +++ b/src/transformer/operations/getReqSortedContentType.ts @@ -1,5 +1,9 @@ import { PREFERRED_REQ_CONTENT_TYPES } from "../../utils/constants.js"; -import type { MediaTypeObj, RequestBodyObj } from "../../utils/types.js"; +import type { + EncodingObj, + MediaTypeObj, + RequestBodyObj, +} from "../../utils/types.js"; export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { if (!requestBody?.content) { @@ -29,6 +33,6 @@ export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { return { contentType, - encoding: mediaTypeObj.encoding?.[contentType] ?? null, + encoding: mediaTypeObj.encoding as EncodingObj, } as const; }; diff --git a/src/utils/types.ts b/src/utils/types.ts index 2b2655b..686d0bf 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -8,6 +8,7 @@ import type { ResponseObject, OpenAPITSOptions, MediaTypeObject, + EncodingObject, } from "openapi-typescript"; export type OpenAPIObj = OpenAPI3; @@ -20,6 +21,8 @@ export type RequestBodyObj = RequestBodyObject; export type MediaTypeObj = MediaTypeObject; +export type EncodingObj = EncodingObject; + export type ResponsesObj = ResponsesObject; export type ResponseObj = ResponseObject; From 590fc26f2620383843300b292222a4d3ce67e6bc Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 09:31:37 +0200 Subject: [PATCH 06/12] Fix types properly --- src/transformer/operations/getReqSortedContentType.ts | 10 +++------- src/utils/types.ts | 3 --- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/transformer/operations/getReqSortedContentType.ts b/src/transformer/operations/getReqSortedContentType.ts index 1cef3d6..eea5640 100644 --- a/src/transformer/operations/getReqSortedContentType.ts +++ b/src/transformer/operations/getReqSortedContentType.ts @@ -1,9 +1,5 @@ import { PREFERRED_REQ_CONTENT_TYPES } from "../../utils/constants.js"; -import type { - EncodingObj, - MediaTypeObj, - RequestBodyObj, -} from "../../utils/types.js"; +import type { MediaTypeObj, RequestBodyObj } from "../../utils/types.js"; export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { if (!requestBody?.content) { @@ -29,10 +25,10 @@ export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { .concat(remainingTypes) .at(0) as string; - const mediaTypeObj = requestBody.content[contentType] as MediaTypeObj; + const encoding = (requestBody.content[contentType] as MediaTypeObj).encoding; return { contentType, - encoding: mediaTypeObj.encoding as EncodingObj, + encoding, } as const; }; diff --git a/src/utils/types.ts b/src/utils/types.ts index 686d0bf..2b2655b 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -8,7 +8,6 @@ import type { ResponseObject, OpenAPITSOptions, MediaTypeObject, - EncodingObject, } from "openapi-typescript"; export type OpenAPIObj = OpenAPI3; @@ -21,8 +20,6 @@ export type RequestBodyObj = RequestBodyObject; export type MediaTypeObj = MediaTypeObject; -export type EncodingObj = EncodingObject; - export type ResponsesObj = ResponsesObject; export type ResponseObj = ResponseObject; From a11388023f609b37ec79366026d90e656fbf1b11 Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 09:38:37 +0200 Subject: [PATCH 07/12] Refactor requestBody naming c onvention --- src/printer/fetchFns/body/printHeaders.ts | 14 ++++++------- src/printer/fetchFns/body/printOptions.ts | 12 +++++------ src/printer/fetchFns/header/printFnHeader.ts | 20 +++++++++---------- src/transformer/operations/buildOperations.ts | 4 ++-- ...SortedContentType.ts => getRequestBody.ts} | 2 +- 5 files changed, 26 insertions(+), 26 deletions(-) rename src/transformer/operations/{getReqSortedContentType.ts => getRequestBody.ts} (91%) diff --git a/src/printer/fetchFns/body/printHeaders.ts b/src/printer/fetchFns/body/printHeaders.ts index 98f9b88..71d3e89 100644 --- a/src/printer/fetchFns/body/printHeaders.ts +++ b/src/printer/fetchFns/body/printHeaders.ts @@ -2,34 +2,34 @@ import type { TransformedOperation } from "../../../transformer/operations/build import { OMITTABLE_REQ_CONTENT_TYPES } from "../../../utils/constants.js"; export const printHeaders = ({ - reqBody, + requestBody, responsesWithContentType, }: TransformedOperation) => { return `const clonedConfig = structuredClone(config); const { baseUrl, headers: configHeaders, ...rest } = clonedConfig; -const headers = ${getHeaders(reqBody, responsesWithContentType)}`; +const headers = ${getHeaders(requestBody, responsesWithContentType)}`; }; const getHeaders = ( - reqBody: TransformedOperation["reqBody"], + requestBody: TransformedOperation["requestBody"], responsesWithContentType: TransformedOperation["responsesWithContentType"] ) => { const hasNonOmittableReqContentType = Boolean( - reqBody && + requestBody && !OMITTABLE_REQ_CONTENT_TYPES[ - reqBody.contentType as keyof typeof OMITTABLE_REQ_CONTENT_TYPES + requestBody.contentType as keyof typeof OMITTABLE_REQ_CONTENT_TYPES ] ); if (hasNonOmittableReqContentType && responsesWithContentType.size) { return `new Headers({ "Accept": "${getAcceptValue(responsesWithContentType)}", - "Content-Type": "${reqBody?.contentType}", + "Content-Type": "${requestBody?.contentType}", })`; } else if (hasNonOmittableReqContentType && !responsesWithContentType.size) { return `new Headers({ - "Content-Type": "${reqBody?.contentType}", + "Content-Type": "${requestBody?.contentType}", })`; } else if (!hasNonOmittableReqContentType && responsesWithContentType.size) { return `new Headers({ diff --git a/src/printer/fetchFns/body/printOptions.ts b/src/printer/fetchFns/body/printOptions.ts index 0b18448..aead2f8 100644 --- a/src/printer/fetchFns/body/printOptions.ts +++ b/src/printer/fetchFns/body/printOptions.ts @@ -4,12 +4,12 @@ import { indt, nl } from "../../../utils/format.js"; export const printOptions = ({ method, - reqBody, + requestBody, parameterTypes, }: TransformedOperation) => { let optionsProps = `method: "${method}",`; optionsProps += getHeadersProp(parameterTypes); - optionsProps += getBodyProp(reqBody); + optionsProps += getBodyProp(requestBody); return `const options: RequestInit = { ${indt(optionsProps)} @@ -28,14 +28,14 @@ const getHeadersProp = ( return `${nl()}headers: serializeHeaders(headers, configHeaders, params.header),`; }; -const getBodyProp = (reqContentType: TransformedOperation["reqBody"]) => { - if (!reqContentType) { +const getBodyProp = (requestBody: TransformedOperation["requestBody"]) => { + if (!requestBody) { return ""; } - if (isHandledContentType(reqContentType.contentType)) { + if (isHandledContentType(requestBody.contentType)) { return `${nl()}body: ${ - REQ_BODY_CONTENT_TYPE_DICT[reqContentType.contentType] + REQ_BODY_CONTENT_TYPE_DICT[requestBody.contentType] },`; } diff --git a/src/printer/fetchFns/header/printFnHeader.ts b/src/printer/fetchFns/header/printFnHeader.ts index cc07d80..dc4fcae 100644 --- a/src/printer/fetchFns/header/printFnHeader.ts +++ b/src/printer/fetchFns/header/printFnHeader.ts @@ -4,7 +4,7 @@ export const printFnHeader = ({ operationId, hasParameters, parameterTypes, - reqBody, + requestBody, }: TransformedOperation) => { const parametersTypeRef = hasParameters ? parameterTypes.cookie @@ -12,7 +12,7 @@ export const printFnHeader = ({ : `operations["${operationId}"]["parameters"]` : ""; - const reqBodyTypeRef = reqBody + const requestBodyTypeRef = requestBody ? `{ [P in keyof Pick< operations["${operationId}"], @@ -20,11 +20,11 @@ export const printFnHeader = ({ >]: Exclude< operations["${operationId}"][P], undefined - >["content"]["${reqBody.contentType}"]; + >["content"]["${requestBody.contentType}"]; }` : ""; - const params = getParams(parametersTypeRef, reqBodyTypeRef); + const params = getParams(parametersTypeRef, requestBodyTypeRef); const args = params ? `${params} @@ -36,13 +36,13 @@ export const printFnHeader = ({ ) => {`; }; -const getParams = (parametersTypeRef: string, reqBodyTypeRef: string) => { - if (parametersTypeRef && !reqBodyTypeRef) { +const getParams = (parametersTypeRef: string, requestBodyTypeRef: string) => { + if (parametersTypeRef && !requestBodyTypeRef) { return `params: ${parametersTypeRef},`; - } else if (!parametersTypeRef && reqBodyTypeRef) { - return `params: ${reqBodyTypeRef},`; - } else if (parametersTypeRef && reqBodyTypeRef) { - return `params: ${parametersTypeRef} & ${reqBodyTypeRef},`; + } else if (!parametersTypeRef && requestBodyTypeRef) { + return `params: ${requestBodyTypeRef},`; + } else if (parametersTypeRef && requestBodyTypeRef) { + return `params: ${parametersTypeRef} & ${requestBodyTypeRef},`; } else { return ""; } diff --git a/src/transformer/operations/buildOperations.ts b/src/transformer/operations/buildOperations.ts index ba9f872..949b99d 100644 --- a/src/transformer/operations/buildOperations.ts +++ b/src/transformer/operations/buildOperations.ts @@ -6,7 +6,7 @@ import type { RequestBodyObj, } from "../../utils/types.js"; import { getParameterTypes } from "./getParameterTypes.js"; -import { getReqSortedContentType } from "./getReqSortedContentType.js"; +import { getRequestBody } from "./getRequestBody.js"; import { getResWithSortedContentType } from "./getResWithSortedContentType.js"; export const buildOperations = (spec: OpenAPIObj) => { @@ -28,7 +28,7 @@ export const buildOperations = (spec: OpenAPIObj) => { parameterTypes: getParameterTypes( methodSchema.parameters as ParameterObj[] | undefined ), - reqBody: getReqSortedContentType( + requestBody: getRequestBody( methodSchema.requestBody as RequestBodyObj | undefined ), responsesWithContentType: getResWithSortedContentType( diff --git a/src/transformer/operations/getReqSortedContentType.ts b/src/transformer/operations/getRequestBody.ts similarity index 91% rename from src/transformer/operations/getReqSortedContentType.ts rename to src/transformer/operations/getRequestBody.ts index eea5640..7c88389 100644 --- a/src/transformer/operations/getReqSortedContentType.ts +++ b/src/transformer/operations/getRequestBody.ts @@ -1,7 +1,7 @@ import { PREFERRED_REQ_CONTENT_TYPES } from "../../utils/constants.js"; import type { MediaTypeObj, RequestBodyObj } from "../../utils/types.js"; -export const getReqSortedContentType = (requestBody?: RequestBodyObj) => { +export const getRequestBody = (requestBody?: RequestBodyObj) => { if (!requestBody?.content) { return null; } From 42ddd480718345e26b11dee99a546462d2a79fbf Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 09:42:20 +0200 Subject: [PATCH 08/12] Bump packages --- package-lock.json | 44 ++++++++++++++++++++++---------------------- package.json | 4 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 071cbd3..75ba7ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "^10.1.0", - "openapi-typescript": "^6.2.0", + "openapi-typescript": "^6.2.1", "yargs-parser": "^21.1.1" }, "bin": { @@ -25,7 +25,7 @@ "eslint-config-prettier": "^8.8.0", "prettier": "^2.8.7", "rimraf": "^4.4.1", - "typescript": "^5.0.2" + "typescript": "^5.0.3" }, "engines": { "node": ">=18" @@ -1329,15 +1329,15 @@ } }, "node_modules/openapi-typescript": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.2.0.tgz", - "integrity": "sha512-d1HF70HCUnU+g9hgX5X3MJ+BMgwX16fzwD6mkyfNqdxXuOTOSkm+O+aaFqLNX13aFbCylz4m2WiVe4viAShxiQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.2.1.tgz", + "integrity": "sha512-l0u3fWE7vOCSWl/FxNcB3zu/jDqi/NUCP7MSbffpCZdBwQAbljHbo+CAjPXpf47SAVE+F7ZQKOew+pnXfV1oGA==", "dependencies": { "ansi-colors": "^4.1.3", "fast-glob": "^3.2.12", "js-yaml": "^4.1.0", "supports-color": "^9.3.1", - "undici": "^5.20.0", + "undici": "^5.21.0", "yargs-parser": "^21.1.1" }, "bin": { @@ -1748,9 +1748,9 @@ } }, "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", + "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -1761,9 +1761,9 @@ } }, "node_modules/undici": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", - "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", + "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", "dependencies": { "busboy": "^1.6.0" }, @@ -2768,15 +2768,15 @@ } }, "openapi-typescript": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.2.0.tgz", - "integrity": "sha512-d1HF70HCUnU+g9hgX5X3MJ+BMgwX16fzwD6mkyfNqdxXuOTOSkm+O+aaFqLNX13aFbCylz4m2WiVe4viAShxiQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.2.1.tgz", + "integrity": "sha512-l0u3fWE7vOCSWl/FxNcB3zu/jDqi/NUCP7MSbffpCZdBwQAbljHbo+CAjPXpf47SAVE+F7ZQKOew+pnXfV1oGA==", "requires": { "ansi-colors": "^4.1.3", "fast-glob": "^3.2.12", "js-yaml": "^4.1.0", "supports-color": "^9.3.1", - "undici": "^5.20.0", + "undici": "^5.21.0", "yargs-parser": "^21.1.1" }, "dependencies": { @@ -3029,15 +3029,15 @@ "dev": true }, "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", + "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", "dev": true }, "undici": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", - "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", + "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", "requires": { "busboy": "^1.6.0" } diff --git a/package.json b/package.json index 3577382..4e1b5d6 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "homepage": "https://github.com/marcomuser/openapi-fetch-codegen#readme", "dependencies": { "@apidevtools/json-schema-ref-parser": "^10.1.0", - "openapi-typescript": "^6.2.0", + "openapi-typescript": "^6.2.1", "yargs-parser": "^21.1.1" }, "devDependencies": { @@ -57,6 +57,6 @@ "eslint-config-prettier": "^8.8.0", "prettier": "^2.8.7", "rimraf": "^4.4.1", - "typescript": "^5.0.2" + "typescript": "^5.0.3" } } From caadc874bfa75fb49aa2a26a5131368b00003ede Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 10:27:16 +0200 Subject: [PATCH 09/12] Add encoding argument to requestBody serialization --- src/printer/fetchFns/body/printOptions.ts | 8 ++++++++ src/printer/header/printTypes.ts | 2 +- src/utils/constants.ts | 14 ++++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/printer/fetchFns/body/printOptions.ts b/src/printer/fetchFns/body/printOptions.ts index aead2f8..907603b 100644 --- a/src/printer/fetchFns/body/printOptions.ts +++ b/src/printer/fetchFns/body/printOptions.ts @@ -34,6 +34,14 @@ const getBodyProp = (requestBody: TransformedOperation["requestBody"]) => { } if (isHandledContentType(requestBody.contentType)) { + if ( + requestBody.contentType === "multipart/form-data" || + requestBody.contentType === "application/x-www-form-urlencoded" + ) { + return `${nl()}body: ${REQ_BODY_CONTENT_TYPE_DICT[ + requestBody.contentType + ](requestBody.encoding)},`; + } return `${nl()}body: ${ REQ_BODY_CONTENT_TYPE_DICT[requestBody.contentType] },`; diff --git a/src/printer/header/printTypes.ts b/src/printer/header/printTypes.ts index 0207f1b..d1a0b58 100644 --- a/src/printer/header/printTypes.ts +++ b/src/printer/header/printTypes.ts @@ -10,6 +10,6 @@ type ExtRequestInit = RequestInit & TBaseUrl; type QuerySerializerOptions = { encoder: T; - encoding?: Record; + encoding?: Record; };`; }; diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 26cebe9..b30443b 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -20,14 +20,20 @@ export const PREFERRED_REQ_CONTENT_TYPES = [ "application/x-www-form-urlencoded", ]; +type Encoding = Record; + export const REQ_BODY_CONTENT_TYPE_DICT = { "*/*": "JSON.stringify(params.requestBody)", "application/*": "JSON.stringify(params.requestBody)", "application/json": "JSON.stringify(params.requestBody)", - "application/x-www-form-urlencoded": - "serializeQuery(params.requestBody, { encoder: new URLSearchParams() })", - "multipart/form-data": - "serializeQuery(params.requestBody, { encoder: new FormData() })", + "application/x-www-form-urlencoded": (encoding?: Encoding) => + `serializeQuery(params.requestBody, { encoder: new URLSearchParams(), encoding: ${JSON.stringify( + encoding + )} })`, + "multipart/form-data": (encoding?: Encoding) => + `serializeQuery(params.requestBody, { encoder: new FormData(), encoding: ${JSON.stringify( + encoding + )} })`, "text/html": "params.requestBody", "text/plain": "params.requestBody", "text/plain charset=utf-8": "params.requestBody", From 7e16f85399a971eea6eede4a0ec6d7cb5de4768b Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 10:31:31 +0200 Subject: [PATCH 10/12] Refactor getBodyProp --- src/printer/fetchFns/body/printOptions.ts | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/printer/fetchFns/body/printOptions.ts b/src/printer/fetchFns/body/printOptions.ts index 907603b..6b455b4 100644 --- a/src/printer/fetchFns/body/printOptions.ts +++ b/src/printer/fetchFns/body/printOptions.ts @@ -34,17 +34,12 @@ const getBodyProp = (requestBody: TransformedOperation["requestBody"]) => { } if (isHandledContentType(requestBody.contentType)) { - if ( - requestBody.contentType === "multipart/form-data" || + return requestBody.contentType === "multipart/form-data" || requestBody.contentType === "application/x-www-form-urlencoded" - ) { - return `${nl()}body: ${REQ_BODY_CONTENT_TYPE_DICT[ - requestBody.contentType - ](requestBody.encoding)},`; - } - return `${nl()}body: ${ - REQ_BODY_CONTENT_TYPE_DICT[requestBody.contentType] - },`; + ? `${nl()}body: ${REQ_BODY_CONTENT_TYPE_DICT[requestBody.contentType]( + requestBody.encoding + )},` + : `${nl()}body: ${REQ_BODY_CONTENT_TYPE_DICT[requestBody.contentType]},`; } return `${nl()}body: params.requestBody,`; From 3f8c4dd475a1f9f982f67ae1b7919f4dc6b6f661 Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 11:56:04 +0200 Subject: [PATCH 11/12] Streamline types --- src/utils/constants.ts | 4 ++-- src/utils/types.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index b30443b..db45327 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1,3 +1,5 @@ +import type { Encoding } from "./types.js"; + export const HTTP_VERBS = { get: true, head: true, @@ -20,8 +22,6 @@ export const PREFERRED_REQ_CONTENT_TYPES = [ "application/x-www-form-urlencoded", ]; -type Encoding = Record; - export const REQ_BODY_CONTENT_TYPE_DICT = { "*/*": "JSON.stringify(params.requestBody)", "application/*": "JSON.stringify(params.requestBody)", diff --git a/src/utils/types.ts b/src/utils/types.ts index 2b2655b..12f0d2b 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -20,6 +20,8 @@ export type RequestBodyObj = RequestBodyObject; export type MediaTypeObj = MediaTypeObject; +export type Encoding = MediaTypeObject["encoding"]; + export type ResponsesObj = ResponsesObject; export type ResponseObj = ResponseObject; From 5f88fc54019e5a3c79e5a86a7dcfb44e1de8c3ff Mon Sep 17 00:00:00 2001 From: Marco Muser Date: Sat, 1 Apr 2023 12:03:42 +0200 Subject: [PATCH 12/12] Avoid type errors for additional encoding props --- src/printer/header/printSerializer.ts | 2 +- src/printer/header/printTypes.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/printer/header/printSerializer.ts b/src/printer/header/printSerializer.ts index 4fc7343..1dee5d4 100644 --- a/src/printer/header/printSerializer.ts +++ b/src/printer/header/printSerializer.ts @@ -11,7 +11,7 @@ const querySerializer = `const serializeQuery = < query: T = {} as T, options: QuerySerializerOptions ) => { - const { encoder, encoding } = options; + const { encoder, encoding = {} } = options; for (const [key, value] of Object.entries(query)) { if (Array.isArray(value)) { for (const item of value) { diff --git a/src/printer/header/printTypes.ts b/src/printer/header/printTypes.ts index d1a0b58..10b9dfc 100644 --- a/src/printer/header/printTypes.ts +++ b/src/printer/header/printTypes.ts @@ -10,6 +10,9 @@ type ExtRequestInit = RequestInit & TBaseUrl; type QuerySerializerOptions = { encoder: T; - encoding?: Record; + encoding?: Record< + string, + { explode?: boolean; style?: string; [key: string]: any } + >; };`; };