import { defineNuxtModule, createResolver, addServerHandler, addTemplate } from '@nuxt/kit'
import { pascalCase } from 'scule'
export interface ApiEndpoint {
url: string
headers?: Record<string, string>
}
export interface ModuleOptions {
endpoints: Record<string, ApiEndpoint>
}
export default defineNuxtModule<ModuleOptions>({
meta: {},
setup(_options, _nuxt) {
const { resolve } = createResolver(import.meta.url)
const getDataComposableName = (endpoint: string) => `use${pascalCase(endpoint)}Fetch`
const endpointKeys = Object.keys(_options.endpoints)
endpointKeys.forEach((key) => {
addServerHandler({
route: `/api/${key}/**`,
handler: resolve('runtime/server/handler'),
})
// Rough idea of what I want to accomplish
addTemplate({
filename: `${getDataComposableName(key)}.ts`,
getContents: () => {
return `
import { useFetch, type UseFetchOptions } from '#app'
export const ${getDataComposableName(key)} = <T>(
url: string | (() => string),
options?: UseFetchOptions<T>,
) => {
const baseURL = '/api/${key}'
return useFetch(url, {
baseURL,
...options,
})
}
`
},
})
})
},
})
import { defineNuxtModule, createResolver, addServerHandler, addTemplate } from '@nuxt/kit'
import { pascalCase } from 'scule'
export interface ApiEndpoint {
url: string
headers?: Record<string, string>
}
export interface ModuleOptions {
endpoints: Record<string, ApiEndpoint>
}
export default defineNuxtModule<ModuleOptions>({
meta: {},
setup(_options, _nuxt) {
const { resolve } = createResolver(import.meta.url)
const getDataComposableName = (endpoint: string) => `use${pascalCase(endpoint)}Fetch`
const endpointKeys = Object.keys(_options.endpoints)
endpointKeys.forEach((key) => {
addServerHandler({
route: `/api/${key}/**`,
handler: resolve('runtime/server/handler'),
})
// Rough idea of what I want to accomplish
addTemplate({
filename: `${getDataComposableName(key)}.ts`,
getContents: () => {
return `
import { useFetch, type UseFetchOptions } from '#app'
export const ${getDataComposableName(key)} = <T>(
url: string | (() => string),
options?: UseFetchOptions<T>,
) => {
const baseURL = '/api/${key}'
return useFetch(url, {
baseURL,
...options,
})
}
`
},
})
})
},
})