Skip to content

Commit f05625c

Browse files
committed
feat: allow selecting repo
1 parent 54c1c85 commit f05625c

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

app/app.vue

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
<script setup lang="ts">
22
import hexRgb from 'hex-rgb'
33
4-
const { data: clusters, refresh, status } = useFetch('/api/clusters/nuxt/nuxt', {
4+
import { allowedRepos } from '~~/shared/repos'
5+
6+
const repo = ref('nuxt/nuxt')
7+
8+
const { data: clusters, refresh, status } = useFetch(() => `/api/clusters/${repo.value}`, {
59
server: false,
610
immediate: import.meta.client && !('startViewTransition' in document),
711
default: () => [],
@@ -13,8 +17,8 @@ onMounted(async () => {
1317
const promise = new Promise<void>((resolve) => {
1418
finishTransition = resolve
1519
})
16-
watch(clusters, () => document.startViewTransition(() => promise), { flush: 'pre', once: true })
17-
watch(clusters, () => nextTick(finishTransition), { flush: 'post', once: true })
20+
watch(clusters, () => document.startViewTransition(() => promise), { flush: 'pre' })
21+
watch(clusters, () => nextTick(finishTransition), { flush: 'post' })
1822
refresh()
1923
}
2024
})
@@ -32,7 +36,6 @@ function labelColors(color: string) {
3236
const stateColors: Record<string, string> = {
3337
open: 'text-green-500',
3438
closed: 'text-purple-500',
35-
merged: 'text-purple-500',
3639
}
3740
3841
const openState = reactive<Record<string, boolean>>({})
@@ -51,7 +54,7 @@ async function updateSearch() {}
5154
</p>
5255
</nav>
5356
<p class="flex gap-2 items-center">
54-
nuxt/nuxt
57+
{{ repo }}
5558
<button
5659
class="rounded-full w-7 h-7 flex place-items-center border-solid border border-gray-700 bg-transparent color-gray-400 py-2 hover:color-gray-200 active:color-white focus:color-gray-200 hover:border-gray-400 active:border-white focus:border-gray-400 transition-colors"
5760
:class="{ 'animate-spin opacity-50 pointer-events-none': status === 'pending' || status === 'idle' }"
@@ -66,7 +69,6 @@ async function updateSearch() {}
6669
</button>
6770
</p>
6871
<form
69-
v-if="false"
7072
class="border-solid border border-gray-600 rounded-md flex flex-row items-center relative"
7173
disabled
7274
@submit.prevent="updateSearch"
@@ -79,18 +81,29 @@ async function updateSearch() {}
7981
>
8082
include closed issues
8183
</label> -->
82-
<input
84+
<!-- <input
8385
type="text"
8486
class="bg-transparent pl-8 pr-2 py-2 color-white border-0 flex-grow"
8587
placeholder="repository"
88+
> -->
89+
<select
90+
v-model="repo"
91+
class="pl-8 bg-transparent pr-2 py-2 color-white border-0 w-full"
8692
>
93+
<option
94+
v-for="repo in allowedRepos"
95+
:key="repo"
96+
>
97+
{{ repo }}
98+
</option>
99+
</select>
87100
<Icon
88101
size="large"
89102
class="absolute ml-2 text-gray-400"
90103
name="tabler-search"
91104
/>
92105
</form>
93-
<template v-if="status === 'idle'">
106+
<template v-if="status === 'idle' || status === 'pending'">
94107
<section
95108
v-for="i in 7"
96109
:key="i"

server/api/clusters/[...repo].ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { clusterEmbeddings } from '../../utils/cluster'
22
import { getEmbeddingsForIssue } from '../../utils/embeddings'
33

4-
const linkedRepos: Record<string, string[]> = {
4+
import { isAllowedRepo, type AllowedRepo } from '~~/shared/repos'
5+
6+
const linkedRepos: Record<string, AllowedRepo[]> = {
57
'danielroe/beasties': ['GoogleChromeLabs/critters'],
68
'nitrojs/nitro': ['unjs/h3', 'unjs/c12', 'unjs/unenv', 'unjs/ofetch'],
7-
// 'nuxt/nuxt': ['vuejs/core', 'vitejs/vite', 'nitrojs/nitro'],
9+
'vitejs/vite': ['rollup/rollup'],
10+
'nuxt/nuxt': ['nitrojs/nitro'],
811
}
912

10-
const allowedRepos = ['nuxt/nuxt', 'vuejs/core', 'vitejs/vite', 'nitrojs/nitro', 'danielroe/beasties', 'unjs/h3', 'unjs/c12', 'unjs/unenv', 'unjs/ofetch']
11-
1213
export default defineCachedEventHandler(async (event) => {
1314
const [owner, repo] = getRouterParam(event, 'repo')?.split('/') || []
1415
if (!owner || !repo) {
@@ -20,7 +21,7 @@ export default defineCachedEventHandler(async (event) => {
2021

2122
const source = `${owner}/${repo}`
2223

23-
if (!allowedRepos.includes(source)) {
24+
if (!isAllowedRepo(source)) {
2425
throw createError({
2526
status: 400,
2627
message: 'Repository not allowed',

server/api/issues/[...repo].ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { Octokit } from '@octokit/rest'
22

33
import { getLabels, type Issue } from '../../utils/github'
4+
import { isAllowedRepo } from '~~/shared/repos'
45

56
const labelsToExclude = ['documentation', 'invalid', 'enhancement']
67
const knownBots = new Set(['renovate', 'renovate[bot]'])
78

8-
const allowedRepos = ['nuxt/nuxt', 'vuejs/core', 'vitejs/vite', 'nitrojs/nitro', 'danielroe/beasties', 'unjs/h3', 'unjs/c12', 'unjs/unenv', 'unjs/ofetch']
9-
109
export default defineCachedEventHandler(async (event) => {
1110
const [owner, repo] = getRouterParam(event, 'repo')?.split('/') || []
1211
if (!owner || !repo) {
@@ -16,7 +15,7 @@ export default defineCachedEventHandler(async (event) => {
1615
})
1716
}
1817

19-
if (!allowedRepos.includes(`${owner}/${repo}`)) {
18+
if (!isAllowedRepo(`${owner}/${repo}`)) {
2019
throw createError({
2120
status: 400,
2221
message: 'Repository not allowed',

shared/repos.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const allowedRepos = ['nuxt/nuxt', 'vuejs/core', 'vitejs/vite', 'nitrojs/nitro', 'danielroe/beasties', 'unjs/h3', 'unjs/c12', 'unjs/unenv', 'unjs/ofetch', 'rollup/rollup', 'GoogleChromeLabs/critters'] as const
2+
3+
export type AllowedRepo = typeof allowedRepos[number]
4+
5+
export function isAllowedRepo(repo: string): repo is AllowedRepo {
6+
return allowedRepos.includes(repo as AllowedRepo)
7+
}

0 commit comments

Comments
 (0)