diff --git a/src/module.ts b/src/module.ts index 39a60d7..79e3d7e 100644 --- a/src/module.ts +++ b/src/module.ts @@ -109,12 +109,18 @@ export default defineNuxtModule({ nitroConfig.handlers.push({ route: '/api/_github/repository', handler: resolveModule('./server/api/repository', { paths: runtimeDir }) + }, { + route: '/api/_github/repository/:query', + handler: resolveModule('./server/api/repository', { paths: runtimeDir }) }) // Setup readme file API nitroConfig.handlers.push({ route: '/api/_github/readme', handler: resolveModule('./server/api/readme', { paths: runtimeDir }) + }, { + route: '/api/_github/readme/:query', + handler: resolveModule('./server/api/readme', { paths: runtimeDir }) }) // Repository component @@ -144,6 +150,9 @@ export default defineNuxtModule({ nitroConfig.handlers.push({ route: '/api/_github/releases', handler: resolveModule('./server/api/releases/index', { paths: runtimeDir }) + }, { + route: '/api/_github/releases/:query', + handler: resolveModule('./server/api/releases/index', { paths: runtimeDir }) }) nitroConfig.prerender.routes.push('/api/_github/releases') @@ -170,6 +179,9 @@ export default defineNuxtModule({ nitroConfig.handlers.push({ route: '/api/_github/contributors', handler: resolveModule('./server/api/contributors', { paths: runtimeDir }) + }, { + route: '/api/_github/contributors/:query', + handler: resolveModule('./server/api/contributors', { paths: runtimeDir }) }) nitroConfig.prerender.routes.push('/api/_github/contributors') @@ -177,6 +189,9 @@ export default defineNuxtModule({ nitroConfig.handlers.push({ route: '/api/_github/contributors/file', handler: resolveModule('./server/api/contributors/file', { paths: runtimeDir }) + }, { + route: '/api/_github/contributors/file/:query', + handler: resolveModule('./server/api/contributors/file', { paths: runtimeDir }) }) // Contributors components diff --git a/src/runtime/composables/useGithub.ts b/src/runtime/composables/useGithub.ts index 79d3cd0..d31f12b 100644 --- a/src/runtime/composables/useGithub.ts +++ b/src/runtime/composables/useGithub.ts @@ -1,39 +1,39 @@ -import { withQuery, QueryObject } from 'ufo' import type { ParsedContent } from '@nuxt/content/dist/runtime/types' import type { GithubRepositoryOptions, GithubContributorsQuery, GithubReleasesQuery, GithubRepository, GithubRawRelease, GithubRawContributor, GithubReleaseQuery } from '../types' + export const useGithub = () => { const fetchRepository = (query: GithubRepositoryOptions): Promise => { - const url = withQuery('/api/_github/repository', query as QueryObject) + const url = `/api/_github/repository/${encodeParams(query)}` return $fetch(url, { responseType: 'json' }) } const fetchRelease = (query: GithubReleaseQuery): Promise => { - const url = withQuery('/api/_github/releases', query as QueryObject) + const url = `/api/_github/releases/${encodeParams(query)}` return $fetch(url, { responseType: 'json' }) } const fetchLastRelease = (query: GithubRepositoryOptions): Promise => { - const url = withQuery('/api/_github/releases', { ...query, last: 'true' } as QueryObject) + const url = `/api/_github/releases/${encodeParams({ ...query, last: true })}` return $fetch(url, { responseType: 'json' }) } const fetchReleases = (query: GithubReleasesQuery): Promise => { - const url = withQuery('/api/_github/releases', query as QueryObject) + const url = `/api/_github/releases/${encodeParams(query)}` return $fetch(url, { responseType: 'json' }) } const fetchContributors = (query: GithubContributorsQuery): Promise => { - const url = withQuery('/api/_github/contributors', query as QueryObject) + const url = `/api/_github/contributors/${encodeParams(query)}` return $fetch(url, { responseType: 'json' }) } const fetchFileContributors = (query: GithubContributorsQuery): Promise => { - const url = withQuery('/api/_github/contributors/file', query as QueryObject) + const url = `/api/_github/contributors/file/${encodeParams(query)}` return $fetch(url, { responseType: 'json' }) } const fetchReadme = (query: GithubRepositoryOptions): Promise => { - const url = withQuery('/api/_github/readme', query as QueryObject) + const url = `/api/_github/readme/${encodeParams(query)}` return $fetch(url, { responseType: 'json' }) } @@ -47,3 +47,9 @@ export const useGithub = () => { fetchReadme } } + +function encodeParams (params: any) { + return Object.entries(params) + .map(([key, value]) => `${key}_${String(value)}`) + .join(',') +} diff --git a/src/runtime/server/api/contributors/file.ts b/src/runtime/server/api/contributors/file.ts index 91af1e7..bc288b9 100644 --- a/src/runtime/server/api/contributors/file.ts +++ b/src/runtime/server/api/contributors/file.ts @@ -1,6 +1,5 @@ -import { useQuery } from 'h3' import type { ModuleOptions } from '../../../../module' -import { fetchFileContributors, overrideConfig } from '../../utils/queries' +import { decodeParams, fetchFileContributors, overrideConfig } from '../../utils/queries' import { GithubContributorsQuery } from '../../../types' // @ts-ignore import * as imports from '#imports' @@ -19,9 +18,9 @@ if (process.env.NODE_ENV === 'development' || moduleConfig.disableCache) { } export default handler( - async ({ req }) => { + async (event) => { // Get query - const query = useQuery(req) as GithubContributorsQuery + const query = decodeParams(event.context.params.query) as GithubContributorsQuery // Merge query in module config const githubConfig = overrideConfig(moduleConfig, query) diff --git a/src/runtime/server/api/contributors/index.ts b/src/runtime/server/api/contributors/index.ts index 08cc990..45554e9 100644 --- a/src/runtime/server/api/contributors/index.ts +++ b/src/runtime/server/api/contributors/index.ts @@ -1,6 +1,5 @@ -import { useQuery } from 'h3' import type { ModuleOptions } from '../../../../module' -import { fetchRepositoryContributors, overrideConfig } from '../../utils/queries' +import { decodeParams, fetchRepositoryContributors, overrideConfig } from '../../utils/queries' import { GithubContributorsQuery } from '../../../types' // @ts-ignore import * as imports from '#imports' @@ -20,9 +19,9 @@ if (process.env.NODE_ENV === 'development' || moduleConfig.disableCache) { // eslint-disable-next-line import/namespace export default handler( - async ({ req }) => { + async (event) => { // Get query - const query = useQuery(req) as GithubContributorsQuery + const query = decodeParams(event.context.params.query) as GithubContributorsQuery // Merge query in module config const githubConfig = overrideConfig(moduleConfig, query) diff --git a/src/runtime/server/api/readme.ts b/src/runtime/server/api/readme.ts index 7d9c83b..81e0fc2 100644 --- a/src/runtime/server/api/readme.ts +++ b/src/runtime/server/api/readme.ts @@ -1,5 +1,4 @@ -import { useQuery } from 'h3' -import { overrideConfig, fetchReadme } from '../utils/queries' +import { overrideConfig, fetchReadme, decodeParams } from '../utils/queries' import type { ModuleOptions } from '../../../module' import { GithubRepositoryOptions, GithubRepositoryReadme } from '../../types' // @ts-ignore @@ -21,9 +20,9 @@ if (process.env.NODE_ENV === 'development' || moduleConfig.disableCache) { } export default handler( - async ({ req }) => { + async (event) => { // Get query - const query = useQuery(req) as GithubRepositoryOptions + const query = decodeParams(event.context.params.query) as GithubRepositoryOptions // Merge query in base config const githubConfig = overrideConfig(moduleConfig, query) diff --git a/src/runtime/server/api/releases/index.ts b/src/runtime/server/api/releases/index.ts index 102e588..9f9a15b 100644 --- a/src/runtime/server/api/releases/index.ts +++ b/src/runtime/server/api/releases/index.ts @@ -1,5 +1,4 @@ -import { useQuery } from 'h3' -import { fetchReleases, overrideConfig, parseRelease } from '../../utils/queries' +import { decodeParams, fetchReleases, overrideConfig, parseRelease } from '../../utils/queries' import type { ModuleOptions } from '../../../../module' import { GithubRawRelease, GithubReleasesQuery } from '../../../types' // @ts-ignore @@ -19,9 +18,9 @@ if (process.env.NODE_ENV === 'development' || moduleConfig.disableCache) { } export default handler( - async ({ req }) => { + async (event) => { // Get query - const query = useQuery(req) as GithubReleasesQuery + const query = decodeParams(event.context.params.query) as GithubReleasesQuery // Merge query in base config const githubConfig = overrideConfig(moduleConfig, query) diff --git a/src/runtime/server/api/repository.ts b/src/runtime/server/api/repository.ts index 368dd70..69e0273 100644 --- a/src/runtime/server/api/repository.ts +++ b/src/runtime/server/api/repository.ts @@ -1,5 +1,4 @@ -import { useQuery } from 'h3' -import { fetchRepository, overrideConfig } from '../utils/queries' +import { decodeParams, fetchRepository, overrideConfig } from '../utils/queries' import { ModuleOptions } from '../../../module' import { GithubRepository, GithubRepositoryOptions } from '../../types' // @ts-ignore @@ -20,9 +19,9 @@ if (process.env.NODE_ENV === 'development' || moduleConfig.disableCache) { // eslint-disable-next-line import/namespace export default handler( - async ({ req }) => { + async (event) => { // Get query - const query = useQuery(req) as GithubRepositoryOptions + const query = decodeParams(event.context.params.query) as GithubRepositoryOptions // Merge query in module config const githubConfig = overrideConfig(moduleConfig, query) diff --git a/src/runtime/server/utils/queries.ts b/src/runtime/server/utils/queries.ts index 664d74c..e261c7f 100644 --- a/src/runtime/server/utils/queries.ts +++ b/src/runtime/server/utils/queries.ts @@ -1,5 +1,6 @@ import { joinURL, withQuery, QueryObject } from 'ufo' import { graphql } from '@octokit/graphql' +import remarkGithub from 'remark-github' import { defu } from 'defu' import type { ModuleOptions @@ -8,6 +9,15 @@ import { GithubRawRelease, GithubRepositoryOptions, GithubRawContributor, Github // @ts-ignore import { parseContent } from '#content/server' +export function decodeParams (params: string = '') { + const result = {} + for (const param of params.split(',')) { + const [key, ...value] = param.split('_') + result[key] = value.join('_') + } + return result +} + function isBot (user) { return user.login.includes('[bot]') || user.login.includes('-bot') || user.login.includes('.bot') } @@ -68,6 +78,7 @@ export const parseRelease = async (release: GithubRawRelease, githubConfig: Gith markdown: { remarkPlugins: { 'remark-github': { + instance: remarkGithub, repository: `${githubConfig.owner}/${githubConfig.repo}` } }