diff --git a/docs/src/pages/reference/configuration/output.md b/docs/src/pages/reference/configuration/output.md index e30b8d8c1..5613178d7 100644 --- a/docs/src/pages/reference/configuration/output.md +++ b/docs/src/pages/reference/configuration/output.md @@ -1726,6 +1726,8 @@ Use this property to add a custom params serializer to all requests that use que If you provide an object you can also add a default property to use an export default function. +If this is not specified, params are serialized as per `axios` default when using `axios`, or by using `URLSearchParams` when using `fetch`. + Example: ```js @@ -1759,9 +1761,10 @@ export const customParamsSerializerFn = ( Type: `Object` -Use this property to add a default params serializer. Current options are: `qs`. +Use this property to decide how params are serialized. This is only taken into account when `paramsSerializer` is not defined. +Currently, only `qs` is the available option. Read more about `qs` and it's settings [here](https://www.npmjs.com/package/qs). -All options are then passed to the chosen serializer. +If this is not specified, params are serialized as per `axios` default when using `axios`, or by using `URLSearchParams` when using `fetch`. Example: diff --git a/packages/fetch/src/index.ts b/packages/fetch/src/index.ts index 1f2f331d1..271199833 100644 --- a/packages/fetch/src/index.ts +++ b/packages/fetch/src/index.ts @@ -12,6 +12,8 @@ import { generateBodyOptions, isObject, resolveRef, + GeneratorDependency, + ClientDependenciesBuilder, } from '@orval/core'; import { PathItemObject, @@ -86,23 +88,30 @@ export const generateRequestFunction = ( normalizedParams.append(key, value === null ? 'null' : value.toString()) }`; - const getUrlFnImplementation = `export const ${getUrlFnName} = (${getUrlFnProps}) => { -${ - queryParams - ? ` const normalizedParams = new URLSearchParams(); + const queryImplementation = queryParams + ? override.paramsSerializer + ? `const normalizedParams = ${override.paramsSerializer.name}(params);` + : override.paramsSerializerOptions?.qs + ? `const normalizedParams = qs.stringify(params, ${JSON.stringify( + override.paramsSerializerOptions!.qs, + )});` + : `const normalizedParams = new URLSearchParams(); Object.entries(params || {}).forEach(([key, value]) => { ${explodeArrayImplementation} ${!isExplodeParametersOnly ? nomalParamsImplementation : ''} });` - : '' -} + : ''; + const returnQueryImplementation = queryParams + ? override.paramsSerializer || override.paramsSerializerOptions?.qs + ? `return normalizedParams ? \`${route}${'?${normalizedParams}'}\` : \`${route}\`` + : `return normalizedParams.size ? \`${route}${'?${normalizedParams.toString()}'}\` : \`${route}\`` + : `return \`${route}\``; - ${ - queryParams - ? `return normalizedParams.size ? \`${route}${'?${normalizedParams.toString()}'}\` : \`${route}\`` - : `return \`${route}\`` - } + const getUrlFnImplementation = `export const ${getUrlFnName} = (${getUrlFnProps}) => { + ${queryImplementation} + + ${returnQueryImplementation} }\n`; const isNdJson = response.contentTypes.some( @@ -235,9 +244,32 @@ export const generateClient: ClientBuilder = (verbOptions, options) => { }; }; +const PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[] = [ + { + exports: [ + { + name: 'qs', + default: true, + values: true, + syntheticDefaultImport: true, + }, + ], + dependency: 'qs', + }, +]; + +const getFetchDependencies: ClientDependenciesBuilder = ( + _: boolean, + hasParamsSerializerOptions: boolean, +) => { + return [ + ...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []), + ]; +}; + const fetchClientBuilder: ClientGeneratorsBuilder = { client: generateClient, - dependencies: () => [], + dependencies: getFetchDependencies, }; export const builder = () => () => fetchClientBuilder; diff --git a/tests/configs/default.config.ts b/tests/configs/default.config.ts index d233eda9f..aed97c011 100644 --- a/tests/configs/default.config.ts +++ b/tests/configs/default.config.ts @@ -209,4 +209,35 @@ export default defineConfig({ target: '../specifications/petstore.yaml', }, }, + paramsSerializer: { + output: { + target: '../generated/default/params-serializer/endpoints.ts', + schemas: '../generated/default/params-serializer/model', + override: { + paramsSerializer: { + path: '../mutators/params-serializer.ts', + name: 'customParamsSerializer', + }, + }, + }, + input: { + target: '../specifications/petstore.yaml', + }, + }, + paramsSerializerOptions: { + output: { + target: '../generated/default/params-serializer-options/endpoints.ts', + schemas: '../generated/default/params-serializer-options/model', + override: { + paramsSerializerOptions: { + qs: { + arrayFormat: 'repeat', + }, + }, + }, + }, + input: { + target: '../specifications/petstore.yaml', + }, + }, }); diff --git a/tests/configs/fetch.config.ts b/tests/configs/fetch.config.ts index a15745c4a..226131625 100644 --- a/tests/configs/fetch.config.ts +++ b/tests/configs/fetch.config.ts @@ -189,6 +189,39 @@ export default defineConfig({ target: '../specifications/parameters.yaml', }, }, + paramsSerializer: { + output: { + target: '../generated/fetch/params-serializer/endpoints.ts', + schemas: '../generated/fetch/params-serializer/model', + client: 'fetch', + override: { + paramsSerializer: { + path: '../mutators/params-serializer.ts', + name: 'customParamsSerializer', + }, + }, + }, + input: { + target: '../specifications/petstore.yaml', + }, + }, + paramsSerializerOptions: { + output: { + target: '../generated/fetch/params-serializer-options/endpoints.ts', + schemas: '../generated/fetch/params-serializer-options/model', + client: 'fetch', + override: { + paramsSerializerOptions: { + qs: { + arrayFormat: 'repeat', + }, + }, + }, + }, + input: { + target: '../specifications/petstore.yaml', + }, + }, importFromSubdirectory: { output: { target: '../generated/fetch/importFromSubdirectory/endpoints.ts', diff --git a/tests/mutators/params-serializer.ts b/tests/mutators/params-serializer.ts new file mode 100644 index 000000000..c233f3a9a --- /dev/null +++ b/tests/mutators/params-serializer.ts @@ -0,0 +1,11 @@ +export const customParamsSerializer = (params: Record): string => { + const normalizedParams = new URLSearchParams(); + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : value.toString()); + } + }); + + return normalizedParams.toString(); +}; diff --git a/tests/package.json b/tests/package.json index e831af783..19609d9ea 100644 --- a/tests/package.json +++ b/tests/package.json @@ -23,6 +23,7 @@ "author": "Victor Bury", "license": "ISC", "devDependencies": { + "@types/qs": "^6", "npm-run-all": "^4.1.5", "orval": "link:../packages/orval/dist", "typescript": "5.3.3" @@ -37,6 +38,7 @@ "@types/react": "18.3.2", "axios": "^0.26.1", "msw": "^2.0.2", + "qs": "^6.13.1", "react": "^18.3.1", "swr": "^2.2.4", "vue": "^3.3.4", diff --git a/tests/yarn.lock b/tests/yarn.lock index 719e027ff..fe8d1f592 100644 --- a/tests/yarn.lock +++ b/tests/yarn.lock @@ -283,6 +283,13 @@ __metadata: languageName: node linkType: hard +"@types/qs@npm:^6": + version: 6.9.17 + resolution: "@types/qs@npm:6.9.17" + checksum: 10c0/a183fa0b3464267f8f421e2d66d960815080e8aab12b9aadab60479ba84183b1cdba8f4eff3c06f76675a8e42fe6a3b1313ea76c74f2885c3e25d32499c17d1b + languageName: node + linkType: hard + "@types/react@npm:18.3.2": version: 18.3.2 resolution: "@types/react@npm:18.3.2" @@ -536,11 +543,13 @@ __metadata: "@tanstack/react-query": "npm:^5.63.0" "@tanstack/svelte-query": "npm:^4.24.9" "@tanstack/vue-query": "npm:^4.22.0" + "@types/qs": "npm:^6" "@types/react": "npm:18.3.2" axios: "npm:^0.26.1" msw: "npm:^2.0.2" npm-run-all: "npm:^4.1.5" orval: "link:../packages/orval/dist" + qs: "npm:^6.13.1" react: "npm:^18.3.1" swr: "npm:^2.2.4" typescript: "npm:5.3.3" @@ -625,6 +634,26 @@ __metadata: languageName: node linkType: hard +"call-bind-apply-helpers@npm:^1.0.1": + version: 1.0.1 + resolution: "call-bind-apply-helpers@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/acb2ab68bf2718e68a3e895f0d0b73ccc9e45b9b6f210f163512ba76f91dab409eb8792f6dae188356f9095747512a3101646b3dea9d37fb8c7c6bf37796d18c + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2": + version: 1.0.3 + resolution: "call-bound@npm:1.0.3" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/45257b8e7621067304b30dbd638e856cac913d31e8e00a80d6cf172911acd057846572d0b256b45e652d515db6601e2974a1b1a040e91b4fc36fb3dd86fa69cf + languageName: node + linkType: hard + "chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -848,6 +877,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -920,6 +960,29 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + languageName: node + linkType: hard + "es-to-primitive@npm:^1.2.1": version: 1.2.1 resolution: "es-to-primitive@npm:1.2.1" @@ -1062,6 +1125,13 @@ __metadata: languageName: node linkType: hard +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -1069,6 +1139,34 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": + version: 1.2.7 + resolution: "get-intrinsic@npm:1.2.7" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.0" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/b475dec9f8bff6f7422f51ff4b7b8d0b68e6776ee83a753c1d627e3008c3442090992788038b37eff72e93e43dceed8c1acbdf2d6751672687ec22127933080d + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + "glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -1093,6 +1191,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.2": version: 4.2.4 resolution: "graceful-fs@npm:4.2.4" @@ -1135,6 +1240,13 @@ __metadata: languageName: node linkType: hard +"has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + "has@npm:^1.0.3": version: 1.0.3 resolution: "has@npm:1.0.3" @@ -1144,6 +1256,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + "headers-polyfill@npm:^4.0.1": version: 4.0.2 resolution: "headers-polyfill@npm:4.0.2" @@ -1501,6 +1622,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + "memorystream@npm:^0.3.1": version: 0.3.1 resolution: "memorystream@npm:0.3.1" @@ -1793,6 +1921,13 @@ __metadata: languageName: node linkType: hard +"object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 + languageName: node + linkType: hard + "object-inspect@npm:^1.7.0": version: 1.7.0 resolution: "object-inspect@npm:1.7.0" @@ -1996,6 +2131,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.13.1": + version: 6.13.1 + resolution: "qs@npm:6.13.1" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/5ef527c0d62ffca5501322f0832d800ddc78eeb00da3b906f1b260ca0492721f8cdc13ee4b8fd8ac314a6ec37b948798c7b603ccc167e954088df392092f160c + languageName: node + linkType: hard + "react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" @@ -2172,6 +2316,54 @@ __metadata: languageName: node linkType: hard +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.2": version: 3.0.5 resolution: "signal-exit@npm:3.0.5" diff --git a/yarn.lock b/yarn.lock index 767babbbb..c4ae9440e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1253,23 +1253,23 @@ __metadata: languageName: node linkType: hard -"@orval/angular@npm:7.4.0, @orval/angular@workspace:packages/angular": +"@orval/angular@npm:7.4.1, @orval/angular@workspace:packages/angular": version: 0.0.0-use.local resolution: "@orval/angular@workspace:packages/angular" dependencies: - "@orval/core": "npm:7.4.0" + "@orval/core": "npm:7.4.1" languageName: unknown linkType: soft -"@orval/axios@npm:7.4.0, @orval/axios@workspace:packages/axios": +"@orval/axios@npm:7.4.1, @orval/axios@workspace:packages/axios": version: 0.0.0-use.local resolution: "@orval/axios@workspace:packages/axios" dependencies: - "@orval/core": "npm:7.4.0" + "@orval/core": "npm:7.4.1" languageName: unknown linkType: soft -"@orval/core@npm:7.4.0, @orval/core@workspace:packages/core": +"@orval/core@npm:7.4.1, @orval/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@orval/core@workspace:packages/core" dependencies: @@ -1308,62 +1308,62 @@ __metadata: languageName: unknown linkType: soft -"@orval/fetch@npm:7.4.0, @orval/fetch@workspace:packages/fetch": +"@orval/fetch@npm:7.4.1, @orval/fetch@workspace:packages/fetch": version: 0.0.0-use.local resolution: "@orval/fetch@workspace:packages/fetch" dependencies: - "@orval/core": "npm:7.4.0" + "@orval/core": "npm:7.4.1" languageName: unknown linkType: soft -"@orval/hono@npm:7.4.0, @orval/hono@workspace:packages/hono": +"@orval/hono@npm:7.4.1, @orval/hono@workspace:packages/hono": version: 0.0.0-use.local resolution: "@orval/hono@workspace:packages/hono" dependencies: - "@orval/core": "npm:7.4.0" - "@orval/zod": "npm:7.4.0" + "@orval/core": "npm:7.4.1" + "@orval/zod": "npm:7.4.1" "@types/lodash.uniq": "npm:^4.5.7" lodash.uniq: "npm:^4.5.0" languageName: unknown linkType: soft -"@orval/mock@npm:7.4.0, @orval/mock@workspace:packages/mock": +"@orval/mock@npm:7.4.1, @orval/mock@workspace:packages/mock": version: 0.0.0-use.local resolution: "@orval/mock@workspace:packages/mock" dependencies: - "@orval/core": "npm:7.4.0" + "@orval/core": "npm:7.4.1" lodash.get: "npm:^4.4.2" lodash.omit: "npm:^4.5.0" openapi3-ts: "npm:^4.2.2" languageName: unknown linkType: soft -"@orval/query@npm:7.4.0, @orval/query@workspace:packages/query": +"@orval/query@npm:7.4.1, @orval/query@workspace:packages/query": version: 0.0.0-use.local resolution: "@orval/query@workspace:packages/query" dependencies: - "@orval/core": "npm:7.4.0" - "@orval/fetch": "npm:7.4.0" + "@orval/core": "npm:7.4.1" + "@orval/fetch": "npm:7.4.1" "@types/lodash.omitby": "npm:^4.6.7" lodash.omitby: "npm:^4.6.0" vitest: "npm:^0.34.6" languageName: unknown linkType: soft -"@orval/swr@npm:7.4.0, @orval/swr@workspace:packages/swr": +"@orval/swr@npm:7.4.1, @orval/swr@workspace:packages/swr": version: 0.0.0-use.local resolution: "@orval/swr@workspace:packages/swr" dependencies: - "@orval/core": "npm:7.4.0" - "@orval/fetch": "npm:7.4.0" + "@orval/core": "npm:7.4.1" + "@orval/fetch": "npm:7.4.1" languageName: unknown linkType: soft -"@orval/zod@npm:7.4.0, @orval/zod@workspace:packages/zod": +"@orval/zod@npm:7.4.1, @orval/zod@workspace:packages/zod": version: 0.0.0-use.local resolution: "@orval/zod@workspace:packages/zod" dependencies: - "@orval/core": "npm:7.4.0" + "@orval/core": "npm:7.4.1" "@types/lodash.uniq": "npm:^4.5.7" lodash.uniq: "npm:^4.5.0" languageName: unknown @@ -7578,15 +7578,15 @@ __metadata: resolution: "orval@workspace:packages/orval" dependencies: "@apidevtools/swagger-parser": "npm:^10.1.0" - "@orval/angular": "npm:7.4.0" - "@orval/axios": "npm:7.4.0" - "@orval/core": "npm:7.4.0" - "@orval/fetch": "npm:7.4.0" - "@orval/hono": "npm:7.4.0" - "@orval/mock": "npm:7.4.0" - "@orval/query": "npm:7.4.0" - "@orval/swr": "npm:7.4.0" - "@orval/zod": "npm:7.4.0" + "@orval/angular": "npm:7.4.1" + "@orval/axios": "npm:7.4.1" + "@orval/core": "npm:7.4.1" + "@orval/fetch": "npm:7.4.1" + "@orval/hono": "npm:7.4.1" + "@orval/mock": "npm:7.4.1" + "@orval/query": "npm:7.4.1" + "@orval/swr": "npm:7.4.1" + "@orval/zod": "npm:7.4.1" "@types/inquirer": "npm:^9.0.6" "@types/js-yaml": "npm:^4.0.8" "@types/lodash.uniq": "npm:^4.5.8"