@orval/axios 8.0.3 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -3,19 +3,22 @@ import { ClientBuilder, ClientDependenciesBuilder, ClientFooterBuilder, ClientGe
3
3
 
4
4
  //#region src/index.d.ts
5
5
  declare const getAxiosDependencies: ClientDependenciesBuilder;
6
+ declare const getAxiosFactoryDependencies: ClientDependenciesBuilder;
6
7
  declare const generateAxiosTitle: ClientTitleBuilder;
7
8
  declare const generateAxiosHeader: ClientHeaderBuilder;
8
9
  declare const generateAxiosFooter: ClientFooterBuilder;
9
- declare const generateAxios: (verbOptions: GeneratorVerbOptions, options: GeneratorOptions) => {
10
+ declare const generateAxios: (verbOptions: GeneratorVerbOptions, options: GeneratorOptions, isFactoryMode?: boolean) => {
10
11
  implementation: string;
11
12
  imports: _orval_core0.GeneratorImport[];
12
13
  };
14
+ declare const generateAxiosFactory: ClientBuilder;
13
15
  declare const generateAxiosFunctions: ClientBuilder;
16
+ type AxiosBuilderOptions = {
17
+ type?: 'axios' | 'axios-functions';
18
+ };
14
19
  declare const builder: ({
15
20
  type
16
- }?: {
17
- type?: "axios" | "axios-functions";
18
- }) => () => ClientGeneratorsBuilder;
21
+ }?: AxiosBuilderOptions) => () => ClientGeneratorsBuilder;
19
22
  //#endregion
20
- export { builder, builder as default, generateAxios, generateAxiosFooter, generateAxiosFunctions, generateAxiosHeader, generateAxiosTitle, getAxiosDependencies };
23
+ export { AxiosBuilderOptions, builder, builder as default, generateAxios, generateAxiosFactory, generateAxiosFooter, generateAxiosFunctions, generateAxiosHeader, generateAxiosTitle, getAxiosDependencies, getAxiosFactoryDependencies };
21
24
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -25,7 +25,20 @@ const PARAMS_SERIALIZER_DEPENDENCIES = [{
25
25
  }];
26
26
  const returnTypesToWrite = /* @__PURE__ */ new Map();
27
27
  const getAxiosDependencies = (hasGlobalMutator, hasParamsSerializerOptions) => [...hasGlobalMutator ? [] : AXIOS_DEPENDENCIES, ...hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []];
28
- const generateAxiosImplementation = ({ headers, queryParams, operationName, response, mutator, body, props, verb, override, formData, formUrlEncoded, paramsSerializer }, { route, context }) => {
28
+ const getAxiosFactoryDependencies = (hasGlobalMutator, hasParamsSerializerOptions) => [{
29
+ exports: [
30
+ {
31
+ name: "axios",
32
+ default: true,
33
+ values: true,
34
+ syntheticDefaultImport: true
35
+ },
36
+ { name: "AxiosInstance" },
37
+ ...hasGlobalMutator ? [] : [{ name: "AxiosRequestConfig" }, { name: "AxiosResponse" }]
38
+ ],
39
+ dependency: "axios"
40
+ }, ...hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []];
41
+ const generateAxiosImplementation = ({ headers, queryParams, operationName, response, mutator, body, props, verb, override, formData, formUrlEncoded, paramsSerializer }, { route, context }, isFactoryMode = false) => {
29
42
  const isRequestOptions = override.requestOptions !== false;
30
43
  const isFormData = !override.formData.disabled;
31
44
  const isFormUrlEncoded = override.formUrlEncoded !== false;
@@ -76,17 +89,21 @@ const generateAxiosImplementation = ({ headers, queryParams, operationName, resp
76
89
  hasSignal: false
77
90
  });
78
91
  returnTypesToWrite.set(operationName, () => `export type ${pascal(operationName)}Result = AxiosResponse<${response.definition.success || "unknown"}>`);
79
- return `const ${operationName} = <TData = AxiosResponse<${response.definition.success || "unknown"}>>(\n ${toObjectString(props, "implementation")} ${isRequestOptions ? `options?: AxiosRequestConfig\n` : ""} ): Promise<TData> => {${bodyForm}
80
- return axios${isSyntheticDefaultImportsAllowed ? "" : ".default"}.${verb}(${options});
92
+ const axiosRef = isFactoryMode ? "axiosInstance" : `axios${isSyntheticDefaultImportsAllowed ? "" : ".default"}`;
93
+ return `const ${operationName} = <TData = AxiosResponse<${response.definition.success || "unknown"}>>(\n ${toObjectString(props, "implementation")} ${isRequestOptions ? `options${context.output.optionsParamRequired ? "" : "?"}: AxiosRequestConfig\n` : ""} ): Promise<TData> => {${bodyForm}
94
+ return ${axiosRef}.${verb}(${options});
81
95
  }
82
96
  `;
83
97
  };
84
98
  const generateAxiosTitle = (title) => {
85
99
  return `get${pascal(sanitize(title))}`;
86
100
  };
87
- const generateAxiosHeader = ({ title, isRequestOptions, isMutator, noFunction }) => `
101
+ const generateAxiosHeader = ({ title, isRequestOptions, isMutator, noFunction, output }) => {
102
+ const axiosDefault = isSyntheticDefaultImportsAllow(output.tsconfig) ? "axios" : "axios.default";
103
+ return `
88
104
  ${isRequestOptions && isMutator ? `type SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n` : ""}
89
- ${noFunction ? "" : `export const ${title} = () => {\n`}`;
105
+ ${noFunction ? "" : `export const ${title} = (axiosInstance: AxiosInstance = ${axiosDefault}) => {\n`}`;
106
+ };
90
107
  const generateAxiosFooter = ({ operationNames, title, noFunction, hasMutator, hasAwaitedType }) => {
91
108
  let footer = "";
92
109
  if (!noFunction) footer += `return {${operationNames.join(",")}}};\n`;
@@ -99,10 +116,17 @@ const generateAxiosFooter = ({ operationNames, title, noFunction, hasMutator, ha
99
116
  }
100
117
  return footer;
101
118
  };
102
- const generateAxios = (verbOptions, options) => {
119
+ const generateAxios = (verbOptions, options, isFactoryMode = false) => {
103
120
  const imports = generateVerbImports(verbOptions);
104
121
  return {
105
- implementation: generateAxiosImplementation(verbOptions, options),
122
+ implementation: generateAxiosImplementation(verbOptions, options, isFactoryMode),
123
+ imports
124
+ };
125
+ };
126
+ const generateAxiosFactory = (verbOptions, options) => {
127
+ const { implementation, imports } = generateAxios(verbOptions, options, true);
128
+ return {
129
+ implementation,
106
130
  imports
107
131
  };
108
132
  };
@@ -114,9 +138,9 @@ const generateAxiosFunctions = (verbOptions, options) => {
114
138
  };
115
139
  };
116
140
  const axiosClientBuilder = {
117
- client: generateAxios,
141
+ client: generateAxiosFactory,
118
142
  header: generateAxiosHeader,
119
- dependencies: getAxiosDependencies,
143
+ dependencies: getAxiosFactoryDependencies,
120
144
  footer: generateAxiosFooter,
121
145
  title: generateAxiosTitle
122
146
  };
@@ -133,13 +157,12 @@ const axiosFunctionsClientBuilder = {
133
157
  }),
134
158
  title: generateAxiosTitle
135
159
  };
136
- const builders = {
137
- axios: axiosClientBuilder,
138
- "axios-functions": axiosFunctionsClientBuilder
160
+ const builder = ({ type = "axios-functions" } = {}) => () => {
161
+ if (type === "axios-functions") return axiosFunctionsClientBuilder;
162
+ return axiosClientBuilder;
139
163
  };
140
- const builder = ({ type = "axios-functions" } = {}) => () => builders[type];
141
164
  var src_default = builder;
142
165
 
143
166
  //#endregion
144
- export { builder, src_default as default, generateAxios, generateAxiosFooter, generateAxiosFunctions, generateAxiosHeader, generateAxiosTitle, getAxiosDependencies };
167
+ export { builder, src_default as default, generateAxios, generateAxiosFactory, generateAxiosFooter, generateAxiosFunctions, generateAxiosHeader, generateAxiosTitle, getAxiosDependencies, getAxiosFactoryDependencies };
145
168
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["AXIOS_DEPENDENCIES: GeneratorDependency[]","PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[]","getAxiosDependencies: ClientDependenciesBuilder","generateAxiosTitle: ClientTitleBuilder","generateAxiosHeader: ClientHeaderBuilder","generateAxiosFooter: ClientFooterBuilder","generateAxiosFunctions: ClientBuilder","axiosClientBuilder: ClientGeneratorsBuilder","axiosFunctionsClientBuilder: ClientGeneratorsBuilder","builders: Record<'axios' | 'axios-functions', ClientGeneratorsBuilder>"],"sources":["../src/index.ts"],"sourcesContent":["import {\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientFooterBuilder,\n type ClientGeneratorsBuilder,\n type ClientHeaderBuilder,\n type ClientTitleBuilder,\n generateFormDataAndUrlEncodedFunction,\n generateMutatorConfig,\n generateMutatorRequestOptions,\n generateOptions,\n generateVerbImports,\n type GeneratorDependency,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n isSyntheticDefaultImportsAllow,\n pascal,\n sanitize,\n toObjectString,\n} from '@orval/core';\n\nconst AXIOS_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n name: 'axios',\n default: true,\n values: true,\n syntheticDefaultImport: true,\n },\n { name: 'AxiosRequestConfig' },\n { name: 'AxiosResponse' },\n ],\n dependency: 'axios',\n },\n];\n\nconst PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n name: 'qs',\n default: true,\n values: true,\n syntheticDefaultImport: true,\n },\n ],\n dependency: 'qs',\n },\n];\n\nconst returnTypesToWrite = new Map<string, (title?: string) => string>();\n\nexport const getAxiosDependencies: ClientDependenciesBuilder = (\n hasGlobalMutator,\n hasParamsSerializerOptions: boolean,\n) => [\n ...(hasGlobalMutator ? [] : AXIOS_DEPENDENCIES),\n ...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),\n];\n\nconst generateAxiosImplementation = (\n {\n headers,\n queryParams,\n operationName,\n response,\n mutator,\n body,\n props,\n verb,\n override,\n formData,\n formUrlEncoded,\n paramsSerializer,\n }: GeneratorVerbOptions,\n { route, context }: GeneratorOptions,\n) => {\n const isRequestOptions = override.requestOptions !== false;\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n const isExactOptionalPropertyTypes =\n !!context.output.tsconfig?.compilerOptions?.exactOptionalPropertyTypes;\n\n const isSyntheticDefaultImportsAllowed = isSyntheticDefaultImportsAllow(\n context.output.tsconfig,\n );\n\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n if (mutator) {\n const mutatorConfig = generateMutatorConfig({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n isFormData,\n isFormUrlEncoded,\n hasSignal: false,\n isExactOptionalPropertyTypes,\n });\n\n const requestOptions = isRequestOptions\n ? generateMutatorRequestOptions(\n override.requestOptions,\n mutator.hasSecondArg,\n )\n : '';\n\n returnTypesToWrite.set(\n operationName,\n (title?: string) =>\n `export type ${pascal(\n operationName,\n )}Result = NonNullable<Awaited<ReturnType<${\n title\n ? `ReturnType<typeof ${title}>['${operationName}']`\n : `typeof ${operationName}`\n }>>>`,\n );\n\n const propsImplementation =\n mutator.bodyTypeName && body.definition\n ? toObjectString(props, 'implementation').replace(\n new RegExp(String.raw`(\\w*):\\s?${body.definition}`),\n `$1: ${mutator.bodyTypeName}<${body.definition}>`,\n )\n : toObjectString(props, 'implementation');\n\n return `const ${operationName} = (\\n ${propsImplementation}\\n ${\n isRequestOptions && mutator.hasSecondArg\n ? `options${context.output.optionsParamRequired ? '' : '?'}: SecondParameter<typeof ${mutator.name}<${response.definition.success || 'unknown'}>>,`\n : ''\n }) => {${bodyForm}\n return ${mutator.name}<${response.definition.success || 'unknown'}>(\n ${mutatorConfig},\n ${requestOptions});\n }\n `;\n }\n\n const options = generateOptions({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n requestOptions: override.requestOptions,\n isFormData,\n isFormUrlEncoded,\n paramsSerializer,\n paramsSerializerOptions: override.paramsSerializerOptions,\n isExactOptionalPropertyTypes,\n hasSignal: false,\n });\n\n returnTypesToWrite.set(\n operationName,\n () =>\n `export type ${pascal(operationName)}Result = AxiosResponse<${\n response.definition.success || 'unknown'\n }>`,\n );\n\n return `const ${operationName} = <TData = AxiosResponse<${\n response.definition.success || 'unknown'\n }>>(\\n ${toObjectString(props, 'implementation')} ${\n isRequestOptions ? `options?: AxiosRequestConfig\\n` : ''\n } ): Promise<TData> => {${bodyForm}\n return axios${\n isSyntheticDefaultImportsAllowed ? '' : '.default'\n }.${verb}(${options});\n }\n`;\n};\n\nexport const generateAxiosTitle: ClientTitleBuilder = (title) => {\n const sanTitle = sanitize(title);\n return `get${pascal(sanTitle)}`;\n};\n\nexport const generateAxiosHeader: ClientHeaderBuilder = ({\n title,\n isRequestOptions,\n isMutator,\n noFunction,\n}) => `\n${\n isRequestOptions && isMutator\n ? `type SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\\n\\n`\n : ''\n}\n ${noFunction ? '' : `export const ${title} = () => {\\n`}`;\n\nexport const generateAxiosFooter: ClientFooterBuilder = ({\n operationNames,\n title,\n noFunction,\n hasMutator,\n hasAwaitedType,\n}) => {\n let footer = '';\n\n if (!noFunction) {\n footer += `return {${operationNames.join(',')}}};\\n`;\n }\n\n if (hasMutator && !hasAwaitedType) {\n footer += `\\ntype AwaitedInput<T> = PromiseLike<T> | T;\\n\n type Awaited<O> = O extends AwaitedInput<infer T> ? T : never;\n\\n`;\n }\n\n for (const operationName of operationNames) {\n if (returnTypesToWrite.has(operationName)) {\n // Map.has ensures Map.get will not return undefined, but TS still complains\n // bug https://github.com/microsoft/TypeScript/issues/13086\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const func = returnTypesToWrite.get(operationName)!;\n footer += func(noFunction ? undefined : title) + '\\n';\n }\n }\n\n return footer;\n};\n\nexport const generateAxios = (\n verbOptions: GeneratorVerbOptions,\n options: GeneratorOptions,\n) => {\n const imports = generateVerbImports(verbOptions);\n const implementation = generateAxiosImplementation(verbOptions, options);\n\n return { implementation, imports };\n};\n\nexport const generateAxiosFunctions: ClientBuilder = (verbOptions, options) => {\n const { implementation, imports } = generateAxios(verbOptions, options);\n\n return {\n implementation: 'export ' + implementation,\n imports,\n };\n};\n\nconst axiosClientBuilder: ClientGeneratorsBuilder = {\n client: generateAxios,\n header: generateAxiosHeader,\n dependencies: getAxiosDependencies,\n footer: generateAxiosFooter,\n title: generateAxiosTitle,\n};\n\nconst axiosFunctionsClientBuilder: ClientGeneratorsBuilder = {\n client: generateAxiosFunctions,\n header: (options) => generateAxiosHeader({ ...options, noFunction: true }),\n dependencies: getAxiosDependencies,\n footer: (options) => generateAxiosFooter({ ...options, noFunction: true }),\n title: generateAxiosTitle,\n};\n\nconst builders: Record<'axios' | 'axios-functions', ClientGeneratorsBuilder> = {\n axios: axiosClientBuilder,\n 'axios-functions': axiosFunctionsClientBuilder,\n};\n\nexport const builder =\n ({ type = 'axios-functions' }: { type?: 'axios' | 'axios-functions' } = {}) =>\n () =>\n builders[type];\n\nexport default builder;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["AXIOS_DEPENDENCIES: GeneratorDependency[]","PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[]","getAxiosDependencies: ClientDependenciesBuilder","getAxiosFactoryDependencies: ClientDependenciesBuilder","generateAxiosTitle: ClientTitleBuilder","generateAxiosHeader: ClientHeaderBuilder","generateAxiosFooter: ClientFooterBuilder","generateAxiosFactory: ClientBuilder","generateAxiosFunctions: ClientBuilder","axiosClientBuilder: ClientGeneratorsBuilder","axiosFunctionsClientBuilder: ClientGeneratorsBuilder"],"sources":["../src/index.ts"],"sourcesContent":["import {\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientFooterBuilder,\n type ClientGeneratorsBuilder,\n type ClientHeaderBuilder,\n type ClientTitleBuilder,\n generateFormDataAndUrlEncodedFunction,\n generateMutatorConfig,\n generateMutatorRequestOptions,\n generateOptions,\n generateVerbImports,\n type GeneratorDependency,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n isSyntheticDefaultImportsAllow,\n pascal,\n sanitize,\n toObjectString,\n} from '@orval/core';\n\nconst AXIOS_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n name: 'axios',\n default: true,\n values: true,\n syntheticDefaultImport: true,\n },\n { name: 'AxiosRequestConfig' },\n { name: 'AxiosResponse' },\n ],\n dependency: 'axios',\n },\n];\n\nconst PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[] = [\n {\n exports: [\n {\n name: 'qs',\n default: true,\n values: true,\n syntheticDefaultImport: true,\n },\n ],\n dependency: 'qs',\n },\n];\n\nconst returnTypesToWrite = new Map<string, (title?: string) => string>();\n\nexport const getAxiosDependencies: ClientDependenciesBuilder = (\n hasGlobalMutator,\n hasParamsSerializerOptions: boolean,\n) => [\n ...(hasGlobalMutator ? [] : AXIOS_DEPENDENCIES),\n ...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),\n];\n\n// Factory mode needs axios default import (for optional parameter default value)\n// plus AxiosInstance type for the parameter type\nexport const getAxiosFactoryDependencies: ClientDependenciesBuilder = (\n hasGlobalMutator,\n hasParamsSerializerOptions: boolean,\n) => [\n {\n exports: [\n {\n name: 'axios',\n default: true,\n values: true,\n syntheticDefaultImport: true,\n },\n { name: 'AxiosInstance' },\n ...(hasGlobalMutator\n ? []\n : [{ name: 'AxiosRequestConfig' }, { name: 'AxiosResponse' }]),\n ],\n dependency: 'axios',\n },\n ...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),\n];\n\nconst generateAxiosImplementation = (\n {\n headers,\n queryParams,\n operationName,\n response,\n mutator,\n body,\n props,\n verb,\n override,\n formData,\n formUrlEncoded,\n paramsSerializer,\n }: GeneratorVerbOptions,\n { route, context }: GeneratorOptions,\n isFactoryMode = false,\n) => {\n const isRequestOptions = override.requestOptions !== false;\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n const isExactOptionalPropertyTypes =\n !!context.output.tsconfig?.compilerOptions?.exactOptionalPropertyTypes;\n\n const isSyntheticDefaultImportsAllowed = isSyntheticDefaultImportsAllow(\n context.output.tsconfig,\n );\n\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n if (mutator) {\n const mutatorConfig = generateMutatorConfig({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n isFormData,\n isFormUrlEncoded,\n hasSignal: false,\n isExactOptionalPropertyTypes,\n });\n\n const requestOptions = isRequestOptions\n ? generateMutatorRequestOptions(\n override.requestOptions,\n mutator.hasSecondArg,\n )\n : '';\n\n returnTypesToWrite.set(\n operationName,\n (title?: string) =>\n `export type ${pascal(\n operationName,\n )}Result = NonNullable<Awaited<ReturnType<${\n title\n ? `ReturnType<typeof ${title}>['${operationName}']`\n : `typeof ${operationName}`\n }>>>`,\n );\n\n const propsImplementation =\n mutator.bodyTypeName && body.definition\n ? toObjectString(props, 'implementation').replace(\n new RegExp(String.raw`(\\w*):\\s?${body.definition}`),\n `$1: ${mutator.bodyTypeName}<${body.definition}>`,\n )\n : toObjectString(props, 'implementation');\n\n return `const ${operationName} = (\\n ${propsImplementation}\\n ${\n isRequestOptions && mutator.hasSecondArg\n ? `options${context.output.optionsParamRequired ? '' : '?'}: SecondParameter<typeof ${mutator.name}<${response.definition.success || 'unknown'}>>,`\n : ''\n }) => {${bodyForm}\n return ${mutator.name}<${response.definition.success || 'unknown'}>(\n ${mutatorConfig},\n ${requestOptions});\n }\n `;\n }\n\n const options = generateOptions({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n requestOptions: override.requestOptions,\n isFormData,\n isFormUrlEncoded,\n paramsSerializer,\n paramsSerializerOptions: override.paramsSerializerOptions,\n isExactOptionalPropertyTypes,\n hasSignal: false,\n });\n\n returnTypesToWrite.set(\n operationName,\n () =>\n `export type ${pascal(operationName)}Result = AxiosResponse<${\n response.definition.success || 'unknown'\n }>`,\n );\n\n // In factory mode, use the axiosInstance parameter\n // In functions mode with global import, .default may be needed based on tsconfig\n const axiosRef = isFactoryMode\n ? 'axiosInstance'\n : `axios${isSyntheticDefaultImportsAllowed ? '' : '.default'}`;\n\n return `const ${operationName} = <TData = AxiosResponse<${\n response.definition.success || 'unknown'\n }>>(\\n ${toObjectString(props, 'implementation')} ${\n isRequestOptions\n ? `options${context.output.optionsParamRequired ? '' : '?'}: AxiosRequestConfig\\n`\n : ''\n } ): Promise<TData> => {${bodyForm}\n return ${axiosRef}.${verb}(${options});\n }\n`;\n};\n\nexport const generateAxiosTitle: ClientTitleBuilder = (title) => {\n const sanTitle = sanitize(title);\n return `get${pascal(sanTitle)}`;\n};\n\n// Header for factory mode - axios is optional parameter with default value\nexport const generateAxiosHeader: ClientHeaderBuilder = ({\n title,\n isRequestOptions,\n isMutator,\n noFunction,\n output,\n}) => {\n const isSyntheticDefaultImportsAllowed = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n const axiosDefault = isSyntheticDefaultImportsAllowed\n ? 'axios'\n : 'axios.default';\n\n return `\n${\n isRequestOptions && isMutator\n ? `type SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\\n\\n`\n : ''\n}\n ${noFunction ? '' : `export const ${title} = (axiosInstance: AxiosInstance = ${axiosDefault}) => {\\n`}`;\n};\n\nexport const generateAxiosFooter: ClientFooterBuilder = ({\n operationNames,\n title,\n noFunction,\n hasMutator,\n hasAwaitedType,\n}) => {\n let footer = '';\n\n if (!noFunction) {\n footer += `return {${operationNames.join(',')}}};\\n`;\n }\n\n if (hasMutator && !hasAwaitedType) {\n footer += `\\ntype AwaitedInput<T> = PromiseLike<T> | T;\\n\n type Awaited<O> = O extends AwaitedInput<infer T> ? T : never;\n\\n`;\n }\n\n for (const operationName of operationNames) {\n if (returnTypesToWrite.has(operationName)) {\n // Map.has ensures Map.get will not return undefined, but TS still complains\n // bug https://github.com/microsoft/TypeScript/issues/13086\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const func = returnTypesToWrite.get(operationName)!;\n footer += func(noFunction ? undefined : title) + '\\n';\n }\n }\n\n return footer;\n};\n\nexport const generateAxios = (\n verbOptions: GeneratorVerbOptions,\n options: GeneratorOptions,\n isFactoryMode = false,\n) => {\n const imports = generateVerbImports(verbOptions);\n const implementation = generateAxiosImplementation(\n verbOptions,\n options,\n isFactoryMode,\n );\n\n return { implementation, imports };\n};\n\n// Factory mode generator - axios is optional parameter\nexport const generateAxiosFactory: ClientBuilder = (verbOptions, options) => {\n const { implementation, imports } = generateAxios(verbOptions, options, true);\n return { implementation, imports };\n};\n\nexport const generateAxiosFunctions: ClientBuilder = (verbOptions, options) => {\n const { implementation, imports } = generateAxios(verbOptions, options);\n\n return {\n implementation: 'export ' + implementation,\n imports,\n };\n};\n\n// axios client with factory pattern (axios as optional parameter)\nconst axiosClientBuilder: ClientGeneratorsBuilder = {\n client: generateAxiosFactory,\n header: generateAxiosHeader,\n dependencies: getAxiosFactoryDependencies,\n footer: generateAxiosFooter,\n title: generateAxiosTitle,\n};\n\nconst axiosFunctionsClientBuilder: ClientGeneratorsBuilder = {\n client: generateAxiosFunctions,\n header: (options) => generateAxiosHeader({ ...options, noFunction: true }),\n dependencies: getAxiosDependencies,\n footer: (options) => generateAxiosFooter({ ...options, noFunction: true }),\n title: generateAxiosTitle,\n};\n\nexport type AxiosBuilderOptions = {\n type?: 'axios' | 'axios-functions';\n};\n\nexport const builder =\n ({ type = 'axios-functions' }: AxiosBuilderOptions = {}) =>\n () => {\n if (type === 'axios-functions') {\n return axiosFunctionsClientBuilder;\n }\n return axiosClientBuilder;\n };\n\nexport default builder;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orval/axios",
3
- "version": "8.0.3",
3
+ "version": "8.1.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -18,16 +18,18 @@
18
18
  "build": "tsdown --config-loader unrun",
19
19
  "dev": "tsdown --config-loader unrun --watch src",
20
20
  "lint": "eslint .",
21
+ "test": "vitest",
21
22
  "clean": "rimraf .turbo dist",
22
23
  "nuke": "rimraf .turbo dist node_modules"
23
24
  },
24
25
  "dependencies": {
25
- "@orval/core": "8.0.3"
26
+ "@orval/core": "8.1.0"
26
27
  },
27
28
  "devDependencies": {
28
29
  "eslint": "9.39.2",
29
30
  "rimraf": "6.1.2",
30
31
  "tsdown": "0.18.2",
31
- "typescript": "5.9.3"
32
+ "typescript": "5.9.3",
33
+ "vitest": "4.0.16"
32
34
  }
33
35
  }