api.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import type { TuiPluginApi, TuiRouteDefinition } from "@opencode-ai/plugin/tui"
  2. import { createSignal } from "solid-js"
  3. type RouteEntry = {
  4. key: symbol
  5. render: TuiRouteDefinition["render"]
  6. }
  7. export type RouteMap = Map<string, RouteEntry[]>
  8. export function createPluginRoutes() {
  9. const routes: RouteMap = new Map()
  10. const [revision, setRevision] = createSignal(0)
  11. return {
  12. register(list: TuiRouteDefinition[]) {
  13. const key = Symbol()
  14. list.forEach((item) => routes.set(item.name, [...(routes.get(item.name) ?? []), { key, render: item.render }]))
  15. setRevision((value) => value + 1)
  16. return () => {
  17. list.forEach((item) => {
  18. const next = routes.get(item.name)?.filter((entry) => entry.key !== key) ?? []
  19. if (next.length) {
  20. routes.set(item.name, next)
  21. return
  22. }
  23. routes.delete(item.name)
  24. })
  25. setRevision((value) => value + 1)
  26. }
  27. },
  28. get(name: string) {
  29. revision()
  30. return routes.get(name)?.at(-1)?.render
  31. },
  32. }
  33. }
  34. export type PluginRoutes = ReturnType<typeof createPluginRoutes>
  35. export function createTuiApi(input: Omit<TuiPluginApi, "lifecycle">): TuiPluginApi {
  36. return {
  37. ...input,
  38. lifecycle: {
  39. signal: new AbortController().signal,
  40. onDispose() {
  41. return () => {}
  42. },
  43. },
  44. }
  45. }