Skip to content

Instantly share code, notes, and snippets.

@josh-hemphill
Created September 29, 2023 05:29
Show Gist options
  • Save josh-hemphill/c6b45fad353e82548e27079b59348469 to your computer and use it in GitHub Desktop.
Save josh-hemphill/c6b45fad353e82548e27079b59348469 to your computer and use it in GitHub Desktop.
Template (handlebars) files for creating vue `useFetch` bindings in openapi-typescript-codegen
import { type UseFetchOptions, useFetch } from 'src/vue/useFetchPolyfill.js';
import type { MaybeRefOrGetter } from '@vueuse/shared';
import { toValue } from '@vueuse/shared';
import { getRequestBody } from 'src/core/getRequestBody.js';
import { mergeHeaders } from 'src/core/mergeHeaders.js';
import { getHeaders } from 'src/core/utils.js';
import { getUrl } from 'src/core/getUrl.js';
{{#if imports}}
{{#each imports}}
import type { {{{this}}} } from '../models/{{{this}}}';
{{/each}}
{{/if}}
{{#if @root.exportSchemas}}
{{#if models}}
{{#each models}}
import { ${{{name}}} } from '../schemas/${{{name}}}.js';
{{/each}}
{{/if}}
{{/if}}
export const {{{name}}}{{{@root.postfixServices}}} = (
defaults: {
reqOptions?: RequestInit;
useFetchOptions?: UseFetchOptions
}) => ({
{{#if imports}}
/** TYPES ONLY */
$models: {
{{#each imports}}
/** TYPE ONLY */
{{{this}}}: ({} as unknown) as {{{this}}},
{{/each}}
},
{{/if}}
{{#if @root.exportSchemas}}
{{#if models}}
$schemas: {
{{#each models}}
{{{name}}}: ${{{name}}},
{{/each}}
},
{{/if}}
{{/if}}
{{#each operations}}
/**
{{#if deprecated}}
* @deprecated
{{/if}}
{{#if summary}}
* {{{escapeComment summary}}}
{{/if}}
{{#if description}}
* {{{escapeComment description}}}
{{/if}}
{{#unless @root.useOptions}}
{{#if parameters}}{{#if parametersBody.properties.length}}
* @param {{{parametersBody.name}}}: {{#if parametersBody.description}}{{{escapeComment
parametersBody.description}}}{{/if}},
{{/if}}
{{#each parameters}}
{{#notEquals name 'requestBody'}}
* @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}}
{{/notEquals}}
{{/each}}
{{/if}}
{{/unless}}
{{#each results}}
* @returns {{{type}}} {{#if description}}{{{escapeComment description}}}{{/if}}
{{/each}}
* @throws ApiError
*/
{{{name}}}: ({{#if parameters}}{{#if parametersBody.properties.length}}{{{parametersBody.name}}}: MaybeRefOrGetter<
{{#union
parametersBody.properties
parent}}{{this}}{{/union}}>,
{{/if}}
{{> parameters noRequestBody='true' }},
{{/if}}
reqOptions?: RequestInit, useFetchOptions?: UseFetchOptions
) =>
useFetch<{{>result}}{{#if parametersBody.properties.length}}
,{{#union parametersBody.properties parent}}{{this}}{{/union}}{{>isNullable}}
{{/if}}>(getUrl({
url: '{{{path}}}',
{{#if parametersQuery}}
query:{
{{#each parametersQuery}}
'{{{prop}}}': {{{name}}},
{{/each}}
},
{{/if}}
{{#if parametersPath}}
path:{
{{#each parametersPath}}
'{{{prop}}}': {{{name}}}.toString(),
{{/each}}
}
{{/if}}
}), {
...defaults.reqOptions,
...reqOptions,
headers: {
...getHeaders(mergeHeaders(defaults?.reqOptions?.headers, reqOptions?.headers),
{{#if parametersForm}}
{
{{#each parametersForm}}
'{{{prop}}}': {{{name}}},
{{/each}}
} ,
{{else if parametersBody}}
{{{parametersBody.name}}},
{{else}}
reqOptions?.body,
{{/if}}
{{#if parametersBody.mediaType}}
'{{{parametersBody.mediaType}}}',
{{/if}}),
{{#each parametersHeader}}
'{{{prop}}}': {{{name}}},
{{/each}}
},
method: '{{{method}}}',
{{#if parametersCookie}}
cookies: {
{{#each parametersCookie}}
'{{{prop}}}': {{{name}}},
{{/each}}
},
{{/if}}
{{#if parametersForm}}
body: getRequestBody(toValue({
{{#each parametersForm}}
'{{{prop}}}': {{{name}}},
{{/each}}
})),
{{/if}}
{{#if parametersBody}}
{{#equals parametersBody.in 'formData'}}
body: getRequestBody(toValue({{{parametersBody.name}}})),
{{/equals}}
{{#equals parametersBody.in 'body'}}
body: getRequestBody(toValue({{{parametersBody.name}}})),
{{/equals}}
{{/if}}
}, {
...defaults.useFetchOptions,
...useFetchOptions,
}).{{{camelCase method}}}(
{{#if parametersForm}}
{
{{#each parametersForm}}
'{{{prop}}}': {{{name}}},
{{/each}}
},
{{/if}}
{{#if parametersBody}}
{{#equals parametersBody.in 'formData'}}
{{{parametersBody.name}}},
{{/equals}}
{{#equals parametersBody.in 'body'}}
{{{parametersBody.name}}},
{{/equals}}
{{/if}}
),
{{/each}}
})
import type { UseFetchOptions } from 'src/vue/useFetchPolyfill.js';
{{#if @root.exportModels}}
{{#if models}}
{{#each models}}
{{#if @root.useUnionTypes}}
export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from
'./models/{{{name}}}';
{{else if enum}}
export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from
'./models/{{{name}}}';
{{else if enums}}
export { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from
'./models/{{{name}}}';
{{else}}
export type { {{{name}}}{{#if @root.postfixModels}} as {{{name}}}{{{@root.postfixModels}}}{{/if}} } from
'./models/{{{name}}}';
{{/if}}
{{/each}}
{{/if}}
{{/if}}
{{#if @root.exportSchemas}}
{{#if models}}
{{#each models}}
export { ${{{name}}} } from './schemas/${{{name}}}';
{{/each}}
{{/if}}
{{/if}}
{{#if services}}
{{#each services}}
import { {{{name}}}{{{@root.postfixServices}}} as _{{{name}}} } from './services/{{{name}}}{{{@root.postfixServices}}}';
export const {{{name}}}{{{@root.postfixServices}}} = _{{{name}}};
{{/each}}
export default (defaults: { reqOptions?: RequestInit; useFetchOptions?: UseFetchOptions }) => ({
{{#each services}}
{{{name}}}: _{{{name}}}(defaults),
{{/each}}
});
{{/if}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment