| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- import type { TuiPluginApi, TuiRouteDefinition } from "@opencode-ai/plugin/tui"
- import { createSignal } from "solid-js"
- type RouteEntry = {
- key: symbol
- render: TuiRouteDefinition["render"]
- }
- export type RouteMap = Map<string, RouteEntry[]>
- export function createPluginRoutes() {
- const routes: RouteMap = new Map()
- const [revision, setRevision] = createSignal(0)
- return {
- register(list: TuiRouteDefinition[]) {
- const key = Symbol()
- list.forEach((item) => routes.set(item.name, [...(routes.get(item.name) ?? []), { key, render: item.render }]))
- setRevision((value) => value + 1)
- return () => {
- list.forEach((item) => {
- const next = routes.get(item.name)?.filter((entry) => entry.key !== key) ?? []
- if (next.length) {
- routes.set(item.name, next)
- return
- }
- routes.delete(item.name)
- })
- setRevision((value) => value + 1)
- }
- },
- get(name: string) {
- revision()
- return routes.get(name)?.at(-1)?.render
- },
- }
- }
- export type PluginRoutes = ReturnType<typeof createPluginRoutes>
- export function createTuiApi(input: Omit<TuiPluginApi, "lifecycle">): TuiPluginApi {
- return {
- ...input,
- lifecycle: {
- signal: new AbortController().signal,
- onDispose() {
- return () => {}
- },
- },
- }
- }
|